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

时间:2016-02-10 23:08:18

标签: c struct copy ppm

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

我希望能够在不影响另一个结构的情况下更改一个结构的值。

我正在处理读取和编辑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;

}

如何修复错误? 以这种方式复制字段会实现我的目标吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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