【问题标题】:Malloc syntax in CC 中的 Malloc 语法
【发布时间】:2013-03-11 07:42:58
【问题描述】:

在书中我读到 malloc 的语法是 malloc(sizeof(int)) 但在一个双向链表程序中我看到以下内容:

newnode=(struct node *)malloc(sizeof(struct node))

(struct node*) 在这里做什么?整个代码在做什么?顺便说一句,程序中结构的代码如下。

struct node
{
char line[80];
struct node *next,*prev;
};

struct node *start=NULL,*temp,*temp1,*temp2,*newnode;

谢谢

【问题讨论】:

    标签: c list struct linked-list malloc


    【解决方案1】:

    代码动态地将pointer 创建为struct node 的单一类型。在大多数版本的 C 中,不需要 (struct node *) 演员表,有些人认为不应该使用它。如果您删除演员表,它将是void*,可用于任何类型。

    因此:

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

    大致相当于:

    newnode = malloc(sizeof(struct node));
    

    见:Specifically, what's dangerous about casting the result of malloc?

    注意 1:如果你使用 Visual Studio 编写你的 C 代码,如果你不转换 malloc 的结果,它会给你红色下划线。但是,代码仍然会编译。

    注意 2:在 C++ 代码中使用 malloc 需要您转换结果,如示例中所示。

    【讨论】:

    • 这里的共识似乎没有这样做,但我认为重要的是要提到 很多 书籍推荐它 - 包括“C 编程语言”本身。
    • @teppic 正确。甚至在几个 StackOverflow 问题上,关于这个主题的争论也很多。就我个人而言,我认为对 malloc 回归的仇恨有点言过其实。
    • 谢谢@Inisheer ..这正是我想知道的! :)
    • @Inisheer 这并不过分。如果您没有包含正确的标头,那么您将强制转换编译器假定返回intstruct node* 的函数。有效地隐藏错误。那条线上不应该有演员表。其次,这个问题被标记为C,C++ 所做的与这里无关。第三,编译器(或 IDE)中的错误不是使用错误代码的理由。
    • @Wiz 你是对的。但我认为对选角的总体厌恶程度有点过分。但这是我的看法。其次,虽然问题被标记为 C,但我从问题的内容中假设 OP 是 C 程序员新手,如果他/她使用 Visual Studio 或看到 malloc 在 C++ 代码中转换,则可以从有关 C++ 的注释中受益将来。实际上,我试图直接回答这个问题,但也提供未来可能的指导。
    【解决方案2】:

    您遇到了一个非常糟糕的代码。 C 程序员从不投射malloc() 的结果。不仅不需要,而且can be harmful

    【讨论】:

    【解决方案3】:

    您应该传递您希望malloc 分配的字节数作为参数。这就是为什么在此代码示例中您使用sizeof(struct node) 告诉C 分配结构节点变量所需的字节数。顺便说一下,像这段代码中显示的那样转换结果是个坏主意。

    【讨论】:

      【解决方案4】:

      malloc 返回一个空指针。

      (struct node*) 进行从 void 指针到目标指针类型的显式转换

      【讨论】:

        【解决方案5】:

        "malloc" 返回一个空指针。 (struct node *) 将 malloc 的结果类型转换为“节点结构指针”,这(毫无疑问)就是“newnode”。

        【讨论】:

          猜你喜欢
          • 2012-01-19
          • 2015-04-23
          • 1970-01-01
          • 1970-01-01
          • 2011-03-09
          • 2012-01-28
          • 2012-09-12
          • 1970-01-01
          • 2011-12-04
          相关资源
          最近更新 更多