3
多維數組

比方說,我們有:解放出來用C

void createMultiArray(){ 
    int i,j; 
    char*** codes = malloc(5 * sizeof(char**)); 
    for (i = 0; i <= 4; i++) { 
     codes[i] = malloc((i+1) * sizeof(char*)); 
     for (j = 0; j <= i; j++) { 
      codes[i][j] = malloc(2 * sizeof(char)); 
     } 
    } 

我應該如何釋放codes

free(codes); 

int i,j; 
for(i = 0; i <=4; i++){ 
    for(j = 0; j <= i; j++){ 
     free(codes[i][j]); 
    } 
    free(codes[i]); 
} 
free(codes); 
+6

第二個不會導致內存泄漏:)這是可取的。 – Constantinius 2011-12-22 13:16:39

+0

這是「可取的」,我們可以說「一個是正確的,另一個不是」;) – 2011-12-22 13:19:47

+0

這不是一個多維數組,你使用 – 2011-12-22 13:25:56

回答

6

想想這樣 - 你應該有一個freemalloc

// you're allocating memory for codes 
// must be freed with free(codes); 
char*** codes = malloc(5 * sizeof(char**)); 

for (i = 0; i <= 4; i++) { 

    // allocating memory for every element in codes 
    // must be freed with free(codes[i]); 
    codes[i] = malloc((i+1) * sizeof(char*)); 

    for (j = 0; j <= i; j++) { 

     // allocating memory for every element in every element in codes 
     // must be freed with free(codes[i][j]) 
     codes[i][j] = malloc(2 * sizeof(char)); 

    } 
} 

所以,是的,你的第二個選擇是正確的。

+2

+1作爲第一句。以相反的順序釋放分配也是一個好主意。特別是在這個多維問題中,如果你不這樣做,你會摧毀指針並泄漏。 – emsr 2011-12-22 13:30:24

3

第二個是你想要的,free不能也不能遞歸調用。每次當你做一個malloc想到你要打電話free的地方。

作爲便箋,不會釋放內存,如果接下來要做的事是退出程序 - 這是毫無意義的,可能需要相當長的時間。

3

第二個是正確的,而第一個泄漏內存。作爲一個經驗法則,您想每撥打malloc()致電free()

1

如果您可以事先計算數組的大小,最好不要使用嵌套的malloc() - s。你應該分配和釋放一步(讓你的生活更輕鬆,減少錯誤的機會)。

1

createMultiArray()內存佈局將如下所示:

  codes[i]  codes[i][j] 
***   **    *  
+-+   +-+   +-+-+ 
|0|-------->| |----------->| | | 
+-+   +-+   +-+-+ 
|1|-----+     | | 
+-+  | +-+    | | 
|2|  +-->| |    | +------------- char 
+-+   +-+    +--------------- char 
|3|   | + 
+-+   +-+ 
|4| 
+-+   ....   .... 

現在,回去你免費使用已經創建的每個內存免費[耶,每個malloc()應該有free()]

OTOH,你確定要這樣做嗎?

for (i = 0; i <= 4; i++) { 
    codes[i] = malloc((i+1) * sizeof(char*)); 
    .... 
} 

for i=0, malloc will create 1 memory cell 
for i=1, malloc will create 2 memory cell 
for i=2, malloc will create 3 memory cell 
for i=3, malloc will create 4 memory cell 
for i=4, malloc will create 5 memory cell 

這是故意的嗎?

+0

我做了'codes [i] = malloc((i + 1)* sizeof(char *));'因爲我在下一行做'for(j = 0; j <= i; j ++)'。不好嗎? – Psyclops 2011-12-22 13:39:36

+0

這很好!我只是好奇這是否是有意的! :) – 2011-12-22 13:45:53

0

不要使用這種複雜的分配方案來模擬多維數組。特別是在你的情況下,所有的邊界都是編譯時間常量。

char (*codes)[n][m] = malloc(sizeof(char[x][n][m])); 

滿足同樣的目的,只需要一個

free(codes); 

在末端。如果在您使用該數組的情況下,甚至綁定到一個範圍,你的範圍很小,你甚至可以直接將它分配爲auto變量,甚至在同一時間

char codes[23][2][5] = { { { 'a', 'b'} } }; 

沒有必要在年底釋放初始化。

+0

嘿,這個答案將在未來肯定幫助我!但在這種情況下,我的代碼只是一個例子,我的數組的大小不是一個常量,而是在運行時確定的。謝謝;) – Psyclops 2011-12-22 13:47:29

+0

@Psyclops只要你使用C99,所有這些都可以在運行時發生。 – Dave 2011-12-22 14:46:39