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

Lae*_*ica 4 c free

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

printf("%s\n", array[0]);
Run Code Online (Sandbox Code Playgroud)

输出是:

Hello.
Run Code Online (Sandbox Code Playgroud)

如果我执行free(array)遗嘱这是免费array[0]的指向什么?("Hello.").

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

Pau*_*vie 22

这一切都取决于数组的分配方式.我举个例子:

例1:

char array[10];
free(array);     // nope!
Run Code Online (Sandbox Code Playgroud)

例2:

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

例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);
Run Code Online (Sandbox Code Playgroud)

广告.示例1:数组在堆栈上分配("自动变量"),无法释放array.

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

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