在输入上动态分配2D数组

时间:2015-11-27 23:35:56

标签: c arrays

我可以使用两个变量分配2D数组。

e.g。

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 aray并且每次输入数字时我想增加它的大小怎么办?

e.g。

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

这个例子显然是错误的。如何在C中实现这样的结果?

1 个答案:

答案 0 :(得分:0)

这将回答你问题的第一部分(又称情况一)

//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;

}