复制一个结构体?

3

我有一些像下面这样的结构体:

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

你想要对源struct变量进行“深拷贝”(https://en.wikipedia.org/wiki/Object_copying#Deep_copy)。 - alk
2个回答

4

你的结构体中有一个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);

2
在C语言中,不需要对malloc()进行类型转换。 - alk
非常感谢,这很有帮助。仅更正一点:memcpy(original.pixelData, work.pixelData, size); 应为 memcpy(work.pixelData, original.pixelData, size); - gator

3

我认为问题出在像素数据指针上。当你赋值时,你复制的是原始存储的值的地址,一旦你用它进行修改,原始值也会被修改。尝试分配一个新的pixelData指针,然后将原始内容复制到它的值中,而不是复制指向地址本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接