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),,