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()
。所以不,根据指针的不同,它可能不需要,甚至可能没有必要。
假设我有一个指向结构的指针数组,每个结构都包含一个字符串,所以对于这样的事情:
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
.
广告。示例 3:您声明了一个指向字符的指针数组。首先为数组分配存储空间,然后为每个数组元素分配存储空间以放置字符串。当不再需要时,必须先释放字符串(使用 free
),然后释放数组本身(使用 free
).
您只需要手动释放您的内容 malloc()
。所以不,根据指针的不同,它可能不需要,甚至可能没有必要。