在下面的代码中,当我在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)
答案 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;
这也将解决您的显示问题。