C语言 打印链表时出现分段错误



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

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

  1. p重命名为 roothead 以指示其作为列表开头的重要作用。
  2. 将指向列表第一个元素的指针分配给新重命名的变量。

例如,代替:

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

使用(不重命名):

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

或:

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

此外,您应该对malloc()scanf()调用进行错误检查;两者都可能失败。

相关内容

  • 没有找到相关文章

最新更新