В C, как инициализировать указатели на указатели внутри функции? - PullRequest
0 голосов
/ 29 сентября 2011

После этого ответа я сделал простой пример, чтобы убедиться, что правильно понял:

#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 Ответ

5 голосов
/ 29 сентября 2011

Измените:

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

на:

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

Вы выделяете l целых, тогда как вам нужно выделить l указателей.Вы почти наверняка создадите и запустите это на 64-битной ОС (где sizeof(void *) > sizeof(int)), иначе эта ошибка осталась бы бездействующей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...