免费的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])