我不明白这里分段错误的原因。代码为:
struct node {
int data;
struct node* next;
};
void add(int a,struct node *lista)
{
struct node *p;
p=(struct node*)malloc(sizeof(struct node*));
p->data=a;
p->next=NULL;
while(lista->next!=NULL) <--- The segmentation fault is here.
lista=lista->next;
lista->next=p;
return lista;
}
int main(void)
{
struct node *list=NULL;
list_print(list);
list=node123();
list_print(list);
add(7, &list);
list_print(list);
return 0;
}
添加功能将一个新的节点添加到列表的末尾,在朋友的电脑和设置中效果非常好。我有分段错误。我认为问题出在lista->next
表达式上,但我不明白为什么。有什么想法吗?
void add(int a,struct node *lista)
。。。第二个参数是结构节点指针。
struct node *list=NULL;
-list是一个结构节点指针。
add(7, &list);
-&list是一个结构节点**;这是不正确的,可能会导致add()的`while(lista->next!=NULL)取消引用失败。
p = (struct node*)malloc(sizeof(struct node*));
这当然是错误的。您不能分配大小与指针本身一样的内存,而是分配大小与实际结构一样大的内存。使用
p = malloc(sizeof(struct node));
或甚至更好
p = malloc(sizeof(*p));
不要因为上帝的爱而铸造malloc()的返回值
此外,您将list
声明为struct node *
,而add()
函数也需要struct node *
,因此将其地址传递给该函数是错误的。代替
add(7, &list);
写入
add(7, list);
您正在传递list的地址,但函数只需要一个指针,为了通过引用传递'list',您必须将add的declaration更改为:
void add(int a,struct node **lista);
然后使用(*lista)而不仅仅是"list"。例如:(*lista)->下一个。。。
您声明"add"不返回任何类型的数据(void)。但您返回的是"list"。或者使函数在指向"list"的指针上工作(将**list作为参数,而不是*list)。或者使其返回列表类型:struct-list*add(
1-在下一个之前,您必须检查lista是否为null
2-malloc中存在错误:p=(struct node*)malloc(sizeof(struct node));
要分配的大小是node
的大小,您分配的是指针struct node*
的大小。
3-add(7 , lista)
而不是add(7 , &lista)
,因为lista已经是一个指针。