这是一个简单的程序,它从用户那里获取5个元素并打印出来。但它在第 30 行显示分段错误。请帮忙。这是我的代码。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int num;
struct node * next;
};
main()
{
int i;
struct node *p,*temp,*r;
p=NULL;
temp=p;
temp=malloc(sizeof(struct node));
scanf("%d",&(temp->num));
temp->next=NULL;
for(i=0;i<4;i++)
{
while(temp->next!=NULL)
temp=temp->next;
r=malloc(sizeof(struct node));
scanf("%d",&(r->num));
r->next=NULL;
temp->next=r;
}
temp=p;
for(i=0;i<5;i++)
{
printf("%dn",temp->num);
temp=temp->next;
}
}
这里
temp=p; // p is NULL!!
for(i=0;i<5;i++)
{
printf("%dn",temp->num); // <-- BANG!
temp=temp->next;
}
您正在将temp
重新分配为 p
,该以前声明为 NULL。因此,您正在取消引用 NULL 指针。查看您的代码,您可能甚至不需要p
就像您一样只用于在一开始将temp
初始化为 NULL。
主函数中的简单更改就是这样,问题是 temp=p=NULL 然后在 printf("%d",temp->num) 中将 null 指向 num;
所以你的主要应该是这样的
main()
{
int i;
struct node *p,*temp,*r;
temp=malloc(sizeof(struct node));
p=temp;
scanf("%d",&(temp->num));
temp->next=NULL;
for(i=0;i<4;i++)
{
while(temp->next!=NULL)
temp=temp->next;
r=malloc(sizeof(struct node));
scanf("%d",&(r->num));
r->next=NULL;
temp->next=r;
}
temp=p;
for(i=0;i<5;i++)
{
printf("%dn",temp->num);
temp=temp->next;
}
}
你有:
struct node *p,*temp,*r;
p=NULL;
后续代码永远不会将p
设置为非 null 值。 然后使用:
temp=p;
for(i=0;i<5;i++)
{
printf("%dn",temp->num);
temp=temp->next;
}
所以你正在取消引用一个空指针。这会导致不快乐和崩溃。
- 将
p
重命名为root
或head
以指示其作为列表开头的重要作用。 - 将指向列表第一个元素的指针分配给新重命名的变量。
例如,代替:
temp=p;
temp=malloc(sizeof(struct node));
使用(不重命名):
p = temp = malloc(sizeof(struct node));
或:
p = temp = malloc(sizeof(*p));
此外,您应该对malloc()
和scanf()
调用进行错误检查;两者都可能失败。