在C语言中释放多维数组

3

假设我们有以下内容:

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));
        }
   }

如何释放代码

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
这是"可取的",我们可以说"一个是对的,另一个不对" ;) - Simone-Cu
你使用的不是多维数组。 - Jens Gustedt
6个回答

6

这样想 - 每个malloc都应该有一个对应的free

// 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

3
第二个就是你需要的,free不能递归工作也不会递归工作。每次执行malloc时,请考虑在哪里调用free
另外,如果下一步要做的事情是退出程序,不要释放内存——这是没有意义的,而且可能会花费相当长的时间。

3
第二个是正确的,而第一个会泄漏内存。通常情况下,您应该为每个malloc()调用调用free()

1

createMultiArray() 的内存布局如下:

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

现在,回去并且使用free来释放你使用malloc创建的每一个内存空间(是的,对于每个malloc()都应该有一个free()

另一方面,你确定你想要这样做吗?

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

这是有意为之的吗?


我执行了 codes[i] = malloc((i+1) * sizeof(char*));,因为在下一行我会执行 for ( j = 0; j <= i; j++ )。这样不行吗? - Stamoulohta
这很好!我只是好奇这是否是有意的! :) - Sangeeth Saravanaraj

1
最好不要使用嵌套的malloc(),如果您可以预先计算数组的大小。您应该一步分配和释放(使您的生活更轻松,减少错误的机会)。

0
不要使用复杂的分配方案来模拟多维数组。特别是在您的情况下,所有边界都是编译时常量。
char (*codes)[n][m] = malloc(sizeof(char[x][n][m]));

实现相同的目的,只需要一个

free(codes);

在结束处。如果您使用该数组的上下文甚至绑定到一个作用域,并且边界很小,您甚至可以直接将其分配为auto变量,同时进行初始化。
char codes[23][2][5] = { { { 'a', 'b'}  } };

最后不需要释放。


嘿,这个答案将来肯定会对我有所帮助!但在这种情况下,我的代码只是一个例子,我的数组大小不是一个常量,而是在运行时确定的。谢谢 ;) - Stamoulohta
只要您使用C99,所有这些都可以在运行时发生。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接