gpt4 book ai didi

改变二维动态数组(c中的realloc)

转载 作者:行者123 更新时间:2023-11-30 21:36:41 25 4
gpt4 key购买 nike

我有一个动态二维数组,大小为高*宽。

我想使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com