C语言中的Malloc语法

3

我读的书上说,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;

谢谢你

5个回答

5
代码动态创建一个指向单个类型的结构体节点的指针。在大多数版本的C中,不需要使用(struct node *)强制转换,有人认为不应该使用它。如果删除强制转换,则会得到一个void*,可用于任何类型。
newnode = (struct node*)malloc(sizeof(struct node));

大致相当于:

newnode = malloc(sizeof(struct node));

参见:具体来说,将malloc的结果强制转换有什么危险?

注意1:如果您使用Visual Studio编写C代码,则不将malloc的结果强制转换会导致红色下划线。但是,代码仍将编译。

注意2:在C++代码中使用malloc需要像示例中所示将其强制转换。


这里的共识似乎是不这样做,但我认为重要的是要提到很多书籍都推荐这样做,包括《C程序设计语言》本身。 - teppic
@teppic 正确。 在几个 StackOverflow 问题上,对这个主题进行了很多辩论。 就个人而言,我认为对于强制转换 malloc 返回值的厌恶有点过分夸大了。 - Inisheer
谢谢@Inisheer.. 这正是我想知道的!! :) - Shy Student
@Inisheer 这并不是夸大其词。如果您没有包含正确的头文件,那么您将会把编译器认为返回 int 的函数强制转换为 struct node*。这实际上隐藏了错误。在该行中不应该有任何转换。其次,该问题标记为 C,因此 C++ 在这里无关紧要。第三,编译器(或 IDE)中的错误不是使用糟糕代码的理由。 - Wiz
@Wiz 你说得对。但我认为人们对强制类型转换的厌恶程度有点过了。但这只是我的观点。其次,虽然问题标记为C,但从问题内容来看,我假设OP是一个初学者C程序员,并且在将来使用Visual Studio或在C++代码中看到malloc被强制转换时可以从C++笔记中受益。实际上,我试图直接回答问题,同时也提供可能的未来指导。 - Inisheer
底线:在C和C++中,比强制转换malloc返回值还要糟糕的“错误”有很多,真的很多。 - Inisheer

3

您遇到了一个非常糟糕的代码。C程序员从不转换malloc()的结果。不仅不需要,而且可能会有害


这是一个高度可讨论的问题,因为你可能会遇到相似的问题,可以看这里:https://www.securecoding.cert.org/confluence/display/seccode/MEM02-C.+Immediately+cast+the+result+of+a+memory+allocation+function+call+into+a+pointer+to+the+allocated+type。 - Argeman

2

在调用malloc函数时,你需要将想要分配的字节数作为参数传递。因此,在这个代码示例中,你使用了sizeof(struct node)告诉C分配一个结构体变量所需的字节数。顺便说一下,像这个代码示例中展示的那样强制转换结果是不好的做法。


2

malloc返回一个void指针。

(struct node*)将void指针显式转换为目标指针类型。


1
"

“malloc”返回一个无类型指针。 (struct node *)将malloc的结果强制转换为“node结构指针”,这无疑是“newnode”的类型。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接