克隆结构?

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