我要投malloc的结果吗?

在这个问题上,有人在一篇评论中建议我不要对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&gt。这可能会导致崩溃(或者,更糟糕的是,不会导致崩溃,直到稍后代码的某个完全不同的部分)。考虑指针和整数大小不同会发生什么情况;然后,您通过强制执行来隐藏警告,可能会丢失您返回的地址中的一些内容。注意:从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

发表评论