克隆结构?

时间:2015-10-07 15:30:18

标签: c pointers struct glut deep-copy

我有一些结构如下:

typedef struct {
    GLubyte red, green, blue;
} pixel;

typedef struct {
    pixel *pixelData;
    int w, h;
} imagen;

用于图像加载器和图像处理器(将滤镜应用于加载的图像)。

我正在初始化两个imagen

imagen work, original;
在应用了一些过滤器之后我想要显示

workoriginal是我可以重置的内容。

void loadImage() {
    //load data into (imagen)original
}
work = original;

加载图片后,我将其复制到work,以便我可以保留原件的副本,如果我想稍后重置(再次重置为work = original)。我面临的问题是重置不起作用:我应用于work的任何内容也适用于original,因此我实际上正在重置为我正在重置的内容。

我认为问题是我的work = original;我对C很新,但我假设我只是work指向original,所以我在work上执行的任何逻辑也都应用于original

original.w = 40;
work = original;
work.w = 50;
work = original;

在这种情况下,work.w是40还是50?如果它确实指向原始版本,我该如何将original克隆到work上,这样我才能安全地处理work而不会导致original

2 个答案:

答案 0 :(得分:4)

你的结构中有一个false指针:

pixelData

要创建完全独立的副本,您需要复制typedef struct { pixel *pixelData; int w, h; } imagen; 指向的数据:

pixelData

另请注意,当您不再需要它时,您必须释放已分配的内存:

work.w = original.w;
work.h = original.h;
size_t size = sizeof(pixel) * work.w * work.h;
work.pixelData = (pixel*)malloc(size);
memcpy(original.pixelData, work.pixelData, size);

答案 1 :(得分:3)

我认为问题在于指向pixeldata的指针。当您指定它时,您正在复制存储在原始文件中的值的地址,一旦您修改它,原始文件也会被修改。尝试分配一个新的pixelData指针,然后在其值中复制原始内容,而不是复制指向的地址本身。