簡體   English   中英

在C語言中,如何從函數內部初始化指向指針的指針?

[英]In C, how to initialize a pointer-to-pointers from inside a function?

按照這個答案 ,我做了一個簡單的例子,以確保我正確理解:

#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,這可能是問題的原因。 但是我該怎么辦?

更改:

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

至:

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

您正在分配l ints,而您需要分配l指針。 您幾乎可以肯定會在64位操作系統(其中sizeof(void *) > sizeof(int) )上構建和運行它,否則此錯誤將一直處於休眠狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM