我有一个2D数组字符串,动态分配:
char*** allocateArray(int line, int col)
{
char*** dictionary;
int i=0,j=0;
dictionary=(char***)malloc(sizeof(char**)*line);
for(i=0;i<line;i++)
{
dictionary[i] = (char**)malloc(sizeof(char*));
for(j=0;j<col;j++)
dictionary[i][j] = (char*)malloc(sizeof(char*));
}
return dictionary;
}
现在我想释放最后一栏(比如说),我该怎么办?
我使用free(dictionary[i][j])
,但它实际上是免费的?数组中的[i][j]
单元格,或指向它的指针?
我需要释放两者。
答案 0 :(得分:0)
dictionary[i][j] = (char*)malloc(sizeof(char*));
错误,您想为char
而不是char *
分配空间。你会像任何其他指针一样释放它,所以free(dictionary[i][j])
是正确的。
答案 1 :(得分:0)
请记住,您必须按照保留内存的相反顺序释放内存。在这种情况下,循环j
以释放dictionary[i][j]
(其中索引i
已修复)是正确的,因为那样您将释放为{{1}保留的空间}。之后,您将遍历*(*(dictionary + i) + j)
以释放i
(释放为dictionary[i]
保留的空间),最后,您只需* (dictionary + i
(并且您正在释放{{} 1}})。
注意:释放空间的顺序很重要,因为如果释放一块实际指向另一块保留内存的内存块,那么你就不能再释放最后一块内存了,所以你会有内存泄漏。这就是为什么你必须以你调用free (dictionary)
s。
总结一下,这段代码可以很好地用到你的代码中(我用Valgrind测试它,并且没有内存泄漏):
* dictionary
您可以看到解释如何释放二维数组here的示例。我希望它对你有用:)
答案 2 :(得分:0)
这种混淆来自于你不清楚这项任务的事实。
dictionary[i][j]
必须指向一个char *
的字符串,那么dictionary[i][j]
必须是char **
,因为它指向一个指针。因此dictionary[i]
必须是char ***
,字典必须是char ****
。另一方面,如果字典必须是char ***
,那么每个dictionary[i][j]
必须包含一个字符而不是char *
,如user3112989所述,所以你的任何一个限制都是错。
因此,要回答您的问题,free(dictionary[i][j])
会释放它指向的字符串,只要您,代码中的其他位置执行类似dictionary[i][j] = pointer_to_string_i_j;
的操作,但在这种情况下,您没有' t必须分配它们,因为它们指向的数据已经有一个内存块(如果你处理的话)。
答案 3 :(得分:0)
简短的回答是:从malloc
返回的每个指针最终都必须传递给free
。
稍微长一点的答案:每次调用malloc
时,它都会分配一个连续的内存块并返回指向该块的指针。当free
传递该指针时,它将整个内存块返回给操作系统。如果您使用dictionary[i][j] = malloc(10000000)
分配了10兆字节,则free(dictionary[i][j])
将释放所有10兆字节。
由于dictionary[i]
本身是指向动态分配的内存块的指针,因此在中释放{{1}中的每个字符串后,您还需要free(dictionary[i])
- }。
答案 4 :(得分:0)
在考虑释放之前,我们应该确保allocateArray()
是正确的,这不是:
dictionary[i] = (char**)malloc(sizeof(char*));
上述语句只分配一个char *
,仅分配dictionary[i][0]
。
for(j=0;j<col;j++)
dictionary[i][j] = (char*)malloc(sizeof(char*));
此处所有写入 j的dictionary[i][j]
&gt; 0 访问未分配的内存。
您需要的是代替以上三个代码行:
dictionary[i] = malloc(sizeof (char *) * col);
此后,正确分配所有字符串的内存(即char *
);没有必要初始化它。
现在我想释放最后一栏(比如说),我该怎么办?
您必须为每一行重新分配内存:
--col;
for (i=0; i<line; ++i)
dictionary[i] = realloc(dictionary[i], sizeof (char *) * col);
请注意,如果您为最后一列中的字符指针分配了动态内存,那么在重新分配之前,您当然必须free(dictionary[i][last])
。