如何使用malloc释放二维数组

时间:2014-08-18 14:35:31

标签: c

我有一个包含6个元素的数组。这6个元素中的每一个都有40个元素。我想知道当我释放malloced内存时,我是否必须释放两者或者我可以释放主层(包含6个元素的那个)这将自动释放其他辅助阵列吗?

 char ** listofdetails;  //FIRST ARRAY
    listofdetails = malloc(sizeof(char*)*6);

    for(i=0;i<6;i++)
    {
    listofdetails[i] = malloc(sizeof(char)*40); // SECONDARY ARRAY
    fgets(listofdetails[i], 40, fp);
    }

7 个答案:

答案 0 :(得分:4)

你需要像

这样的破坏功能
 void destroy_array_of_cstrings (char**lis, size_t siz)
 {
    if (!lis) return;
    for (size_t ix=0; ix<siz; ix++) free (lis[ix]);
    free (lis);
 }

您将在 案例中致电destroy_array_cstring(listofdetails, 6)。在Alfred Hang answered之后,您应该在listofdetails之后立即清除listofdetails=NULL;,以避免意外free两次指针,或取消引用已释放的指针。

您最好使用calloc来分配指针数组(您真的希望将每个指针初始化为NULLcalloc在实践中这样做。

另请参阅this answer一个问题还提到listeofdetails和6(所以我猜这是相同的作业)。

顺便说一句,您可能稍后使用Boehm's conservative garbage collector:您会使用GC_MALLOCGC_STRDUP而且您不再需要为免费提供帮助。与老师讨论。

答案 1 :(得分:3)

经验法则:每个malloc都有免费的。

你必须提供一个类似的循环,在释放字符串数组之前释放每个单独的字符串。

答案 2 :(得分:2)

除了Basile的回答之外,为了避免在释放每个数组条目后有悬空指针,最好立即将指针设置为null。

参考:free()

答案 3 :(得分:1)

不,辅助数组不会自动释放;在释放free之前,您需要明确listofdetails他们

for ( i = 0; i < 6; i++ )
  free( listofdetails[i] );
free( listofdetails );

对于每个malloc,必须有freefree次调用必须按malloc次调用的相反顺序执行。

如果在编译时 1 知道列数,则可以在一次malloc调用中分配整个内容,如下所示:

char (*listofdetails)[40] = malloc( sizeof *listofdetails * 6 );  

这会在一次调用中分配一个6x40的char数组。您的使用方式与上面几乎相同:

fgets( listofdetails[i], sizeof listofdetails[i], fp );

listdetails[i]的类型是“char的40个元素数组”,因此sizeof listdetails[i]会给我们与sizeof (char) * 40相同的结果(请注意,此只有才有效,因为我将listofdetails声明为指向char的40个元素数组的指针,而不是指向char指针的指针。

这还具有以下优点:所有行在存储器中彼此相邻,这在某些情况下可能是重要的。对于两步分配方法,情况不一定如此。

这只需要一次free电话:

free( listofdetails );

但是你们可能还没有讨论过指向数组的指针。

<小时/> 1。如果您正在使用仍支持可变长度数组的C99编译器或C2011编译器,您仍然可以使用单malloc次调用:

size_t rows, cols;
...
char (*listofdetails[cols]) = malloc( sizeof *listofdetails * rows );
...
free( listofdetails );
否则,您将不得不像代码中那样进行零碎分配

答案 4 :(得分:0)

如果你想这样访问listofdetails[i][j],那么是的,你需要malloc内部数组。你也必须单独释放它。

如果你知道内部数组的大小并且它是固定的,那么你可以预先分配所有内容(宽度*高度)并像这样访问它:listofdetails[i * width + j]

答案 5 :(得分:0)

你需要释放两个,因为free free函数不会自动释放第二个数组。

像这样免费:

for(i=0;i<6;i++)
{
    free(listofdetails[i]);
}
free(listofdetails);

答案 6 :(得分:0)

在为这个aaray动态分配内存之后,需要释放其中一个动态分配的多维数组,&#39;&#39;我们必须记住释放我们分配的每一块记忆。 (只是释放顶级指针,数组,不会削减它;如果我们这样做,所有二级指针都会丢失但不会被释放,并且会浪费内存。)这里的代码是什么可能看起来像:

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

对于你的情况应该是:

for ( i = 0; i < 6; i++ )
  free( listofdetails[i] );
free( listofdetails );