这是一个简单的程序,它从用户那里获取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("%d\n",temp->num);
temp=temp->next;
}
}
答案 0 :(得分:3)
下面
temp=p; // p is NULL!!
for(i=0;i<5;i++)
{
printf("%d\n",temp->num); // <-- BANG!
temp=temp->next;
}
您将temp
重新分配为先前声明为NULL的p
。因此,您将取消引用NULL指针。查看代码,您可能甚至不需要p
只是用来在最开始时将temp
初始化为NULL。
答案 1 :(得分:2)
主函数的一个简单改变就是全部,问题是temp = p = NULL然后在printf中将null指向num(“%d \ n”,temp-&gt; 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("%d\n",temp->num);
temp=temp->next;
}
}
答案 2 :(得分:1)
你有:
struct node *p,*temp,*r;
p=NULL;
后续代码从不将p
设置为非空值。然后使用:
temp=p;
for(i=0;i<5;i++)
{
printf("%d\n",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()
来电;两者都可能失败。