在this question ,有人在 comment 中建议我应该不转换malloc
的结果。即,我应该这样做:
int *sieve = malloc(sizeof(*sieve) * length);
而不是:
int *sieve = (int *) malloc(sizeof(*sieve) * length);
为什么会这样?
最佳答案
长话短说
int *sieve = (int *) malloc(sizeof(int) * length);
有两个问题。 Actor 和你使用类型而不是变量作为 sizeof 的参数。相反,这样做:
int *sieve = malloc(sizeof *sieve * length);
长版
否;您不转换结果,因为:
- 没有必要,因为
void *
在这种情况下会自动安全地提升为任何其他指针类型。 - 它增加了代码的困惑,强制转换不是很容易阅读(尤其是当指针类型很长时)。
- 这会让您重复自己的话,这通常很糟糕。
- 如果您忘记包含
<stdlib.h>
,它可以隐藏错误.这可能会导致崩溃(或者,更糟的是,直到稍后在代码的某些完全不同的部分才会导致崩溃)。考虑一下如果指针和整数的大小不同会发生什么;那么您将通过转换隐藏警告,并且可能会丢失您返回的地址的一部分。注意:从 C99 开始,隐式函数从 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)
第二个可能会溢出 length * width
什么时候width
和 length
是小于 size_t
的类型.
关于c - 我是否转换 malloc 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/605845/