在这个问题上,有人在一篇评论中建议我不要对malloc的结果进行投票。i、 例如,我应该这样做:
int*sieve=malloc(sizeof(int)*长度);
而不是:
int*sieve=(int*)malloc(sizeof(int)*长度);
为什么会这样
TL;博士
int*sieve=(int*)malloc(sizeof(int)*长度);
有两个问题。强制转换和您正在使用类型而不是变量作为sizeof的参数。相反,要这样做:
int*sieve=malloc(sizeof*sieve*length);
长版本
否;您不投出结果,因为:
- 这是不必要的,因为在这种情况下,
void*
会自动安全地升级为任何其他指针类型 - 它会给代码增加混乱,强制转换不容易读取(特别是指针类型很长时)
- 它让你重复你自己,这通常是不好的
- 如果您忘记包含
,它可能会隐藏错误<;stdlib.h>。这可能会导致崩溃(或者,更糟糕的是,不会导致崩溃,直到稍后代码的某个完全不同的部分)。考虑指针和整数大小不同会发生什么情况;然后,您通过强制执行来隐藏警告,可能会丢失您返回的地址中的一些内容。注意:从C99开始,隐式函数不再使用C,这一点不再相关,因为没有自动假设未声明的函数返回
int
作为澄清,请注意,我说;你不投;,不是";您不需要来施展";。在我看来,即使你做对了,也不能包括演员。这样做没有任何好处,但是一系列潜在的风险,包括演员阵容,表明你不知道这些风险
正如注释者指出的,上面提到的是直C,而不是C++。我非常相信C和C++是独立的语言。
为了进一步添加,代码不必要地重复类型信息(int
),这可能会导致错误。最好将用于存储返回值的指针反引用到";锁;两者结合在一起:
int*sieve=malloc(长度*sizeof*sieve);
这也会将长度
移到前面以增加可见性,并删除带有sizeof
的多余括号;只有当参数是类型名时才需要它们。许多人似乎不知道(或忽略)这一点,这使得他们的代码更加冗长。请记住:sizeof
不是一个函数!:)
在一些罕见的情况下,向前移动length
可能会增加可见性,但还应注意,在一般情况下,最好将表达式写成:
int*sieve=malloc(sizeof*sieve*length);
由于首先保持sizeof
,因此在这种情况下,可以确保至少使用size\t
数学进行乘法
比较:malloc(sizeof*sieve*length*width)
vs