【问题标题】:Copying a struct's contents to another将结构的内容复制到另一个
【发布时间】:2016-05-21 13:09:17
【问题描述】:

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

我希望能够更改一个结构的值,但以后不会影响另一个结构。

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

}

如何解决我的错误? 以这种方式复制字段会达到我的目标吗?

【问题讨论】:

  • 您应该使用 memcpy 来复制 format 和 cmets 字段的值。如果值以 null 结尾,则可以使用 strcpy。
  • 这里已经回答了:- stackoverflow.com/questions/4931123/…
  • @bruceg 感谢您的提示,这解决了我的错误消息。

标签: c struct copy ppm


【解决方案1】:

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

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

【讨论】:

  • 我将如何复制数组以便在每个结构中都有一个版本?它是一个对每个单元格使用 malloc 并指向一个像素的数组,因此它的工作方式类似于一个二维像素数组。
【解决方案2】:

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

【讨论】:

  • 这只是复制地址,你的意思是*a = *b吗?
  • 那么在这种情况下,这是使 a 的字段指向 b 的字段指向的内容,还是实际上复制了这些值?我是 C 新手,但仍在尝试理解整个指针。
  • @CecilioPardo、ab是函数中的指针,所以需要解引用。
  • @Porteous96:它对结构进行逐位复制,复制所有值。
  • @AlterMann:我知道,在我的回答中我说它们是结构类型的变量。他不需要这样的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多