单链表C程序中的分段错误

时间:2014-06-06 05:06:26

标签: c pointers linked-list segmentation-fault

在下面的代码中,当我在main中注释掉第一次和第二次调用display()函数时,它工作正常。但是没有评论,在添加第二个元素之后它会说 - 分段错误

我是指针的新手。请建议可能出现的问题。

#include<stdio.h>
#include<malloc.h>
//-------------------------------------------------
struct node
{
int data;
struct node *next;
}*start=NULL;
//------------------------------------------------------------

void creat()
{

  struct node *new_node,*current;

  new_node=(struct node *)malloc(sizeof(struct node));

  printf("\nEnter the data : ");
  scanf("%d",&new_node->data);
  new_node->next=NULL;

  if(start==NULL)
  {
  start=new_node;
  current=new_node;
  }
  else
  {
  current->next=new_node;
  current=new_node;
  }
}
//------------------------------------------------------------------
void display()
{
struct node *new_node;
 printf("\nThe Linked List : ");
 new_node=start;
 while(new_node!=NULL)
   {
   printf("%d--->",new_node->data);
   new_node=new_node->next;
   }
  printf("NULL\n\n");
}
//----------------------------------------------------
void main()
{
creat();
display();
creat();
display();
creat();
display();
}

输出 - &gt;

 $./a.out

Enter the data : 4

The Linked List : 4--->NULL


Enter the data : 6
Segmentation fault (core dumped)

3 个答案:

答案 0 :(得分:2)

这是因为else块中的current->next=new_node;而发生的。 当您输入数据时,第二次start被声明为全局,因此它的值在函数调用之间保持不变,但是当current在函数内声明时,它的范围仅限于函数。 因此,当您第二次输入数据current为空时,访问current->next会导致分段错误 因此,在current变量之后声明start节点。

答案 1 :(得分:1)

第二次拨打creat时,您使用的是未初始化的current

current_node是具有自动存储功能的本地变量。从函数返回时,它将被删除。

尝试添加

struct node* current = NULL;

在您定义start之后。然后,将其从creat中删除。

答案 2 :(得分:0)

违规代码是:

       current->next=new_node;

您正在取消引用非法的NUll指针。 你应该做的是将current声明为全局变量:

struct node
{
int data;
struct node *next;
}*start=NULL,*current=NULL;

这也将解决您的显示问题。