克隆结构?
Cloning a struct?
我有一些像下面这样的结构:
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
?
我认为问题出在指向像素数据的指针上。当你分配它时,你正在复制存储在原始值中的地址,一旦你修改它,原始值也会被修改。尝试分配一个新的 pixelData 指针,然后复制其值中的原始内容,而不是复制指向的地址本身。
您的结构中有一个 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);
另请注意,当您不再需要它时,您必须释放分配的内存:
free(work.pixelData);
我有一些像下面这样的结构:
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
?
我认为问题出在指向像素数据的指针上。当你分配它时,你正在复制存储在原始值中的地址,一旦你修改它,原始值也会被修改。尝试分配一个新的 pixelData 指针,然后复制其值中的原始内容,而不是复制指向的地址本身。
您的结构中有一个 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);
另请注意,当您不再需要它时,您必须释放分配的内存:
free(work.pixelData);