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...
感謝
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...
感謝
sizeof(entry_t *)給你4個字節,它只是指針的大小。您需要將您的malloc聲明改成這樣:malloc的添加以下語句
next2=malloc(sizeof(entry_t));
後。
memset(next2, 0x00, sizeof(entry_t))
現在您不會收到段錯誤。
是的'malloc'修正:清除結構通常是一個好主意 - 但是在清除它之後,無論如何都不需要測試'next2-> next1' ... – Roddy
是的Roddy我同意你的看法。由於代碼不完整,我認爲它們之間可能存在代碼。所以給它清理結構總是很好的。糾正我如果我錯了 –
@Kranthi庫馬爾:你不能說它總是*一個好主意。有時調零可能是冗餘的,有時也很昂貴。 – jacekmigacz
這就像寫錯,因爲沒有什麼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);
}
那麼這將是完美的罰款。
變化:
next2=malloc(sizeof(entry_t *));
到
next2=malloc(sizeof(entry_t));
的alloction大小是錯誤的: 的sizeof(entry_t *)是一個指針的TEH大小,ponted值的不大小(結構)。 當您訪問結構的next1字段時,您正在讀取已分配位置之後的數據。
我會推薦使用慣用的指針初始化形式:
next2=malloc(sizeof(*next2));
它允許改變尖型,而不對分配表的影響:
你也應該測試NEXT2指針右擊後檢查如果分配運作良好。
另外,您正在測試尚未初始化的值(next2-> next1)。分配後,該字段的值是不可預知的。 這裏最有可能的是next1指針應該被初始化爲NULL,因爲沒有內存被分配來存儲其他「struct entry_s」。
你爲'next2'分配了'malloc'的內存嗎? – pzaenger
如果你已經在它之前爲next2分配了內存,就不會出錯 – mangusta
請記住,在C中,如果你創建了一個像你的情況那樣的指針entry_t * next2; next2將在內存中被賦予一個地方來存儲entry_t類型的變量的地址。您需要按照上述註釋中的其他人的說法來處理它,或者爲您創建的結構分配一個地址。沒有做任何事情你會得到意想不到的結果 –