2011-04-22 28 views
1

我將嘗試使用下面的代碼放在一個名爲「持有人」結構到堆中,但我得到一個分段錯誤,當我嘗試使用memcpy:使用的memcpy到結構複製到堆

Holder hold; 
Holder *heapHold = memcpy(heapHold, &hold, sizeof(Holder)); 

爲什麼我會segfault?

回答

6
Holder hold; 

這聲明holdHolder類型的變量。 hold未初始化。

Holder *heapHold = memcpy(heapHold, &hold, sizeof(Holder)); 

memcpy(dest, source, size)size字節從sourcedest。它假定dest已正確分配。由於您不爲其分配內存,因此會出現段錯誤。

您需要分配內存:

Holder *heapHold = malloc(sizeof *heapHold); 
if (heapHold == NULL) { 
    /* failed to allocate, handle error here */ 
} else { 
    /* OK to copy. Make sure you initialize 'hold' to something valid */ 
    memcpy(heapHold, &hold, sizeof *heapHold); 
} 

此外,memcpy()返回第一個參數。將返回值分配給heapHold就像是說a = a;,即它沒有做任何事情。對於大多數實際情況,memcpy()的返回值將被忽略。

+0

這仍然假定首先將'Holcid'實例複製到'memcpy'是有效的。誠然,在C這是*通常*的情況下... – 2011-04-22 05:20:29

+0

@Karl,你可以給我一個例子,'&持有人'不能複製? – 2011-04-22 06:01:08

+2

包含指向其內部的指針或包含指向應該被深度複製的數據的指針的結構。 – 2011-04-27 17:01:52

2

您需要首先爲heapHold分配內存。目前memcpy正在寫入一些隨機地址(heapHold未初始化),導致崩潰。

Holder hold; 
Holder *heapHold = malloc(sizeof(Holder)); 
memcpy(heapHold, &hold, sizeof(Holder)); 
1
Holder hold; 
Holder *heapHold = malloc(sizeof(Holder)); 
memcpy(heapHold,&hold,sizeof(Holder)); 

memcpy(heapHold, &hold, sizeof(Holder));heapHold變量仍然未初始化(無緩衝被分配什麼那麼以往任何時候),所以它指向無效的內存。

BTW(我總是忘了提及) - 當您使用分配內存malloc,不要forget稍後釋放它..