二维数组使用 C 中的 realloc() 增加行号和列号
2D array increase row and column number with realloc() in C
我仍在学习 C 中的数组指针和动态内存分配。我在使用 realloc() 方法增加二维数组的列数和行数时遇到了一些麻烦。在这个方法中,我想根据用户输入调整数组大小。
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
您正在取消引用 *(array) = (char *)realloc(array, sizeCol * sizeof *(array)[r]);
行中的 NULL
指针。在 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;
}
我仍在学习 C 中的数组指针和动态内存分配。我在使用 realloc() 方法增加二维数组的列数和行数时遇到了一些麻烦。在这个方法中,我想根据用户输入调整数组大小。
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
您正在取消引用 *(array) = (char *)realloc(array, sizeCol * sizeof *(array)[r]);
行中的 NULL
指针。在 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;
}