1

我正在尝试将一个结构的内容复制到另一个临时结构,这样我就可以在不影响结果的情况下更改临时结构的 RGB 像素(如果我更改了全局像素)。

代码结构

//the pixel structure
typedef struct {
    GLubyte r, g, b;
} pixel;

//the global structure
typedef struct {
    pixel *data;
    int w, h;
} glob;
glob global, original, temp;

我的复制代码

void copyPic(glob *source, glob *dest){
    int x,y;
    dest -> w = source -> w;
    dest -> h = source -> h;
    dest -> data = (pixel *) malloc(dest->w * dest->h * sizeof(pixel*));
    for (x=0; x < dest -> w; x++)
        for (y=0; y < dest -> h; y++){
            memcpy(dest->data[x+y*dest->w], source->data[x+y*dest->w], sizeof(pixel))

        }

}

想法:glob 结构保存图像宽度、高度和像素*数据,它是指向 R、G、B 值数组的指针。

我想将全局复制到临时,因此当我更改 temp->data 的 RGB 时,它不会影响当前正在执行的代码,并且基于将 RGB 更改为 global->data 的 RGB。

新代码

void copyPic(glob *src, glob *dest){

dest -> w = src -> w;
dest -> h = src -> h;
dest -> data = (pixel *) malloc(dest->w * dest->h * sizeof(pixel));

memcpy(dest->data, src->data, sizeof(pixel) * dest->w  * dest->h);

}

我必须释放任何东西吗?

4

2 回答 2

2

你打memcpy了很多次电话(w * h)。我建议你只复制一次

memcpy(dest->data, source->data, sizeof(pixel) * w * h);
于 2013-10-07T21:48:48.967 回答
0

首先:你的 API 不是很合作。通过分配给 dest->data,您可能会覆盖其先前的内容,从而:泄漏内存。如果您的唯一目的是复制结构对象(使用深拷贝),恕我直言,将其实现为dup操作将更加健壮,例如:

glob * dup_the_Pic(glob *src) {
glob * dst;

  dest = malloc (sizeof *dst);
  // maybe check for malloc failure here
  memcpy (dst,src, sizeof *dst);

  dst->data = malloc(dst->w * dst->h * sizeof *dst->data);
  // maybe check for malloc failure here, too
  memcpy(dst->data, src->data, dst->w  * dst->h * sizeof *dst->data);

return dst;
}

被称为:

glob *the_original, *the_copy;

the_original = read_thing_from_file( ...);

the_copy = dup_the_Pic(the_original);
do_stuff_with_the_pic(the_copy);
于 2013-10-07T23:43:15.517 回答