将结构的内容复制到另一个

Copying a struct's contents to another

我正在尝试将一个结构的内容复制到另一个相同类型的结构中。

我希望能够更改一个结构的值而不影响另一个结构。

我正在处理阅读和编辑 PPM 文件。我有一个结构:

typedef struct {
    char format[4];
    char comments[MAX_COMMENT_LENGTH];
    int width, height, maxColourValue;
    PPMPixel **pixels;
} PPMImage;

然后我有一个复制函数来复制值,但是在分配不同的字段时出现错误。

我正在尝试将 newPPM 的字段复制到 messagePPM 中。

错误:

incompatible types when assigning to type 'char[4]' from type 'char *'
    messagePPM->format = newPPM->format;
incompatible types when assigning to type 'char[100]' from type 'char *'
    messagePPM->comments = newPPM->comments;

复制函数:

//A function to copy contents of one PPMImage to another
void copyPPM(PPMImage *newPPM, PPMImage *messagePPM) {

    messagePPM->format = newPPM->format;
    messagePPM->comments = newPPM->comments;
    messagePPM->width = newPPM->width;
    messagePPM->height = newPPM->height;
    messagePPM->maxColourValue = newPPM->maxColourValue;
    messagePPM->pixels = newPPM->pixels;

}

如何解决我的错误? 以这种方式复制字段是否会实现我的目标?

你可以简单地做 a = b,其中和 b 是 PPImage 类型的变量。

您可以通过简单的赋值将一个结构的内容复制到另一个:

void copyPPM(PPMImage *newPPM, PPMImage *messagePPM)  {
    *newPPM = *messagePPM;
}

这意味着您甚至不需要函数。

然而这些结构将共享 pixels 数组。如果你想复制它,你将需要分配一个副本并复制内容。

将一个结构复制到另一个结构上也可能会导致 pixels 目标数组丢失。

如果要对结构进行深拷贝,需要这样为像素分配新的数组:

void copyPPM(PPMImage *newPPM, PPMImage *messagePPM)  {
    *newPPM = *messagePPM;
    if (newPPM->pixels) {
        newPPM->pixels = malloc(newPPM->height * sizeof(*newPPM->pixels));
        for (int i = 0; i < newPPM->height; i++) {
            newPPM->pixels[i] = malloc(newPPM->width * sizeof(*newPPM->pixels[i]);
            memcpy(newPPM->pixels[i], messagePPM->pixels[i],
                   newPPM->width * sizeof(*newPPM->pixels[i]));
        }
    }
}