C - 释放指针数组是否也会释放它们所指向的内容?

C - Does freeing an array of pointers also free what they're pointing to?

假设我有一个指向结构的指针数组,每个结构都包含一个字符串,所以对于这样的事情:

printf("%s\n", array[0]);

输出为:

Hello.

如果我执行 free(array) 这会释放 array[0] 指向的内容吗? ("Hello.").

我花了几个小时试图手动释放每个元素,但我得到的只是崩溃。我希望这是一条捷径:/

If I perform a free(array) will this free what array[0] is pointing to? ("Hello.").

不,它们不会自动释放,但根据您分配它们的方式,实际上可能不需要释放它们。如果它们指向由 malloc 和类似分配函数返回的内存,您只需要释放它们。

假设您有指向字符串的指针数组 array

char * array[2];
array[0] = "Some text"; // You would not need to free this
array[1] = malloc(LENGTH); // This one you would have to free

请注意,在这种情况下,您不需要释放 array 本身。只有索引为 1 的元素。

这完全取决于数组的分配方式。我举个例子:

示例 1:

char array[10];
free(array);     // nope!

示例 2:

char *array;
array= malloc(10);   // request heap for memory
free(array);         // return to heap when no longer needed

示例 3:

char **array;
array= malloc(10*sizeof(char *));
for (int i=0; i<10; i++) {
    array[i]= malloc(10);
}
free(array);        // nope. You should do:

for (int i=0; i<10; i++) {
    free(array[i]);
}
free(array);

广告。例1:array分配在栈上("automatic variable"),不能被free释放。它的栈space会在函数returns.

时释放

广告。示例 2:您使用 malloc 从堆中请求存储。当不再需要时,使用 free.

return 将其放入堆中

广告。示例 3:您声明了一个指向字符的指针数组。首先为数组分配存储空间,然后为每个数组元素分配存储空间以放置字符串。当不再需要时,必须先释放字符串(使用 free),然后释放数组本身(使用 free).

您只需要手动释放您的内容 malloc()。所以不,根据指针的不同,它可能不需要,甚至可能没有必要。