分配和释放指针指针

时间:2013-02-10 14:53:50

标签: c pointers

我试图将一个指向指针(char **)的指针传递给一个初始化它的函数,然后将它传递给另一个释放内存的函数,但是我在释放时遇到了seg错误这让我相信我的分配是错误的。

Valgrind正在报告在这条线上使用未经注册的价值。 tmp [i]指向0x0。

if(tmp[i]) free((char*)tmp[i]);

这是代码(这只是测试代码)

void 
alloc_strings(char ***test, int count) 
{
  char **tmp = *test;
  tmp = malloc(count * sizeof(char*));

  int i;
  for(i = 0; i < count; i++) {
    tmp[i] = malloc(6);
    strcpy(tmp[i],"Hello");
  }
}

void
free_strings(char ***test, int count)
{
  char **tmp = *test;

  int i;
  for(i = 0; i < count; i++) {
    if(tmp[i]) free((char*)tmp[i]);
  }

  if(tmp)
    free(tmp);
}

并且调用:

int
main(int argc, char **argv)
{

  char **test;
  alloc_strings(&test, 10);
  free_strings(&test, 10);

  return 0;
}

我已经玩了一段时间,阅读指针等,但无法解决这个问题。任何想法非常感谢!

2 个答案:

答案 0 :(得分:1)

您需要分配到*test,而不是从中分配。怎么样:

void 
alloc_strings(char ***test, int count) 
{
    char **tmp = malloc(count * sizeof *tmp);
    /*...*/
    *test = tmp;
}

答案 1 :(得分:0)

在代码示例中,

alloc_strings(char ***test, int count) 
{
    char **tmp = *test;

*test应该有一些空间来存储指向当前未分配的char **的指针。因此,如果示例是这样的

char** array[1];

alloc_strings(&array[0], 7);

我觉得代码可行。