2014-06-06 36 views
1

在下面的代碼中,當我註釋掉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) 

回答

2

這是因爲在else塊中的current->next=new_node;而發生的。 當你第二次輸入數據時,start被聲明爲全局的,所以它的值在函數調用之間保持不變,但由於在函數中聲明瞭current,所以它的作用域僅限於函數。 因此,當您第二次輸入數據時current爲空,因此訪問current->next會導致分段錯誤。
因此聲明current節點後start變量。

+0

是的。謝謝。雖然解決了這個問題,但我的查詢是,如果我將前兩個調用註釋到display(),並讓最後一個調用display()保持原樣,那麼它可以正常工作。如果所有三個要顯示的調用均未被註釋,則會出現此錯誤。任何想法爲什麼? – User42

+2

@ User42你不會喜歡這個答案。它的發生是因爲激活記錄和本地變量內存在您的平臺上進行連續調用時會「解析」先前的局部變量,因爲沒有其他調用可能會覆蓋它們。它是絕對不可靠的,非常特定於平臺的,完全不標準的,並且沒有問題的未定義的行爲,但是我敢打賭,如果你調試成沒有中間調用的連續調用'creat',你會看到一美元。 *還要別的嗎*。 – WhozCraig

+1

@ User42最簡單的UB示例,我可以舉例說明我上面描述的內容。請注意每個本地變量的地址[**在此示例**中](http://ideone.com/ElfhsD)。祝你好運。 – WhozCraig

1

第二次,您使用的是ininitialized current

current_node是一個帶有自動存儲的局部變量。從函數返回時,它將被刪除。

嘗試增加

struct node* current = NULL; 

定義start之後。然後,從creat中刪除它。

0

有問題的代碼是:

 current->next=new_node; 

您提領一空指針這是違法的。 什麼,你應該做的就是宣佈當前爲全局變量,以及:

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

這將解決您的顯示問題爲好。