c - 我是否转换 malloc 的结果?

标签 c malloc casting

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什么时候widthlength是小于 size_t 的类型.

关于c - 我是否转换 malloc 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48643853/

相关文章:

c 中的客户端/服务器套接字

c - 如何在 C 中对 int* 指针使用 free 函数

c - 利用金丝雀保护来利用缓冲区溢出

c - Malloc block 内容

C 在结构中释放多维数组似乎不正确

rust - FFI:将可空指针转换为选项

Azure 流分析将 int64 输出为 int32

c++ - 什么是双关语,它的目的是什么?

c - 在数组中查找重复元素,不起作用

c - 我如何在 C 中使指向数据数组的指针起作用?