[英]C passing pointer to pointer of char
我有一个函数,可以像这样获取char ** str_array:
char** str_array = Init();
Init会分配一个char *数组,该数组必须包含一个char数组。
然后,稍后我想释放内存,但是我想要一个清理功能,例如:
void FreeStr(char*** arg) {
char** str = *arg;
for (int i = 0; str[i] != '\0'; ++i) {
printf("Str %d: %s\n", i, str[i]);
free(str[i]);
}
free(str);
}
这会打印垃圾并崩溃。 当for循环的内部与声明str_array的函数处于同一函数中时,for循环的内部确实起作用,但在这样调用时不起作用:
FreeStr(&str_array);
我很困惑为什么这不起作用。 我认为指针的额外层将确保我仍然指向正确的内存。 请问我有什么误会?
您尚未指定Init()返回固定长度的数组还是返回以NULL结尾的数组。 如果是后者,这是通常的做法,则正确的代码将是:
void FreeStr(char*** arg) {
char** str = *arg;
int i;
for (i = 0; str[i] != NULL; ++i) {
printf("Str %d: %s\n", i, str[i]);
free(str[i]);
}
free(str);
*arg = NULL;
}
这样,打电话后
FreeStr(&str_array);
如果str_array实际上是malloc()分配的字符串的malloc()分配的,以NULL终止的数组,则str_array变为NULL(您不希望指向释放内存的指针徘徊,对吗?)并且所有内存都被释放了。
不需要额外的间接层。 将函数定义为:
void FreeStr(char** arg)
并这样称呼它:
FreeStr(str_array);
同样, str[i] != '\\0'
也不是测试空指针的好方法。 您应该在做str[i] != NULL
。 因此,您的函数应如下所示:
void FreeStr(char** str) {
for (int i = 0; str[i] != NULL; ++i) {
printf("Str %d: %s\n", i, str[i]);
free(str[i]);
}
free(str);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.