C语言中字符串数组的free()正确使用方法

5
这可能是新手的错误,但我很感激任何关于我到底做错了什么的提示。
代码:
int main()
{
  int i =0;
  char ** nameslist;
  nameslist = malloc(5 * sizeof(char*));

  for (i=0; i <5; i++)
  {
      nameslist[i]=malloc((20+1)*sizeof(char));
  }

  nameslist[0]="John";
  nameslist[1]="Adam";
  nameslist[2]="Nick";
  nameslist[3]="Joe";
  nameslist[4]="Peter";

  for (i=0; i <5; i++)
  {
    free(nameslist[i]);
  }

  free(nameslist);
  return 0;
}

使用Valgrind,我仍然发现我在堆中有内存泄漏 - 我该如何解决这个问题? 我怀疑我分配了太多的空间 - 但是,我该如何释放我不必要的空间呢? 感谢任何提示!
2个回答

7
问题在于,当您编写以下内容时:

...

nameslist[0]="John";

你实际上没有使用你分配的内存。 "John" 本身就是一个指针,而你正在用这个新指针覆盖 malloc 返回的地址。
使用 strncpy() 函数将字符串复制到你分配的内存中。

1
调用free释放常量也不是一个好主意,这个问题也得到了解决。 - Joachim Isaksson

6

您的mallocfree代码没有问题,但是在尝试像这样赋值时,您会使原始字符串变成孤儿:

nameslist[0]="John";

相反,您应该使用strcpy

strcpy(nameslist[0], "John");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接