2017-07-06 129 views
0

這是我的代碼。我以爲我會在b2->x.pointer1->data上獲得SegFault,因爲我沒有malloc,b2->x.pointer1。任何人都可以給我一些解釋嗎?在執行memcpy時,哪些值被複制到b2->x.pointer1?還有關於struct *b2特別是由memcpy填寫的簿記,它是如何保存其成員的記錄的?我的動機是要知道如何b2->x.pointer1堆積如山。使用memcpy填充結構

struct A 
{ 
    int data; 
}; 


struct B 
{ 
    int data; 
    union X 
    { 
     struct A *pointer1; 
     //another 
    }x; 
}; 


int main(int argc, char **argv) 
{ 

    struct B *b1 = (struct B*) malloc(sizeof(struct B)); 
    b1->data = 100; 
    b1->x.pointer1 = (struct A*) malloc(sizeof(struct A)); 
    b1->x.pointer1->data = 1; 

    struct B *b2 = (struct B*) malloc(sizeof(struct B)); 
    //b2->x.pointer1 = (struct A*) malloc(sizeof(struct A)); 

    memcpy(b2, b1, sizeof(struct B)); 

    printf("%d", b2->x.pointer1->data); 

    return 0; 
} 

那該怎麼辦free(b1)?它會釋放b1->x.pointer1嗎?還是會在這裏出現內存泄漏?

+1

[請參閱此討論,爲什麼不在C ..中使用malloc()和family的返回值](https:// stackoverflow。com/q/605845/2173917) –

+0

@SouravGhosh感謝您的鏈接。但是我受到編譯器的限制。它會報告錯誤,如果我不從malloc()中返回。 – WhiteSword

+3

....因爲您正在使用[tag:C++]編譯器來編譯[tag:c]代碼... – LPs

回答

3

free函數不知道任何有關正在釋放的內存的內容。

換句話說,free(b1)將簡單地釋放內存b1指向,導致內存泄漏,因爲b1->x.pointer1尚未釋放,無法再訪問。

您需要自由b1->x.pointer1明確之前釋放b1

用於釋放正確的順序:

free(b1->x.pointer1); 
free(b1); 
free(b2); 

經驗法則是:已被malloc需要明確地分配一切與free被釋放。

關於b2:在memcpy後的*b2內容完全相同*b1內容,因此b2->x.pointer1指向完全相同位置爲b1->x.pointer1,因此free(b2->x.pointer1);不能做一次free(b1->x.pointer1);一直完成。釋放兩次相同的內存會導致未定義的行爲(很可能是崩潰)。

1

除了邁克爾·瓦爾茲的答案...

可有人請給我一些解釋呢?

memcpy執行指定字節數的逐位拷貝。這就是爲什麼你不要段錯誤。如果你下去查看內存,你會發現b2中的位與b1完全相同。

在執行memcpy時,哪些值被複制到b2-> x.pointer1?

複製的數據與您複製的來源(本例中爲b1)相同。對於計算機,b1b2只是兩個具有相同位模式的不同位置。