2011-10-05 20 views
0

嘗試malloc一些內存時出現奇怪的錯誤。我有一個指向「malloced」結構的指針,我想要另一個結構體。所以我再次調用malloc,malloc返回的指針指向一個空的空間 - 到目前爲止沒關係。然後我memset分配的區域和memset覆蓋另一個仍在使用的變量。 內存中的第一個結構在0x1643c98中,給出的第二個指針是0x1643bf8,但是我想malloc 200字節。代碼:Cygwin malloc覆蓋堆中的另一個內存

data_t *data = get_head_data(); 
int length = data->head.length; 
data_t *new_data = malloc(length); 
memset(new_data, 0x00, length); // this line override the perivously malloced data 
//some other operation 

我使用窗口xp(32位)和cygwin,與gcc 3.4.4。處理器是英特爾酷睿2雙核處理器。 任何想法什麼是錯的或應該是什麼問題? 在此先感謝。

編輯:對不起,我是一個完全錯誤的軌道。有一個錯誤的功能,這是免費的意外。當我稍後調用malloc時,以前的地址在內存中,我認爲它是有效的,但它是免費的()。 謝謝你的所有建議!

+4

請修改您的代碼或發佈更多內容:我們不知道該memset調用中的結果是什麼。 – Mat

+0

memset中的結果參數和new_data指針應該是相同的指針嗎? – thiton

+0

是的,對不起,我打錯了。 – hcpeter

回答

1

如果您需要將新分配的內存設置爲0,請使用calloc。您可能會混淆指針,大小和變量 - 請再次檢查您的代碼。

1

data_t *new_data = malloc(length);

除非sizeof(data_t)爲1,即線很可能是一個錯誤。您正在分配length字節。如果你想要一個lengthdata_t的數組,那麼你需要分配sizeof(data_t)*length字節。

更好的解決方案是使用calloc,正如@littleadv所示。該函數爲number_of_items和sizeof_item分別提供參數,因此很難出錯。