我想我已经在下面的代码中正确实现了指针。但它会导致分段错误。有人可以解释原因吗?
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;
}
}
答案 0 :(得分: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;
}
...
否则更改不会超出功能范围。
答案 1 :(得分:2)
如果你只是调用add一次,这段代码不应该是段错误的,但是我假设你调用其他函数并传递仍然是NULL
的列表,你应该发送指向列表的指针而不是
void add(struct list **l,int index)
{
if(*l==NULL) {
*l=(struct list *) malloc(sizeof(struct list));
}
}
否则在添加返回时它仍然是NULL
,因为您只初始化指针的副本,或者如果这让您感到困惑,您只需初始化main()
中的列表并避免{{1}中的初始化}}