我有一个动态二维数组,大小为高*宽。
我想使用 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 的返回值要么指向“旧”内存块(如果不需要移动),要么指向新 block (如果需要移动),或者如果发生错误则指向 NULL。然而,您在 resize
中忽略了这一事实,因为它无法更改调用者传入的指针对象。我建议调整原型(prototype),以便 resize
返回一个(可能是新的) ) 指针,就像 realloc
一样。
其次,当重新分配每一行时,数组中可能存在未初始化的值,可能指向“某处”。重新分配此类未初始化的值是未定义的行为。我建议将"new"行设置为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中的realloc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46640859/