二维数组使用 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;
}