我输入malloc的结果吗?
在这个问题上,有人在评论,我不应该投的结果提出malloc
,即
int *sieve = malloc(sizeof(int) * length);
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
为什么会这样呢?
不 ; 你不会投出结果,因为:
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
的类型, sieve
可以让您不必担心更改表达式的右侧。
正如人们指出的那样,演员阵容不好。 特别指针转换。
你投,这是因为:
type *
与type **
时混淆的例子。 #include
一个合适的头文件会错过树林 。 这与“不要担心你没有让编译器抱怨没有看到原型 - 这个令人讨厌的stdlib.h是真正重要的事情要记住!”。 malloc()
错误在有演员时被抓得快得多。 与断言一样,可以揭示意图的注释可以减少错误。 上一篇: Do I cast the result of malloc?
下一篇: Difference between