0

我想我已经在下面的代码中正确地实现了指针。但它会导致分段错误。有人可以解释为什么吗?

struct list
{
    int index;
    struct list *next;
};
void add(struct list *l,int index)
{
    struct list *temp=l;
    if(l==NULL)
    {
        temp=(struct list *)malloc(sizeof(struct list));
        temp->index=index;
        temp->next=NULL;
        l=temp;
    }
    else
    {
        while(temp->next!=NULL)
        temp=temp->next;
        struct list *nnode=(struct list *)malloc(sizeof(struct list));
        nnode->index=index;
        nnode->next=NULL;
        temp->next=nnode;
    }
}

main()
{
        struct list *l;
        l=NULL;
        int el;
        scanf("%d",&el);
        add(l,el);
        while(l->next!=NULL)    //It causes seg fault
        {
            printf(" %d ",l->index);
            l=l->next;
        }
}
4

2 回答 2

3

这段代码没有做你认为它做的事情:

void add(struct list *l,int index)
{
    struct list *temp=l;
    if(l==NULL)
    {
        temp=(struct list *)malloc(sizeof(struct list));
        temp->index=index;
        temp->next=NULL;
        l=temp;
    }
...

参数 l 不会改变,因为你只是将它作为指针传递,为了改变 l 指向的内容,你需要传递 l 的地址

void add(struct list **l,int index)
{
    struct list *temp;
    if(*l==NULL)
    {
        temp=(struct list *)malloc(sizeof(struct list));
        temp->index=index;
        temp->next=NULL;
        *l=temp;
    }
...

否则更改将不会超出功能范围。

于 2012-11-18T07:57:53.963 回答
2

如果您只调用一次 add ,则此代码不应出现段错误,但我假设您调用其他函数并传递仍然存在的列表,NULL您应该发送指向该列表的指针的指针

void add(struct list **l,int index)
{
    if(*l==NULL) {
        *l=(struct list *) malloc(sizeof(struct list));
    }
}

否则它仍然会NULL在 add 返回时,因为您只初始化指针的副本,或者如果这使您感到困惑,您可以初始化列表main()并避免初始化add()

于 2012-11-18T07:50:12.613 回答