免费的2Darrays列
我有一个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]
单元格,或指向它的指针? 我需要释放两者。
dictionary[i][j] = (char*)malloc(sizeof(char*));
是错的,你想为char
而不是char *
分配空间。 你会像任何其他指针一样释放它,所以free(dictionary[i][j])
是正确的。
这种混淆来自于你不清楚这项任务。
- 首先,如果
dictionary[i][j]
必须指向一个字符串,它是一个char *
,那么dictionary[i][j]
必须是一个char **
因为它指向一个指针。 因此,dictionary[i]
必须是char ***
而词典必须是char ****
。
另一方面,如果字典必须是char ***
,则每个dictionary[i][j]
必须包含char而不是char *
,如user3112989所述,因此您的任何一个限制都是错误的。
所以,为了回答你的问题, free(dictionary[i][j])
将释放它所指向的字符串,只要你,你的代码中的其他地方做类似于dictionary[i][j] = pointer_to_string_i_j;
,但在这种情况下,你不必分配它们,因为它们指向的数据已经有一个内存块(如果你照顾它)。
- 其次,避免施放malloc返回的指针(除非你的老师问你,但你应该和他讨论)。 您可以在此处找到有关C中不必要的原因的多个讨论,以及它如何隐藏其他问题。
简短的回答是:从malloc
返回的每个指针最终都必须传递给free
。
稍微长一点的答案:每次调用malloc
,它都会分配一个连续的内存块并返回一个指向该块的指针。 当free
通过该指针时,它将整个内存块返回给操作系统。 如果您使用dictionary[i][j] = malloc(10000000)
分配了10兆字节,那么free(dictionary[i][j])
将释放所有10兆字节。
由于dictionary[i]
本身是指向动态分配的内存块的指针,因此在释放dictionary[i][j]
每个字符串之后 ,还需要free(dictionary[i])
。
请记住,您必须按照保留内存的相反顺序释放内存。 在这种情况下,循环j
以释放dictionary[i][j]
(其中索引i
是固定的)是正确的,因为那样你将释放为*(*(dictionary + i) + j)
保留的空间*(*(dictionary + i) + j)
。 在那之后你会循环i
以释放dictionary[i]
(它释放为* (dictionary + i
)保留的空间,最后,你只需要free (dictionary)
(并且你正在释放* dictionary
)。
注意:释放空间的顺序很重要,因为如果释放实际指向另一个保留内存块的内存块,那么你就不能再释放最后一个,所以你会有内存泄漏。 这就是为什么你必须以你调用malloc
s的相反顺序开始释放内存的原因。
总而言之,这段代码可以很好地用到你的代码中(我用Valgrind测试它,并且没有内存泄漏):
for (i = 0; i < line; i++){ for (j = 0; j < col; j++){ free (dictionary[i][j]); } free (dictionary[i]); } free (dictionary);
您可以在此处查看有关如何释放二维arrays的解释示例。 我希望它对你有用:)
在考虑释放之前,我们应该确保allocateArray()
是正确的,它不是:
dictionary[i] = (char**)malloc(sizeof(char*));
上面的语句只分配一个char *
,只分配一个dictionary[i][0]
。
for(j=0;j
这里所有写入dictionary[i][j]
的j> 0访问未分配的内存。
您需要的是代替以上三个代码行:
dictionary[i] = malloc(sizeof (char *) * col);
在此之后,正确分配所有字符串(即char *
)的内存; 没有必要初始化它。
现在我想释放最后一栏(比如说),我该怎么办?
您必须为每一行重新分配内存:
--col; for (i=0; i
请注意,如果您为最后一列中的字符指针分配了动态内存,则必须在重新分配之前 free(dictionary[i][last])
。