2D数组在C中使用realloc()增加行数和列数

时间:2018-11-29 18:24:01

标签: c arrays multidimensional-array dynamic-memory-allocation realloc

我仍在学习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 :(得分: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;
}