【问题标题】:2D array increase row and column number with realloc() in C二维数组在 C 中使用 realloc() 增加行数和列数
【发布时间】:2019-05-01 21:21:48
【问题描述】:

我仍在学习 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

【问题讨论】:

  • 什么是w,你是说r吗?
  • 您需要重新考虑您的逻辑流程。如果array 为NULL,当你做*(array) 时会发生什么?
  • 详细信息 char **Array 不是二维数组。那是pointer to pointer to charchar TwoD[3][4]; 是一个二维数组。
  • 注意for(c = 0; ((input = getchar()) != '\n'); ++c){...}在遇到文件结束时是一个无限循环。
  • 你想要一个 string 指针数组吗?调用代码应该如何确定读取的行数?可能会附加一个最终的 NULL 指针作为最后一个字符串指针。

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


【解决方案1】:

您正在取消引用 *(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;
}

【讨论】:

  • 我现在收到此错误:malloc: *** 对象 0x8000000000000000 的错误:未分配重新分配的指针 *** 在 malloc_error_break 中设置断点以调试 Abort 陷阱:6
  • 哦,是的,还有一个小问题。 realloc() 不会将“新”内存归零,因此当您尝试重新分配垃圾时,嵌套的重新分配会中断。我将添加答案,因为代码块在 cmets 中不起作用
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 2016-01-05
  • 1970-01-01
  • 2021-10-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多