我可以使用两个变量分配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中实现这样的结果?
答案 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;
}