2014-09-18 79 views
0

有誰知道第三行「Free(array)」的作用?這裏的數組只是數組第一個元素的地址(換句話說,指向int *右數組中第一個元素的指針)?爲什麼我們需要第三行來釋放2D數組的「列」?我基本記住/瞭解a是一個指向____的地址。這個短語是否正確?動態分配2維數組

例如:int ** a; int * b; int c; b = & c = 4; a =&b;這是正確的嗎?謝謝!!!

此外,一般來說,雙指針基本上是動態分配的數組嗎? 「最後,當需要釋放其中一個動態分配的多維數組時,我們必須記住釋放我們分配的每個內存塊(只需釋放頂層指針,陣列,不會削減它,如果我們這樣做,所有的二級指針將丟失,但沒有釋放,而且會浪費內存),下面的代碼可能是什麼樣子:」 http://www.eskimo.com/~scs/cclass/int/sx9b.html

for(i = 0; i < nrows; i++) 
    free(array[i]); 
free(array); 
+0

此外,當您使用printf(「%s」,數組)時,其中數組是char *,編譯器將該數組看作數組[0]的地址,但將其正確地打印出來?我只是好奇,如果我理解正確。 – 2014-09-18 20:21:03

回答

2

爲什麼我們需要第三行來釋放二維數組的「列」?

解除分配的數量應該與分配的數量相匹配。

如果你看一下代碼在文檔的開頭:

int **array; 
array = malloc(nrows * sizeof(int *)); 
for(i = 0; i < nrows; i++) { 
    array[i] = malloc(ncolumns * sizeof(int)); 
} 

,你會看到有一個malloc()用於陣列本身和一個malloc()的每一行。

釋放它的代碼基本上是相反的。

另外,一般來說,雙指針基本上是動態分配的數組吧?

不一定。動態分配數組是雙指針的一種用法,但它遠非唯一的用途。

0

調用malloc在堆上分配內存,等於它的參數指定的字節數,並返回此塊內存的地址。你的'2D數組'實際上是一個1D的int地址數組,每個數組都指向由malloc分配的一塊內存。完成後,您需要釋放這些塊,以供其他人使用。但是你的一維數組實際上只是另一個malloc'd內存來容納這些malloc'd地址,並且這也需要被釋放。

此外,當您使用printf(「%s」,array)其中array是一個char *時,編譯器將該數組看作array [0]的地址,但將其正確地打印出來?我只是好奇,如果我理解正確。

是的,%s告訴printf轉到你給它的任何地址(char的地址,也就是char *,比方說),然後開始讀取並顯示該地址的內存中的任何內容,直到找到'空字符'的時間。所以在字符串的情況下,這是預期的行爲,因爲字符串只是一個字符數組,後跟'\ 0'字符。