2012-06-07 84 views
2

我有鏈接列表問題。我有兩種結構:C中的鏈接列表分段錯誤

struct ekstra 
{ 
    char isim[256]; 
    int deger; 
    struct ekstra *sonra; 
}; 

struct node 
{ 
    char name[256]; 
    int val; 
    struct ekstra *next;  
}; 

,我有這些:

struct ekstra *tmp; 
struct node dizi[12]; 

某處在我的代碼有

tmp = dizi[k].next; 
tmp=tmp->sonra; 

,如果我這樣做:

tmp = malloc(sizeof(struct ekstra)); 

沒有問題。

但是,如果我這樣做:

dizi[k].next->sonra = malloc(sizeof(struct ekstra)); 

,我收到了段錯誤。這是爲什麼發生?

+1

你最好在調試器的幫助下運行代碼。在Linux上,valgrind很適合指出分段錯誤。另外,在Windows上,Visual Studio調試器非常有用。 – Tom

+4

也許你錯用了數組索引'k'。請發佈完整的代碼 –

+4

@GeorgeGaál請不要要求完整的代碼,但更完整的代碼可以重現該問題。 – Drise

回答

3

這條線:

dizi[k].next->sonra = malloc(sizeof(struct ekstra)); 

被提領

dizi[k].next 

我懷疑有一個垃圾值。

0

這兩條線:

tmp = dizi[k].next; 
tmp = tmp->sonra; 

可能無效的指針複製到tmp。當您使用malloc()指定tmp時,來自malloc()的有效指針將覆蓋tmp中已有的無效值。

當你使用:

dizi[k].next->sonra = malloc(sizeof(struct ekstra)); 

你引用的無效的指針(以評估在sonra件存儲地址),並導致該段錯誤。

如果你寫道:

*tmp = 0; 

,你可能會得到一個分段錯誤了。