c-分段故障-无法理解故障的原因



我不明白这里分段错误的原因。代码为:

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已经是一个指针。

相关内容

  • 没有找到相关文章

最新更新