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

标签 c arrays malloc realloc

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

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

相关文章:

c - fork() 和 waitpid 可能的输出

c - 如何在 linux 终端上用 C 打印这段代码中的所有字符?

c - c中的unicode字符串操作

c - 为结构中的数组分配内存(在 C 中)

java - 无法在 mac os x 上分配内存错误 - java(xx,xx) malloc : *** mmap(size=XX) failed (error code=12)

C K&R : printf pointer = nil?

c - 从 C 中的函数传递和返回 2 个数组

c - 如何从文件名的字符串数组中读取文件?

javascript - 根据选项将 axios.get URL 传递到 axios.all

c++11 - make_unique 的异常感知 malloc 版本