Вы разыменовываете указатель 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;
}