不你没有投出结果,因为:
void *
会自动安全地提升为任何其他指针类型。 <stdlib.h>
它可以隐藏错误。这可能会导致崩溃(或更糟的是, 不导致崩溃,直到方式在后面的代码的一些完全不同的部分)。考虑如果指针和整数的大小不同会发生什么; 然后你通过强制转换隐藏了一个警告,可能会丢失你返回的地址。注意:从 C11 开始,隐式函数从 C 中消失,并且这一点不再相关,因为没有自动假设未声明的函数返回int
。 作为澄清,请注意我说 “你不投”,而不是 “你不需要投”。在我看来,即使你做对了也没有包括演员。这样做没有任何好处,但是一堆潜在的风险,包括演员表明你不知道风险。
还要注意,正如评论员指出的那样,上面谈到的是直 C,而不是 C ++。我非常坚信 C 和 C ++ 是不同的语言。
要进一步添加,您的代码会不必要地重复可能导致错误的类型信息( int
)。最好取消引用用于存储返回值的指针,将两者 “锁定” 在一起:
int *sieve = malloc(length * sizeof *sieve);
这也将length
移到前面以增加可见性,并使用sizeof
删除多余的括号; 只有在参数是类型名称时才需要它们。许多人似乎不知道(或忽略)这一点,这使得他们的代码更加冗长。请记住: sizeof
不是函数! :)
虽然在某些极少数情况下向前移动length
可能会增加可见性,但是在一般情况下,应该注意将表达式编写为:
int *sieve = malloc(sizeof *sieve * length);
由于首先保持sizeof
,在这种情况下,确保乘法至少使用size_t
数学。
比较: malloc(sizeof *sieve * length * width)
与malloc(length * width * sizeof *sieve)
当width
和length
小于size_t
时,第二个可能会溢出length * width
。
在 C 中,您不需要转换malloc
的返回值。 malloc
返回的 void 指针自动转换为正确的类型。但是,如果您希望使用 C ++ 编译器编译代码,则需要进行强制转换。社区中的首选替代方案是使用以下内容:
int *sieve = malloc(sizeof *sieve * length);
如果您改变sieve
的类型,这使您不必担心改变表达式的右侧。
人们已经指出,演员阵容很糟糕。特别是指针转换。
你做演员,因为:
type *
与type **
的 SO 示例。 #include
一个合适的头文件的想法错过了树的森林 。这就像说 “不要担心你没有要求编译器抱怨没有看到原型这一事实 - 那令人讨厌的 stdlib.h 是真正重要的事情要记住!” malloc()
错误会被捕获得更快。与断言一样,显示意图的注释可以减少错误。