我有一个包含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);
}
答案 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
来分配指针数组(您真的希望将每个指针初始化为NULL
,calloc
在实践中这样做。
另请参阅this answer一个问题还提到listeofdetails
和6(所以我猜这是相同的作业)。
GC_MALLOC
,GC_STRDUP
而且您不再需要为免费提供帮助。与老师讨论。
答案 1 :(得分:3)
你必须提供一个类似的循环,在释放字符串数组之前释放每个单独的字符串。
答案 2 :(得分:2)
除了Basile的回答之外,为了避免在释放每个数组条目后有悬空指针,最好立即将指针设置为null。
参考:free()
答案 3 :(得分:1)
不,辅助数组不会自动释放;在释放free
之前,您需要明确listofdetails
他们:
for ( i = 0; i < 6; i++ )
free( listofdetails[i] );
free( listofdetails );
对于每个malloc
,必须有free
,free
次调用必须按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 );