如何在C中重新分配二维数组?

时间:2019-02-19 00:01:23

标签: c

我正在进行C编程,其中我从用户读取了列和行的数量,并根据给定的输入创建2D数组,并使用随机值填充条目。如何根据用户输入在2D数组中删除特定列(例如,如果用户要删除第一列,我将如何重新分配矩阵空间?)

#include <stdio.h>
#include <stdlib.h>

double **initializeRandomMatrixPtr(double **a, int rows, int cols) {
    a = malloc(rows * sizeof(double *));
    for (int i = 0; i < rows; i++) {
        *(a + i) = malloc(cols * sizeof(double));
        for (int j = 0; j < cols; j++) {
            *(*(a + i) + j) = rand();
        }
    }
    return a;
}

void printMatrix(double **matrix, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}

void freeMatrix(double **matrix, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
}

int main(void) {
    int rows = -1;
    int cols = -1;
    int deletedColumn = -1;
    // remove first column
    printf("Enter number of rows:");
    scanf("%d", &rows);
    printf("Enter number of cols:");
    scanf("%d", &cols);
    double **matrix = initializeRandomMatrixPtr(matrix, rows, cols);
    printMatrix(matrix, rows, cols);
    freeMatrix(matrix, rows, cols);
    printf("What column do you want to delete?");
    scanf("%d", deletedColumn);
    realloc(matrix, ) // what should I put for my second parameter?
    return 0;
}

1 个答案:

答案 0 :(得分:0)

因为这是家庭作业,所以我实际上不会张贴任何代码:

要重新分配较小的数组1项(整个行或一列),请按以下步骤操作:

  1. 进入您要删除的索引/条目的外部数组,并在该指针上调用free()。这将释放与该行/列/列表关联的所有数据。
  2. 如果希望保持数组连续(可能是连续的),则需要调用memmove(而不是memcpy),或者使用循环循环将外部循环中的指针从删除条目后面的1删除到末尾。外环进入由已删除条目创建的间隙。
  3. 最后,您需要在外部数组上调用realloc,将所需的大小减少1个指针。

您可能还需要通过在指针外部指针数组中至少存储条目数来跟踪此数组的状态-防止您在需要时读取超过新大小的列表的末尾再次打印大小或调整大小。

如果您尝试从另一个方向删除条目(每个分配从外部循环中删除1个条目),则过程类似:

访问外部循环中的每个条目,然后执行以下操作:

  1. 调用memmove()或从条目之外的1开始循环复制以删除到条目(注意不要读取数组末尾的内容)。
  2. 使用新的小1的大小对该条目调用realloc()。