Передача многомерных массивов в C
-
05-07-2019 - |
Вопрос
В настоящее время я пытаюсь выучить C и столкнулся с проблемой, которую не смог решить.
Рассмотреть:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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;
}
Я понятия не имею, почему вышеописанному не удается прочитать содержимое массива после его создания.Я буквально потратил час, пытаясь понять, почему это не удается, но пришел с пустыми руками.Без сомнения, это что-то тривиальное.
Ваше здоровье,
Решение
Вот рабочий код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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, выделив для него память.
Редактировать:Просто чтобы сделать его более полным, в объявлении функции вам нужно иметь что-то вроде
void make(char ***array, int *array_size)
Затем вам нужно вызвать его, используя
make(&array, &size);
Внутри функции сделать, выделять память с
*array = malloc(ELEMENTS * sizeof(char *));
И соответствующим образом измените другие места.
Кроме того, как указал кауппи, strdup выделит для вас память, поэтому вам не нужно выполнять malloc для каждой строки.
Смотрите комментарий PolyThinker, который абсолютно точен.
В дополнение к способу передачи массива, вам следует проверить несколько других проблем:
- Возможно, вам следует присвоить что-то array_size в make(...)?
- strdup(char*) выделяет память, malloc для массива[i] не требуется.
- Вы должны освободить всю выделяемую вами память после того, как она вам больше не понадобится.
Вы проходите мимо текущий значение массива для создания копии (в стеке).когда вы изменяете массив в make(), вы изменяете только копию, а не саму переменную.Попробуйте передать по ссылке с помощью & или сделайте это символом *** и работайте с * array = ...
размер объявлен, но не получает присвоенного значения (я полагаю, это должно произойти в функции make).