在书中,我读到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;
谢谢
代码动态地将pointer
创建为单一类型的struct node
。在大多数版本的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程序员从不强制转换malloc()
的结果。这不仅是不必要的,而且可能是有害的。
您应该将希望malloc
分配的字节数作为参数传递。这就是为什么在这个代码示例中使用sizeof(struct node)
告诉C
为struct节点变量分配所需的字节数。顺便说一下,像这段代码中所示的那样强制转换结果是一个坏主意。
malloc返回一个void指针。
(struct node*)执行从void指针到目标指针类型的显式转换
"malloc"返回一个空指针。(struct node *)是将malloc的结果类型转换为"节点结构指针",这(毫无疑问)就是"newnode"。