一尘不染

我要转换 malloc 的结果吗?

c

建议我不应该结果转换为malloc. 即,我应该这样做:

int *sieve = malloc(sizeof(int) * length);

而不是:

int *sieve = (int *) malloc(sizeof(int) * length);

为什么会这样?


阅读 308

收藏
2022-01-29

共1个答案

一尘不染

int *sieve = (int *) malloc(sizeof(int) * length);

有两个问题。强制转换并且您使用类型而不是变量作为 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 * widthwhenwidth并且length是比 . 更小的类型size_t

2022-01-29