建议我不应该将结果转换为malloc. 即,我应该这样做:
malloc
int *sieve = malloc(sizeof(int) * length);
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
为什么会这样?
有两个问题。强制转换并且您使用类型而不是变量作为 sizeof 的参数。相反,这样做:
int *sieve = malloc(sizeof *sieve * length);
没有;你不投射结果,因为:
void *
<stdlib.h>
int
作为澄清,请注意我说“你不施放”,而不是“你不需要施放”。在我看来,即使你做对了,加入演员阵容也是失败的。这样做根本没有好处,但是有一堆潜在的风险,包括演员表表明你不知道这些风险。
另请注意,正如评论员所指出的那样,上面讨论的是纯 C,而不是 C。我非常坚信 C 和 C 是独立的语言。
要进一步补充,您的代码会不必要地重复int可能导致错误的类型信息 ( )。最好取消引用用于存储返回值的指针,将两者“锁定”在一起:
int *sieve = malloc(length * sizeof *sieve);
这也将 移到length前面以增加可见性,并用sizeof;删除多余的括号。仅当参数是类型名称时才需要它们。许多人似乎不知道(或忽略)这一点,这使得他们的代码更加冗长。记住:sizeof不是函数!:)
length
sizeof
虽然在极少数情况下移到length前面可能会增加可见度,但还应注意,在一般情况下,最好将表达式写为:
由于在这种情况下保留第sizeof一个,确保乘法至少通过size_t数学完成。
size_t
比较:malloc(sizeof *sieve * length * width)与malloc(length * width * sizeof *sieve)第二个相比,可能会溢出length * widthwhenwidth并且length是比 . 更小的类型size_t。
malloc(sizeof *sieve * length * width)
malloc(length * width * sizeof *sieve)
length * width
width