免费的2D阵列列

时间:2013-12-17 21:41:12

标签: c arrays string malloc free

我有一个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]单元格,或指向它的指针? 我需要释放两者。

5 个答案:

答案 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必须分配它们,因为它们指向的数据已经有一个内存块(如果你处理的话)。

  • 其次,避免施放malloc返回的指针(除非你的老师问你,但你应该和他讨论)。您可以在此处找到有关C中不必要的原因的多个讨论,以及它如何隐藏其他问题。

答案 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])