繁体   English   中英

C将指针传递给char的指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM