簡體   English   中英

關於 free 函數和內存分配的問題 (C)

[英]Question about free function and memory allocation ( C )

我試圖理解 C 中的指針和內存分配。所以我有這些 C 代碼行:

int *a=0; // a pointer which points to 0
a = (int*)malloc(5*sizeof(int));  // now the pointers a points to the adress of our allocated memory, right ?
if (a == 0) 
{
   fprintf(stderr, "Error\n");
   exit(EXIT_FAILURE);
}
printf("The value of a is %p\n", a); // this is the adress of our allocated memory
a=readArray(5); // a function which reads and array // What happens here? I read an array in that memory which I allocated, right ?
printf("Now the value of a is: %p\n", a); // Now the adress is the adress of first array element, right?
if (a != 0)
{
   free(a);
   a=0;
}

這個程序的輸出是:

The value of a is 0x7ff780c03160
Now the value of a is: 0x7ff780c03180

現在我需要選擇一個關於 free 函數調用的答案。

1. Deallocates the both allocated memory zones.
2. Deallocates the memory starting at adress 0x7ff780c03180 and fill that zone with zeros.
3. Deallocates the memory starting at adress 0x7ff780c03180
4. Deallocates the memory starting at adress 0x7ff780c03160

從我讀到的關於 free 函數的內容來看,它會釋放整個內存,建議用 0 初始化指針。所以我認為答案是第一個變體,1。我對嗎?

readArray無法訪問aa不是全局變量,也不是傳遞給readArray ),這意味着readArray必須分配一個新數組並返回它。 然后將此數組分配給a ,在此過程中丟失對原始malloc ed 數組的引用。

free調用應用於從0x7ff780c03180開始的新數組,從而得到正確答案 #3。

不, free()只會釋放由傳遞給它的指針給出的內存塊。 所以這將釋放從地址 0x7ff780c03180 開始的內存,並且地址 0x7ff780c03160 處的內存將被泄漏。

答案是3

隨着行a=readArray(5); 您正在丟失前一個指針(在您的示例中為 160)。 你不能再free這個內存,所以你有內存泄漏。 ==> 14不能是正確答案。

free不會用零填充內存, a=0也僅將指針變量設置為0 ,但對內存沒有任何作用 ==> 2不是正確答案。

不, free不會釋放比傳遞給它的已分配指針更多的分配。 您列表中的正確答案是 3。 free將在那個時間點釋放a指向的內存,就是這樣。 它不會用零或其他任何東西填充該內存區域。

此外,當您readArray(5) ,您會創建分配新內存並保留之前分配的舊內存。 所以你正在做的一步一步:

  1. 使用malloc分配一些內存(我們稱之為X )並將其地址存儲在變量a
  2. 調用readArray它將分配一些其他內存(我們稱之為Y )並將其地址存儲在a
  3. 釋放存儲在a的內存,這是Y分配的內存塊。

現在標記為X的內存將處於懸空狀態,這意味着您沒有任何對它的引用,也無法釋放它。 它只是分配的內存,無法再訪問,因為您丟失了指向它的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM