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

标签 c malloc casting

this question ,有人在 comment 中建议我不应该转换malloc的结果。即,我应该这样做:

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

而不是:

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

为什么会出现这种情况?

最佳答案

TL;DR

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

有两个问题。强制转换以及您使用类型而不是变量作为 sizeof 的参数。相反,这样做:

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

长版

;您转换结果,因为:

  • 这是不必要的,如 void *在这种情况下会自动安全地提升为任何其他指针类型。
  • 它使代码变得困惑,强制转换不太容易阅读(特别是当指针类型很长时)。
  • 这会让您重复自己的话,这通常是不好的。
  • 如果您忘记包含<stdlib.h>,它可以隐藏错误。这可能会导致崩溃(或者更糟糕的是,直到稍后在代码的某个完全不同的部分才导致崩溃)。考虑一下如果指针和整数的大小不同会发生什么;那么您就通过强制转换隐藏了警告,并且可能会丢失返回地址的部分内容。注意:从 C99 开始,隐式函数已从 C 中消失,这一点不再相关,因为没有自动假设未声明的函数返回 int .

作为澄清,请注意我说的是“你不转换”,而不是“你不需要转换”。在我看来,即使你做对了,将 Actor 阵容纳入其中也是失败的。这样做根本没有任何好处,反而有很多潜在的风险,包括 Actor 阵容都表明你不知道这些风险。

还请注意,正如评论者指出的那样,上面讨论的是直接 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 * widthwidthlengthsize_t 更小的类型.

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

相关文章:

c - 在自定义 malloc 中附加调试 header

c - 未打印指针字符串的第一个字符

c - 将用户输入值分配给分配的内存

c - 在 malloc 中进行类型转换

c - MPI初始化错误

c - 2 次 scanf 到指针后出现段错误

c - 是否有一个标准的 C 函数来获取 Double 变量的绝对值

c - printf ("%c"的含义,**++argv);?

rust - 类型转换和转换

c++ - 虚函数和static_cast