我有一个动态的二维数组,大小为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中忽略了这一事实,因为它不能更改调用者传入的指针对象。我建议改编原型,使resizerealloc一样返回(可能是新的)指针。

其次,当重新分配每一行时,数组中可能有未初始化的值,可能指向“某处”。重新分配这样的未初始化值是未定义的行为。我建议将“新”行设置为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/

10-13 07:37