我输入malloc的结果吗?

在这个问题上,有人在评论,我应该投的结果提出malloc ,即

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

而不是:

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

为什么会这样呢?


; 你不会投出结果,因为:

  • 这是没有必要的,因为在这种情况下void *被自动且安全地提升为任何其他指针类型。
  • 它给代码增加了混乱,转换不太容易阅读(特别是如果指针类型很长)。
  • 它让你重复自己,这通常是不好的。
  • 如果您忘记包含<stdlib.h>它可以隐藏错误。 这会导致崩溃(或者更糟糕的是,直到稍后在代码的某个完全不同的部分中才会导致崩溃)。 考虑如果指针和整数大小不同,会发生什么情况; 那么你通过投射隐藏了一个警告,并可能会丢失你返回的地址。 注意:从C11开始,隐式函数从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)widthlength小于size_t时,第二个可能会溢出length * width


    在C中,你不需要施加malloc的返回值。 由malloc返回的void指针自动转换为正确的类型。 但是,如果您希望使用C ++编译器编译代码,则需要进行强制转换。 社区中的首选替代方案是使用以下内容:

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

    如果您更改sieve的类型, sieve可以让您不必担心更改表达式的右侧。

    正如人们指出的那样,演员阵容不好。 特别指针转换。


    投,这是因为:

  • 它使得你的代码更易于在C和C ++之间移植 ,正如SO经验显示的那样,许多程序员声称当他们真正使用C ++(或C +本地编译器扩展)编写时,他们正在使用C编写代码。
  • 如果不这样做, 可能会隐藏一个错误 :记下所有编写type *type **时混淆的例子。
  • 它让你不能注意到你没有#include一个合适的头文件会错过树林 。 这与“不要担心你没有让编译器抱怨没有看到原型 - 这个令人讨厌的stdlib.h是真正重要的事情要记住!”。
  • 它强制进行额外的认知交叉检查 。 它将(所谓的)期望类型放在您为该变量的原始大小进行的算术旁边。 我敢打赌,你可以做一个SO研究,表明malloc()错误在有演员时被抓得快得多。 与断言一样,可以揭示意图的注释可以减少错误。
  • 以机器可以检查的方式重复自己往往是一个主意。 事实上,这就是一个断言,这种使用是一个断言。 自从Turing在多年前提出这个想法以来,断言仍然是我们获得代码正确性的最通用技术。
  • 链接地址: http://www.djcxy.com/p/739.html

    上一篇: Do I cast the result of malloc?

    下一篇: Difference between