我有一个动态的二维数组,大小为height * width。
我想通过使用realloc更改数组大小。
这是我的代码,但是不起作用。
我该怎么办?帮我!!
int main(){
char **img;
img = (char**)malloc(sizeof(char*)*height);
for(i=0;i<height;i++){
img[i] = (char*) malloc(sizeof(char)*width);
}
resize(height*2, width*2, img);
}
void resize(int height, int width, char **img){
int i;
img = (char**)realloc(img, sizeof(char)*height);
for(i=0;i<h;i++){
img[i] = (char*)realloc(img[i], width);
}
}
最佳答案
有两个主要问题。首先,realloc
可以将存储块移动到新位置。因此,realloc
的返回值指向“旧”存储块(如果不需要移动),指向新块(如果需要移动)或NULL(如果发生错误)。但是您在resize
中忽略了这一事实,因为它不能更改调用者传入的指针对象。我建议改编原型,使resize
像realloc
一样返回(可能是新的)指针。
其次,当重新分配每一行时,数组中可能有未初始化的值,可能指向“某处”。重新分配这样的未初始化值是未定义的行为。我建议将“新”行设置为NULL
,以便realloc
之后可以正确运行。因此,有必要知道“旧”高度,因为否则您将没有机会将常规初始化的指针与“垃圾”指针区分开。
请参阅改编的代码。希望能帮助到你。
char** resize(int oldHeight, int oldWidth, int height, int width, char **img){
int i;
img = realloc(img, sizeof(char)*height);
for (int i=oldHeight; i<height; i++)
img[i] = NULL;
for(i=0;i<height;i++){
img[i] = realloc(img[i], width);
for (int col=oldWidth; col < width; col++) {
img[i][col] = 0;
}
}
return img;
}
int main(){
int height = 10;
int width = 20;
char **img;
img = malloc(sizeof(char*)*height);
for(int i=0;i<height;i++){
img[i] = malloc(sizeof(char)*width);
}
img = resize(height, width, height*2, width*2, img);
}
关于c - 更改二维动态数组(在c中重新分配),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46640859/