Как я могу полностью перераспределить 2D массив в C? - PullRequest
0 голосов
/ 09 июня 2019

Будучи лаконичным, я хочу прочитать файл и сохранить содержимое в двумерном массиве, где первое измерение относится к строке, а второе измерение - к символу в соответствующей строке. Я не знаю количество строк и столбцов в каждой строке заранее.

Код, который я пробовал, выглядит следующим образом.

П.С .: Я знаю, что имена переменных не так хороши XD

FILE *filepointer = fopen(commandlineargument.filtersfile, "r");
int numboflines = 0;
int numbofchars = 0;
char **array = malloc(numboflines + 1);
array[0] = malloc(numbofchars + 1);
char currentchar; 
while(fscanf(filepointer, "%c", &currentchar) != EOF)
{
    if(currentchar != '\n')
    {
        array[numboflines][numbofchars] = currentchar;
        numbofchars++;
        array[numboflines] = realloc(array[numboflines], numbofchars + 1);
    }
    else
    {
        array[numboflines][numbofchars] = '\0';
        numbofchars = 0;
        numboflines++;
        array = realloc(array,  numboflines + 1);
    }
}
array[numboflines] = '\0';
numboflines--;

С помощью приведенного выше кода я могу получить значение array[0][0] и только до того, как оно перераспределится на две строки вниз (тогда array[0][0] указывает на ноль). Я получаю ошибку сегментации позже.

P.S .: Я знаю, что приведенный выше код будет работать правильно, только если последняя строка оканчивается на \n

Пример желаемого вывода:

Содержимое файла:

>Abcde
fghijk
>Lmno
pq

Значения 2D массива:

array[0][0] = ">"
array[2][1] = "L"

и т. Д.

1 Ответ

3 голосов
/ 09 июня 2019

Ваш код в порядке, но в нем есть одно упущение и одна ошибка:

Ошибка: пространство памяти для каждого элемента массива не символ, а указатель на символ, поэтому эта строка:

char **array = malloc(numboflines + 1);

следует переписать так:

char **array = malloc((numboflines + 1)*(sizeof *array));

Пропуск: после окончания строки и массива realloc вы должны неправильно распределить элемент массива:

numboflines++;
array = realloc(array,  numboflines + 1);

становится:

numboflines++;
array = realloc(array,  (numboflines + 1)*(sizeof *array));
array[numboflines] = malloc(numbofchars + 1);
...