Передача многомерных массивов в C

В настоящее время я пытаюсь изучить C, и у меня возникла проблема, которую я не смог решить.

Рассматривать:

#include  #include  #include  #define ELEMENTS 5 void make(char **array, int *array_size) { int i; char *t = "Hello, World!"; array = malloc(ELEMENTS * sizeof(char *)); for (i = 0; i < ELEMENTS; ++i) { array[i] = malloc(strlen(t) + 1 * sizeof(char)); array[i] = strdup(t); } } int main(int argc, char **argv) { char **array; int size; int i; make(array, &size); for (i = 0; i < size; ++i) { printf("%s\n", array[i]); } return 0; } 

Я понятия не имею, почему выше не удается прочитать содержимое массива после его создания. Я буквально потратил час, пытаясь понять, почему он терпит неудачу, но пришел с пустыми armми. Без сомнения, это нечто тривиальное.

Ура,

Вот рабочий код:

 #include  #include  #include  #define ELEMENTS 5 void make(char ***array) { char *t = "Hello, World!"; *array = malloc(ELEMENTS * sizeof(char *)); int i; for (i = 0; i < ELEMENTS; ++i) { (*array)[i] = strdup(t); } } int main(int argc, char **argv) { char **array; make(&array); int i; for (i = 0; i < ELEMENTS; ++i) { printf("%s\n", array[i]); free(array[i]); } free(array); return 0; } 

Как и другие выложили - был неиспользованный размер, а strdup выделяет память сам по себе, и приятно освободить память потом ...

Вам нужно передать адрес «array» в функцию. То есть, вам нужен символ ***. Это связано с тем, что вам нужно изменить значение массива, выделив ему память.

EDIT: просто чтобы сделать его более полным, в объявлении функции вам нужно что-то вроде

 void make(char ***array, int *array_size) 

Затем вам нужно вызвать его, используя

 make(&array, &size); 

Внутри функции make выделите память

 *array = malloc(ELEMENTS * sizeof(char *)); 

И измените другие места соответственно.

Кроме того, как отметил kauppi, strdup будет выделять вам память, поэтому вам не нужно делать malloc для каждой строки.

См. Комментарий PolyThinker, который абсолютно определен.

В дополнение к тому, как вы передаете массив, вы должны проверить несколько других проблем:

  1. Возможно, вы должны назначить что-то для array_size в make (…)?
  2. strdup (char *) выделяет память, malloc для массива [i] не требуется.
  3. Вы должны освободить всю память, которую вы выделите, после того, как она вам больше не понадобится.

Вы передаете текущее значение массива в качестве копии (в стеке). когда вы меняете массив в make (), вы меняете только копию, а не фактическую переменную. Попробуйте перейти по ссылке с помощью &, или сделать его char *** и работать с * array = …

размер объявляется, но не получает назначенного значения (это должно произойти в функции make, я полагаю).