我不明白这里的分段错误的原因。 代码是:
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
表达式,但我不明白为什么。有什么想法吗?
答案 0 :(得分:2)
void add(int a,struct node *lista)
...第二个参数是结构节点指针。
struct node *list=NULL;
- list是结构节点指针。
add(7, &list);
- &amp; list是结构节点**;这是不正确的,可能导致add()的`while(list-&gt; next!= NULL)无法解除引用。
答案 1 :(得分:1)
p = (struct node*)malloc(sizeof(struct node*));
这当然是错的。您不能分配大小为指针本身的内存,但必须与实际结构一样大。使用
p = malloc(sizeof(struct node));
或甚至更好
p = malloc(sizeof(*p));
<强> And don't for the love of God cast the return value of malloc(). 强>
另外,您将list
声明为struct node *
,而您的add()
函数也需要struct node *
- 因此传递其地址是错误的到功能。而不是
add(7, &list);
写
add(7, list);
答案 2 :(得分:0)
1 - 你必须在writhin lista-&gt; next
之前检查lista是否为空 2 - malloc中有错误:
p=(struct node*)malloc(sizeof(struct node));
要分配的大小是node
的大小,您分配了指针struct node*
的大小。
3 - add(7 , lista)
而非add(7 , &lista)
因为lista已经是指针。
答案 3 :(得分:0)
你正在传递列表的地址,但是函数只需要一个指针,为了通过引用传递'list',你必须将添加的判断变为:
void add(int a,struct node **lista);
然后使用(* lista)而不仅仅是'list'。例如:(* lista) - &gt; next ...
答案 4 :(得分:0)
您声明'add'不返回任何类型的数据(void)。但是你要回“'列表'了。要么使函数在指向'list'的指针上工作(将** list作为参数而不是* list)。或使其返回列表类型:struct list * add(