2015-10-16 50 views
1

說我有一個指針數組包含字符串每所以對於這樣的結構:C - 釋放指針數組是否也釋放它們指向的內容?

printf("%s\n", array[0]); 

輸出是:

Hello. 

如果我執行free(array)將這種自由是什麼array[0]是指向? ("Hello.")。

我花了幾個小時試圖手動釋放每個元素,我得到的所有是崩潰。我希望這是一個快捷方式:/

+7

答案是否定的。你需要'釋放'你的'malloc'。 –

+0

'calloc'在崩潰中起作用嗎?我沒有使用'malloc',只有'calloc'。 – Laefica

+2

至於你的崩潰,首先在調試器中運行以捕獲它們,並嘗試瞭解它們在代碼中發生的位置,然後嘗試找出它們發生的原因。如果你仍然無法弄清楚,那麼回到這裏並且詢問一個關於它的(新的)問題(並且包括一個[最小,完整和可驗證示例](http://stackoverflow.com/help/) mcve),其中包括指出發生崩潰的位置)。 –

回答

7

這一切都取決於如何分配數組。我給的例子:

實施例1:

char array[10]; 
free(array);  // nope! 

實施例2:

char *array; 
array= malloc(10); // request heap for memory 
free(array);   // return to Heap when no longer needed 

實施例3:

char **array; 
array= malloc(10*sizeof(char *)); 
for (int i=0; i<10; i++) { 
    array[i]= malloc(10); 
} 
free(array);  // nope. You should do: 

for (int i=0; i<10; i++) { 
    free(array[i]); 
} 
free(array); 

廣告。示例1:數組在堆棧上分配(「自動變量」),不能通過free發佈。

Ad。示例2:使用malloc從堆請求存儲。不再需要時,使用free將其返回堆。

Ad。例3:你聲明瞭一個指向字符的指針數組。首先爲陣列分配存儲空間,然後爲每個數組元素分配存儲空間以放置字符串。不再需要時,必須首先釋放字符串(使用free),然後釋放陣列本身(使用free)。

4

如果我執行一個免費的(數組)將這個免費什麼array [0]指向 ? (「你好。」)。

不,他們不會自動釋放,但取決於您如何分配每個人,可能沒有必要實際釋放它們。如果指向由malloc和類似分配函數返回的內存,則只需要釋放它們即可。

假設你有一個指針數組,字符串array

char * array[2]; 
array[0] = "Some text"; // You would not need to free this 
array[1] = malloc(LENGTH); // This one you would have to free 

注意在這種情況下,你不需要釋放array本身。只有索引爲1的元素。

+0

在什麼情況下我可以跳過釋放它們? – Laefica

+0

@Laefica Ofcourse not。你將需要「免費」分配你的東西。 – ameyCU

2

你只需要免費手動使用malloc()。所以不行,根據指針它可能不會,甚至可能沒有必要。