在C中,如何从函数内部初始化指针指针?

时间:2011-09-28 21:33:39

标签: c pointers

关注this answer,我做了一个简单的例子,以确保我理解正确:

#include <stdlib.h>
#include <stdio.h>

typedef struct
{
  int x;
} data;

void fill_data (data *** ptr_all, int l)
{
  int i = 0;
  *ptr_all = (data**) calloc(l, sizeof(data));
  if ((*ptr_all) == NULL){
    fprintf(stderr, "error: can't allocate memory");
    abort();
  }
  for (i = 0; i < l; i++)
  {
    data * d = (data*) calloc(1, sizeof(data));
    if (d == NULL){
      fprintf(stderr, "error: can't allocate memory for %i-th data", i+1);
      abort();
    }
    d->x = i;
    (*ptr_all)[i] = d;
  }
}

int main(int argc, char *argv[])
{
  int i = 0, l = 5;
  data ** all = NULL;

  fill_data (&all, l);

  for (i = 0; i < l; i++)
  {
    printf("%i\n", all[i]->x);
  }

  return EXIT_SUCCESS;
}

但是,在编译并运行它之后,我发现第一个元素是错误的:

$ gcc -Wall test.c
$ ~/bin/a.out 
161276080
1
2
3
4

我可以在我的函数fill_data中看到我没有初始化ptr_all,而只是* ptr_all,这可能是导致问题的原因。但我该怎么办?

1 个答案:

答案 0 :(得分:5)

变化:

*ptr_all = (data**) calloc(l, sizeof(data));

为:

*ptr_all = (data**) calloc(l, sizeof(data*));

您正在分配l个整数,而您需要分配l个指针。你几乎可以肯定在64位操作系统(sizeof(void *) > sizeof(int))上构建和运行它,否则这个bug将一直处于休眠状态。