2014-03-06 231 views
0

seg故障再次!請參閱本和指正結構和指針在C

typedef struct entry_s 
{ 
    int key; 
    int value; 
    struct entry_s *next1; 
} entry_t; 

entry_t *next2; 
next2=malloc(sizeof(entry_t)); 
next2->key=key; // this is giving seg fault now... 

感謝

+5

你爲'next2'分配了'malloc'的內存嗎? – pzaenger

+2

如果你已經在它之前爲next2分配了內存,就不會出錯 – mangusta

+0

請記住,在C中,如果你創建了一個像你的情況那樣的指針entry_t * next2; next2將在內存中被賦予一個地方來存儲entry_t類型的變量的地址。您需要按照上述註釋中的其他人的說法來處理它,或者爲您創建的結構分配一個地址。沒有做任何事情你會得到意想不到的結果 –

回答

2

sizeof(entry_t *)給你4個字節,它只是指針的大小。您需要將您的malloc聲明改成這樣:malloc的添加以下語句

next2=malloc(sizeof(entry_t));

後。

memset(next2, 0x00, sizeof(entry_t)) 

現在您不會收到段錯誤。

+1

是的'malloc'修正:清除結構通常是一個好主意 - 但是在清除它之後,無論如何都不需要測試'next2-> next1' ... – Roddy

+0

是的Roddy我同意你的看法。由於代碼不完整,我認爲它們之間可能存在代碼。所以給它清理結構總是很好的。糾正我如果我錯了 –

+0

@Kranthi庫馬爾:你不能說它總是*一個好主意。有時調零可能是冗餘的,有時也很昂貴。 – jacekmigacz

2

這就像寫錯,因爲沒有什麼next2指定一個有效的指針值,所以你不能去引用它:它不指向有效的entry_t

如果你有一些初始化,如:

const entry_t *next2 = get_entry_with_key(4711); 
if(next2 != NULL) 
{ 
    printf("got an entry with %d", next2->key); 
    if(next2->next != NULL) 
    printf(" and the next one has %d\n", next2->next1->key); 
} 

那麼這將是完美的罰款。

1

變化:

next2=malloc(sizeof(entry_t *)); 

next2=malloc(sizeof(entry_t)); 
0

的alloction大小是錯誤的: 的sizeof(entry_t *)是一個指針的TEH大小,ponted值的不大小(結構)。 當您訪問結構的next1字段時,您正在讀取已分配位置之後的數據。

我會推薦使用慣用的指針初始化形式:

next2=malloc(sizeof(*next2)); 

它允許改變尖型,而不對分配表的影響:

你也應該測試NEXT2指針右擊後檢查如果分配運作良好。

另外,您正在測試尚未初始化的值(next2-> next1)。分配後,該字段的值是不可預知的。 這裏最有可能的是next1指針應該被初始化爲NULL,因爲沒有內存被分配來存儲其他「struct entry_s」。