-2

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

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表达,但我不明白为什么。有任何想法吗?

4

5 回答 5

2

void add(int a,struct node *lista)...第二个参数是一个结构节点指针。

struct node *list=NULL;-- list 是一个结构节点指针。

add(7, &list);-- &list 是一个结构节点 **; 这是不正确的,可能会导致 add() 的 `while(lista->next!=NULL) 取消引用失败。

于 2012-09-05T11:45:46.137 回答
1
p = (struct node*)malloc(sizeof(struct node*));

这当然是错误的。您不能分配大小与指针本身一样大的内存,而应与实际结构一样大。利用

p = malloc(sizeof(struct node));

甚至更好

p = malloc(sizeof(*p));

并且不要为了上帝的爱而将 malloc() 的返回值转换。

此外,您声明liststruct node *,并且您的add()函数还需要struct node *- 因此将其地址传递给函数是错误的。代替

add(7, &list);

add(7, list);
于 2012-09-05T11:45:58.667 回答
0

您声明“添加”不返回任何类型的数据(无效)。但是您要返回“列表”。要么使函数在指向“list”指针的指针上工作(将 **list 作为参数而不是 *list)。或者让它返回一个列表类型: struct list* add(

于 2012-09-05T11:50:36.163 回答
0

您正在传递列表的地址,但函数只需要一个指针,为了通过引用传递“列表”,您必须更改添加到的声明:

void add(int a,struct node **lista);

然后使用 (*lista) 而不是 'list' 。例如: (*lista)-> 下一个 ...

于 2012-09-05T11:47:27.757 回答
0

1 - 您必须在 writhin lista->next 之前检查 lista 是否不为空

2 - malloc 中有错误: p=(struct node*)malloc(sizeof(struct node));

要分配的大小是 a 的大小node,您分配的是指针的大小struct node*

3 -add(7 , lista)不是add(7 , &lista)因为 lista 已经是一个指针。

于 2012-09-05T11:46:03.277 回答