c - 释放指针数组
问题描述
假设我有以下main
功能:
int main(void) {
char * strings[] = { "a", "b", "c", NULL};
char **xstrings = malloc (4 * sizeof *xstrings);
}
free
xstrings的正确方法是什么?例子是:
free(xstrings)
或者:
while (*xstrings) {
free (*xstrings);
*xstrings++ = NULL;
}
}
这两种方式有什么区别,一种对,另一种错,或者它们有什么不同?
解决方案
第一个例子是正确的,虽然
char * strings[] = { "a", "b", "c", NULL};
线未使用。
#include <stdio.h>
#include <stdlib.h>
int main() {
char **xstrings = malloc(4 * sizeof *xstrings);
free(xstrings);
return 0;
}
上面,我们为 4 个指针分配空间char *
并正确释放内存。
但是,通常情况下,我们希望为每个指针分配内存(除非变量最终指向某些数据char *
,否则我们无法实现任何有意义的事情):xstrings
#include <stdio.h>
#include <stdlib.h>
int main() {
int len = 4;
char **xstrings = malloc(len * sizeof *xstrings);
for (int i = 0; i < len; i++) {
xstrings[i] = malloc(sizeof(*xstrings[i]) * some_length);
}
/* ... do something with the memory ... */
/* free each xstring element */
for (int i = 0; i < len; i++) {
free(xstrings[i]);
}
free(xstrings);
return 0;
}
线条
while (*xstrings) {
free (*xstrings);
*xstrings++ = NULL;
}
没有多大意义。一旦内存为free
d,就不能使用了。您可以使用临时变量来实现这一点,但与简单地使用循环相比会有点痛苦for
(我们不想放弃原始xstrings
指针,以便稍后释放它,我们需要一个临时变量在free
向前移动指针后调用的循环中)。
推荐阅读
- c# - .NET Standard F# 库无法正确存储非英文字符
- php - 斜杠后的 URL 中的文本作为参数
- java - 如何从java代码中判断两个类之间的关系?(关联与依赖)
- java - 我无法仅从屏幕截图中获取照片
- assembly - 从 GP regs 加载 xmm
- c# - .Net Core 为不同的构建配置启动
- atmelstudio - AtmelStudio7:MPLABCOMM_INVALID_HANDLE
- ios - 开发者如何在 ios 上找到使用应用组提供共享数据的第三方公司?
- login - Moodle 无法登录到我的 localhost/moodle
- graphql - ApolloGraphQL -- ReadQuery `Field Not Found` 错误?