2D массив увеличивает номер строки и столбца с помощью realloc () в C - PullRequest
0 голосов
/ 29 ноября 2018

Я все еще изучаю указатели массива в C и динамическое распределение памяти.У меня возникли проблемы с использованием метода realloc () для увеличения количества столбцов, а затем строк 2D-массива.В этом методе я хочу настроить размер массива в соответствии с пользовательским вводом.

char **read(int *rows, int *columns){
        char **array = NULL;
        char input;
        int sizeRow = 0;
        int sizeCol = 0;
        int r = 0;
        int c;
        do{
            for(c = 0; ((input = getchar()) != '\n'); ++c){
                if (c == sizeCol) {
                    sizeCol = 1 + sizeCol * 3/2;
                    *(array) = (char *)realloc(array, sizeCol * sizeof *(array)[r]);
                }
                array[r][c] = input;
            }
            if (r == sizeRow) {
                    sizeRow = 1 + sizeRow * 3/2;
                    array = (char **)realloc(array, sizeRow * sizeof **array);
                }
            r++;
        }while (input != EOF);
        return array;
    }

Я получаю следующую ошибку: Ошибка сегментации: 11

1 Ответ

0 голосов
/ 30 ноября 2018

Вы разыменовываете указатель NULL в строке *(array) = (char *)realloc(array, sizeCol * sizeof *(array)[r]);.На первой итерации цикла do-while, array все еще NULL в этой точке, поэтому *(array) вызывает ошибку сегмента.Просто поменяйте местами порядок блоков if (r == sizeRow) { ... } и for(c = 0; ((input = getchar()) != '\n'); ++c) { ... }.

Есть и еще три проблемы, которые я заметил:

  • *(array) = (char *)realloc(array, sizeCol * sizeof *(array)[r]); должно быть *(array) = (char *)realloc(*array, sizeCol * sizeof *(array)[r]);

  • array = (char **)realloc(array, sizeRow * sizeof **array); должно быть array = (char **)realloc(array, sizeRow * sizeof *array);

  • Цикл do-while никогда не прекратится.Чтобы завершить цикл for, input ДОЛЖЕН быть равен '\n'.Поскольку вход не назначается снова в цикле do-while, когда он дойдет до конца, он НИКОГДА не будет равен EOF и, следовательно, ВСЕГДА будет продолжаться.

РЕДАКТИРОВАТЬ: еще одна проблема:поменяйте местами код перестановки строк, чтобы обнулить вновь выделенную часть массива:

if (r == sizeRow) {
    int newSizeRow = 1 + sizeRow * 3/2;
    array = (char **)realloc(array, newSizeRow * sizeof *array);
    memset(&array[sizeRow], 0, newSizeRow - sizeRow);
    sizeRow = newSizeRow;
}
...