【发布时间】:2015-10-11 13:00:25
【问题描述】:
我真的对这个二维字符数组感到困惑
char **arg = malloc(sizeof(char*) * argc)
for (int i = 0; i < argc; i++)
arg[i] = malloc(sizeof(char) * size)
...
...
现在假设经过一系列操作,我忘记了变量 argc,如何释放这些内存? 我可以做这样的事情吗?这在所有情况下都绝对正确吗?
char **tmp = arg;
while (*tmp != NULL){
free(*tmp);
tmp++;
}
free(arg);
【问题讨论】:
-
数组不以 NULL 结尾,仅对字符串有效(C 中的 char *)
-
您实际上是在为 char* 数组分配内存,然后为数组中的每个项目分配内存。你必须先释放项目然后释放它自己的数组。
-
这实际上不是一个坏主意,但您应该在数组末尾显式放置一个
NULL。我在很多情况下都使用它,它很好。 -
这不是二维数组,而是指针的指针。
-
其实 arg 是一个 char* 的动态数组;可以容纳(argc)元素;元素是可以容纳(大小)字符的动态字符数组;每个数组和元素分别被释放;