c - 在输入上动态分配二维数组

标签 c arrays

我可以使用两个变量分配一个二维数组。

例如

int x=10;
int y=2;
int **arr;
int=(int*)malloc*(x*y*sizeof(int))

或者:

int x=10;
int y=2;
int **arr;
arr=(int*)malloc(x*sizeof(int))
for( i =0; i<x; i++ ){
    x[i]=(int*)malloc(y*sizeof(int))
}

但是,如果我只有 2D 数组并且我想在每次输入数字时增加其大小怎么办?

例如

int **arr;
int x;
int y;
while ( scanf ("%d%d",&x,&y)){
    arr=(int*)malloc(sizeof(*arr)+1*sizeof(*arr)*1 * sizeof(int))
}

这个例子显然是错误的。我怎样才能在C中达到这样的结果?

最佳答案

这将回答您问题的第一部分(也称为情况一)

//situation one:  one continuous block of memory

//case one - preserving the original pointer (*arr)

int *realoc2d(int *arr,int old_x,int old_y,int new_x,int new_y){
    int x,y,cx,cy;
    int old_size,new_size;
    int *new_arr=NULL,
        *sav_arr;

    old_size=(old_x*old_y*sizeof(int));
    new_size=(new_x*new_y*sizeof(int));

    sav_arr=malloc(old_size);
    if(!sav_arr){
        //handle nomem error;
    }
    memcpy(sav_arr,arr,old_size);

    new_arr=realloc(arr,new_size);
    if(!new_arr){
        //handle nomem error;
    }

    cx=MIN(old_x,new_x);
    cy=MIN(old_y,new_y);

    for(x=0;x<cy;x++)
        for(y=0;y<cy;y++)
            new_arr[x+(y*new_y)]=sav_arr[x+(y*old_y)];

    free(sav_arr);

    return new_arr;

}


//case two - without preserving the original pointer (*arr)

int *realoc2d(int *arr,int old_x,int old_y,int new_x,int new_y){
    int x,y,cx,cy;
    int *new_arr;

    new_arr=malloc(new_x*new_y*sizeof(int));
    if(!new_arr){
        //handle nomem error;
    }

    cx=MIN(old_x,new_x);
    cy=MIN(old_y,new_y);

    for(x=0;x<cy;x++)
        for(y=0;y<cy;y++)
            new_arr[x+(y*new_y)]=arr[x+(y*old_y)];


    return new_arr;

}

关于c - 在输入上动态分配二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33966043/

相关文章:

javascript - 将全局变量作为函数中的参数进行操作

java - 初始化二维对象数组时出现问题

c# - 为什么我在生成 Random() 数字时会得到奇怪的结果?

arrays - 两个数组的配对枚举

c - fscanf while-loop 从不运行

c - 从函数返回后数组内容发生变化

c - 如何在arduino中使用标准c头文件

c - 格式化字节数组

c++ - 为什么 al_draw_textf() 打印数字而不是存储在字符串变量中的字母?

java - 如何从集合中获取 100 个对象?