打印链表时出现分段错误

时间:2013-12-22 15:38:52

标签: c linked-list segmentation-fault

这是一个简单的程序,它从用户那里获取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;
}

}

3 个答案:

答案 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;
}

所以你要取消引用一个空指针。这会导致不快乐和崩溃。

  1. p重命名为roothead,以表明其作为列表开头的重要角色。
  2. 将指向列表第一个元素的指针分配给新重命名的变量。
  3. 例如,而不是:

    temp=p;
    temp=malloc(sizeof(struct node));
    

    使用(不重命名):

    p = temp = malloc(sizeof(struct node));
    

    或:

    p = temp = malloc(sizeof(*p));
    

    此外,您应该错误检查malloc()scanf()来电;两者都可能失败。