下面是一个简单的代码,我试图使用指针指针将节点添加到链表。
#include <stdio.h>
#include <malloc.h>
struct node
{
int data;
struct node *next;
};
void insert(struct node **root)
{
struct node * temp = (struct node *)malloc(sizeof(struct node));
if(*root == NULL)
{
*(root) = (struct node *) malloc (sizeof(struct node ));
*(root)->data = 5;
*(root)->next = temp;
}
else
printf("here");
}
int main()
{
struct node *root = NULL;
insert(&root);
return 0;
}
我的理解是,在main()中,一个块被分配给root
。在insert
中,该内存块的地址在参数中传递。然后它检查它们是否是分配给该地址结构的任何内存块,如果它是NULL,则将内存分配给结构块。这应该由*root
引用。但是当我执行上面的代码时,我得到以下错误:
error: request for member 'data' in something not a structure or union
我无法理解我到底出错的地方。
答案 0 :(得分:3)
->
比解除引用运算符(*
)绑定得更紧密。见operator precedence。所以,
*(root)->data = 5;
相当于:
*(root->data) = 5;
你打算做的是:
(*root)->data = 5;
下一行相同,应为:
(*root)->next = temp;
另请注意,malloc.h
不可移植。您应该包含C标准标题stdlib.h>
,以获取malloc()
的原型。
答案 1 :(得分:1)
->
运算符的优先级高于解除引用运算符*
。有关完整列表,请参阅here。
所以像
*(root)->data = 5;
将是非法的,因为首先它试图在data
指向的某个地方找到一个字段root
,显然无法找到它,因为它也是指针类型。
相反,您应该使用显式优先级:
(*root)->data = 5;