Как прочитать многомерный массив и сохранить его в указателе - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь написать и прочитать char трехмерный массив или, другими словами, массив массивов строк.

Я уже пытался выделить память в каждой частимассив, но он продолжает сбой со следующей ошибкой: Segment fault (core dumped)

/**
 * Create array to write
 */
char writed[2][2][512] = {{"Hello", "World"}, {"Bye", "World"}};
/**
 * Allocate memory
 */
char *** readed = (char ***)malloc(sizeof(char **) *2 * 2 * 512);
for (int z = 0; z < 2; z++) {
    readed[z] = (char **)malloc(sizeof(char **) * 2 * 512 );
    for (int y = 0; y < 2; y++) {
        readed[z][y] = (char *)malloc(sizeof(char) * 512); 
    }
}    
/**
 * Write array
 */
FILE *writeFile = fopen("strings", "wb");
fwrite(writed, 2 * 2 * 512, 2 * 512, writeFile);
fclose(writeFile);
/**
 * Read array
 */
FILE *readFile = fopen("strings", "rb");
fread(readed, 2 * 2 * 512, 2 * 512, readFile);
fclose(readFile);

1 Ответ

0 голосов
/ 06 февраля 2019

Здесь у вас две разные структуры данных, каждая с разным макетом.

writed - это трехмерный массив char, означающий, что вся память массива является смежной.Напротив, readed является указателем на массив char **, каждый из которых указывает на массив char *,, каждый из которых указывает на массив char, и ни один из них не должен быть непрерывным.

Чтобы иметь аналогичную структуру данных, вам нужно объявить readed как указатель на 2D-массив и выделить место для достаточного количества таких объектов для 3D-массива:

char (*readed)[2][512] = malloc(2 * sizeof(char[2][512]));

Также, не приводите возвращаемое значение malloc.

Вы также пишете / читаете больше, чем нужно:

fwrite(writed, 2 * 2 * 512, 2 * 512, writeFile);
...
fread(readed, 2 * 2 * 512, 2 * 512, readFile);

Это говорит о том, что вы читаете/ запись 2 * 512 элементов, каждый из которых имеет размер 2 * 2 * 512.Вы только читаете / пишете 1 член этого размера:

fwrite(writed, 2 * 2 * 512, 1, writeFile);
...
fread(readed, 2 * 2 * 512, 1, readFile);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...