在下面的代碼中,當我註釋掉main()中的第一個和第二個調用display()函數時,它工作正常。但沒有評論,添加第二個元素後它說 - 分段錯誤。單鏈表C程序中的分段錯誤
我是新手指針。請提出可能的錯誤。
#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();
}
輸出 - 你叫creat
>
$./a.out
Enter the data : 4
The Linked List : 4--->NULL
Enter the data : 6
Segmentation fault (core dumped)
是的。謝謝。雖然解決了這個問題,但我的查詢是,如果我將前兩個調用註釋到display(),並讓最後一個調用display()保持原樣,那麼它可以正常工作。如果所有三個要顯示的調用均未被註釋,則會出現此錯誤。任何想法爲什麼? – User42
@ User42你不會喜歡這個答案。它的發生是因爲激活記錄和本地變量內存在您的平臺上進行連續調用時會「解析」先前的局部變量,因爲沒有其他調用可能會覆蓋它們。它是絕對不可靠的,非常特定於平臺的,完全不標準的,並且沒有問題的未定義的行爲,但是我敢打賭,如果你調試成沒有中間調用的連續調用'creat',你會看到一美元。 *還要別的嗎*。 – WhozCraig
@ User42最簡單的UB示例,我可以舉例說明我上面描述的內容。請注意每個本地變量的地址[**在此示例**中](http://ideone.com/ElfhsD)。祝你好運。 – WhozCraig