我仍在学习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
答案 0 :(得分:0)
您要取消引用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;
}