我有一些结构如下:
typedef struct {
GLubyte red, green, blue;
} pixel;
typedef struct {
pixel *pixelData;
int w, h;
} imagen;
用于图像加载器和图像处理器(将滤镜应用于加载的图像)。
我正在初始化两个imagen
:
imagen work, original;
在应用了一些过滤器之后我想要显示 work
,original
是我可以重置的内容。
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
?
答案 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指针,然后在其值中复制原始内容,而不是复制指向的地址本身。