纠正字符串数组C的free()

时间:2014-03-12 17:03:21

标签: c string malloc free

这可能是一个新手的错误,但我很想知道我究竟做错了什么。

代码:

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 个答案:

答案 0 :(得分:7)

问题是当你写这个:

nameslist[0]="John";

您实际上并未使用已分配的内存。 &#34;约翰&#34;它本身就是一个指针,你用这个新指针覆盖malloc返回的地址。

使用strncpy()功能将字符串复制到您分配的内存中。

答案 1 :(得分:6)

您的mallocfree内容很好,但是当您尝试执行此类分配时,您正在孤立原始字符串:

nameslist[0]="John";

相反,您应该使用strcpy

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