【问题标题】:What is the difference between these two lines?这两条线有什么区别?
【发布时间】:2017-04-06 13:52:31
【问题描述】:
struct node *tempNode = (struct node*) malloc(sizeof(struct node));

//and

struct node *tempNode = malloc(sizeof(struct node));

【问题讨论】:

  • (struct node*) 在 malloc 返回 void 指针时消除编译器错误。
  • @Ultimater 在 C 中不会有任何警告。见stackoverflow.com/questions/605845/…
  • 第一个在C中被认为是不好的做法;自 C90 标准以来,您不需要显式转换 malloc 的返回值,并且根据该标准,这样做可能会抑制有用的诊断。还有一个更好的写法是struct node *tempNode = malloc( sizeof *tempNode );
  • 这里的问题标题应该重新表述为Do I cast the result of malloc,不是吗?但很明显它是重复的,我认为应该这样关闭。

标签: c struct malloc sizeof dynamic-memory-allocation


【解决方案1】:
struct node *tempNode = (struct node*) malloc(sizeof(struct node));

您正在为节点指针 tempNode 动态分配空间并将其类型转换为 struct node* 类型。 (指向结构的指针)

struct node *tempNode = malloc(sizeof(struct node));

与上面相同,除了没有显式类型转换(结构节点*)

【讨论】:

    【解决方案2】:

    没有区别。由于malloc 返回类型void *,因此可以将其分配给任何指针类型的变量而无需强制转换。正如 John Bode 所提到的,强制转换 malloc 的结果被认为是不好的做法,因为它可能会掩盖由 malloc 的其他定义导致的编译器错误。

    【讨论】:

      【解决方案3】:

      由于您正确地投射它,因此两者之间没有区别。

      但是在 C 中这种转换通常不受欢迎,因为 void* 可以隐式转换为任何其他(数据)指针类型。

      另请参阅此 C 常见问题解答条目:What's wrong with casting malloc's return value?

      还有一个第三个​​

      struct node *tempNode = malloc(sizeof *tempNode);
      

      这样更好,因为在类型发生变化的情况下它可以减少变化。

      【讨论】:

      • 第一句话不是和链接里说的矛盾吗?
      • @EugeneSh。我为所有其他相关点添加了链接精确。如果您在谈论“忘记包含..”,则它不是有效的 C 程序(不再允许使用隐式 int)。无论如何,任何体面的编译器都会为此发出警告。我没有看到 OP 的完整代码。所以,我认为 OP 确实包含它。据我所知,如果你的吹毛求疵程度不高,可能会有#define malloc NULL
      • 假设第一个被否决的评论者是 Post hoc ergo propter hoc。这不是吹毛求疵。投射malloc 的结果是众所周知的“不可以”。
      • @EugeneSh。它。 (尽管我在答案中说过,将其链接到 C FAQ 解释相同)。我应该编辑以将“皱眉”改为“不可以”吗?
      • 我的第一条评论与您回答的第一句话有关,可以理解为对其余部分的总结。你可以保留这个答案,这取决于你,我保证我不会拒绝它。但正如你所看到的,有些人会这样做。
      【解决方案4】:

      通过调用malloc,分配的内存大小为struct node(以字节为单位)。它将void* 返回到分配的内存。

      现在的问题是:你的两行代码完全相同,但第二行代码在使用 C++ 编译器编译时会导致警告。

      C 允许将 void* 隐式转换为不同的指针类型,而 C++ 编译器会 - 至少 - 警告您,或者给您一个错误。

      【讨论】:

      • 这不是 C++ 问题,也不是 java、C#、B*f 等问题。
      • @WeatherVane 那么你的意思是什么?在 C 中显然没有区别,但提问者很可能想知道这一点,C++ 与 C 的关系比其他任何东西都多。
      • 很抱歉,C++ 不在讨论范围内,无论您认为它有多“相关”。在 C 语言中,如果您认为“显然没有区别”,那么您还没有阅读过 link already posted。我很想DV,但给了你收回答案的机会。
      • 是的,我读到了;不管你投不投,它仍然对代码的运行没有任何影响。
      • 不,但它对编译器有影响。
      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 2011-04-06
      • 2017-02-02
      • 1970-01-01
      相关资源
      最近更新 更多