C 克隆结构?
我有如下一些结构:C 克隆结构?,c,pointers,struct,glut,deep-copy,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; work是我希望在应用一些过滤器后显示的内容,而original是我可以重置的内容 void load
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
)。我面临的问题是重置不起作用:我应用于工作
的任何内容也应用于原始
,因此我实际上是在重置我要重置的内容
我认为问题在于我的作品=原创
;我对C相当陌生,但我假设我只是把work
指向original
,所以我对work
所做的任何逻辑也应用于original
original.w = 40;
work = original;
work.w = 50;
work = original;
在这种情况下,
work.w
40还是50?如果它确实指向原始,我如何将原始
克隆到工作
,这样我就可以安全地工作工作
,而不会产生原始
的后果?我认为问题在于指向像素数据的指针。当您分配它时,您正在复制存储在原始文件中的值的地址,一旦您使用修改它,原始文件也将被修改。尝试分配一个新的pixelData指针,然后复制其值中的原始内容,而不是复制指向的地址本身。您的结构中有一个pixelData
指针:
original.w = 40;
work = original;
work.w = 50;
work = original;
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);
您希望对源
struct
变量执行“深度复制”(),无需在C中强制转换malloc()
。干杯,这很有帮助。只需更正:memcpy(original.pixelData,work.pixelData,size)代码>应该是memcpy(work.pixelData,original.pixelData,size)代码>,,