【问题标题】:C deep copy struct with pointer带指针的 C 深拷贝结构
【发布时间】:2016-04-19 07:26:51
【问题描述】:

我是 C 新手,需要解决以下问题。

我有一个项目正在读取一个小的 bmp (512x512) 图像。我已经设法改变颜色并将其镜像(水平和垂直)。虽然我现在需要它转-90°。我无法使用的功能是 deepCopyBitmap()

我在*copy->raster[i] 上不断收到以下错误:

indirection requires pointer operand ('PIXEL' (aka 'struct _pixel') invalid)

旋转 (512x512)

typedef struct _pixel {
    unsigned char blue;
    unsigned char green;
    unsigned char red;
} PIXEL;

typedef struct _bitmap {
    char file_path[PATH_MAX+1];
    char magic_number[3];
    unsigned int size;
    unsigned char application[5];
    unsigned int start_offset;
    unsigned int bitmapHeaderSize;
    unsigned int width;
    unsigned int height;
    unsigned short int depth;
    unsigned  char* header;
    PIXEL* raster;
} BITMAP;

void rotate(BITMAP* bmp) {
    int i;
    int j;
    PIXEL* originalPixel;
    BITMAP* originalBmp;

    deepCopyBitmap(bmp, originalBmp);

    for(j=1; j <= bmp->height; j++) {
        for(i=1; i <= bmp->width; i++) {
            originalPixel=getPixel(originalBmp->raster, bmp->width, bmp->height, j, i);
            setPixel(bmp->raster, bmp->width, bmp->height, (bmp->width + 1 - i), j, originalPixel);
        }
    }                  
}

void deepCopyBitmap(BITMAP* bmp, BITMAP* copy) {
    *copy = *bmp;
    if (copy->raster) {
        copy->raster = malloc(sizeof(*copy->raster));
        for (int i = 0; i < copy->height; i++) {
            copy->raster[i] = malloc(sizeof(*copy->raster[i]));
            memcpy(copy->raster[i], bmp->raster[i], sizeof(*copy->raster[i]));
        }
    }
}

更新

void deepCopyBitmap(BITMAP* bmp, BITMAP* copy) {
    copy = malloc(sizeof(BITMAP));
    *copy = *bmp;
    if (copy->raster) {
        size_t total_size = copy->height * copy->width * sizeof(PIXEL);
        copy->raster = malloc(total_size);
        memcpy(copy->raster, bmp->raster, total_size);
    }
}

【问题讨论】:

  • copy-&gt;raster 应该是指向具有 512 个元素的数组的指针,还是指向具有 512 个 PIXEL 元素(= 锯齿状数组)的数组的指针,还是指向 262144 个 PIXEL 元素的单个数组的指针?我问,因为双 malloc 似乎暗示前者,但数据类型 PIXEL* 后者。
  • copy-&gt;raster[i] 是值,而不是指针。因为raster 是一维数组。
  • 栅格是一维数组,有 262144 个 PIXEL 元素
  • 您没有在rotate 函数中为originalBmp 分配内存,这意味着deepCopyBitmap 中的*copy = *bmp; 会导致未定义的行为(=很可能会崩溃)。如果deepCopyBitmap 也将malloc 内存用于实际的BITMAP 结构,那将是合乎逻辑的。
  • @user694733 我添加了 copy = malloc(sizeof(BITMAP));。虽然在运行时,我得到 Segmentation fault: 11;

标签: c struct deep-copy


【解决方案1】:

你这里只分配一个PIXEL

        copy->raster = malloc(sizeof(*copy->raster));

但是,您至少需要 copy-&gt;height PIXELs 才能使此迭代生效:

        for (int i = 0; i < copy->height; i++) {

这里,你再分配一个PIXEL

            copy->raster[i] = malloc(sizeof(*copy->raster[i]));

但是,你可能打算复制copy-&gt;widthPIXELs,而不是一个:

            memcpy(copy->raster[i], bmp->raster[i], sizeof(*copy->raster[i]));
        }

你真正想做的是分配copy-&gt;height * copy-&gt;widthPIXELs,然后从原来的复制它们。

        size_t total_size = copy->height * copy->width * sizeof(PIXEL);
        copy->raster = malloc(total_size);
        memcpy(copy->raster, bmp->raster, total_size);

【讨论】:

  • 我尝试了最后一部分,总尺寸。但是我仍然需要遍历复制中的每个像素->光栅对吗?
  • 目前我收到错误:RUN FINISHED;总线错误:10;实时:320ms;用户:0ms;系统:0ms
  • @PeterVanGorp 不,你不应该循环。如您所见,memcpy 已经使用total_size 参数复制了所有像素。
  • memcpy 为您进行迭代。
  • 好的,我现在明白了。所以就这么简单(参见上面的更新代码)。虽然在运行时我得到以下信息: RUN FINISHED;总线错误:10;实时:300ms;用户:0ms;系统:0ms
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 2022-01-09
  • 2016-12-18
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多