C - 释放一定数量的内存(char **)

时间:2013-01-29 07:39:00

标签: c arrays memory free

我必须安全地释放一个数组:char** a;它就像一个字符串列表。我知道我有多少char*。但我无法释放所有内存。有没有像我可以用来释放20个字节的功能?我试过了:

for (int i = 0; i < length; i++)
    if (a[i] != null)
        free(a[i]); // some of a[i] ARE null, non-null have different sizes
free(a); // crashes here

但是我通过asm调试得到了运行时错误。 a中的所有东西都已经过了。对于I malloced 5个字符串(每个指针4个字节) - &gt; 20个字节。如何释放整个char**

3 个答案:

答案 0 :(得分:6)

除非分配了20个字节,否则不能释放20个字节。你只能释放一个街区。该块的大小在分配时指定。对于分配的每个块,您需要单独的取消分配。

您可以尝试使用realloc更改块的大小,但这不会删除该块的任意部分。

如果数组和数组中的指示项都已使用malloc分配,那么您的方法是正确的。释放每个元素,然后释放数组:

char **arr = malloc (10 * sizeof (char*));
if (arr != NULL)
    for (int i = 0; i < 10; i++)
        arr[i] = malloc (50 + i * 10); // sizes 50, 60, 70, ..., 140

// Use the ten X-character arrays here
//     (other than NULL ones from malloc failures, of course).

if (arr != NULL) {
    for (int i = 0; i < 10; i++)
        free (arr[i]);           // Okay to free (NULL), size doesn't matter
    free (arr);
}

答案 1 :(得分:1)

如果你已经正确地分配了char **数组和它包含指针的所有char *数组,那么你发布的代码应该可行。其余代码是什么样的?

答案 2 :(得分:1)

您发布的代码没有任何问题。 但是,如果两次释放相同的内存,则可能会出现运行时错误。 检查你的其余代码,确保你实际上分配了该数组中的所有内存,而不是多次释放它。