如何将typedef结构复制到另一个?

时间:2019-01-30 14:33:33

标签: c

如何将typedef结构复制到另一个结构中?

如果我有一个名为books的typedef结构,而我有一个名为books first的结构变量。现在,我声明books second如何将第一内容传递给第二?有功能可以做到吗,或者我可以只用second = first来做到这一点?

2 个答案:

答案 0 :(得分:1)

如果firstsecond具有相同的类型,则只需执行second = first;即可。类型是内置的还是用户定义的都没有关系。 C会将first的内容复制到second。试试吧。

通常,C语言中的变量只是具有名称和类型的数据。 如果两个变量ab的类型匹配,则可以将一个分配给另一个:a = b;。 发生的情况是将变量b的值复制到了变量a中。

但是要当心指针:对于C,指针只是带有值的变量(值表示内存地址的事实并不重要,C将所有数据视为相等)。 如果这两个变量恰好是指针,例如char *a; char *b;,则可以将a = b;分配给任何变量。 但是由于变量b的值是内存地址,因此内存地址是从b复制到a的,而不是内存地址处的内存内容。

如果要复制内存,则必须自己完成操作,例如通过memcpy()的帮助(有关信息,请参见其手册页)。

也就是说,如果您的结构包含指针,则指针是内容,而不是指针指向的内容。 C将复制指针值,而不是指针目标。 如果结构中有指针并需要某种深层复制,则必须自行实现结构的遍历。参见What is the difference between a deep copy and a shallow copy?

答案 1 :(得分:1)

如果您的结构不包含任何指针成员(或包含包含该指针的结构),则可以简单地将一个分配给另一个。

second = first;

但是,如果您的结构确实包含指针,那么通过简单的赋值,您最终会得到两个包含指向同一内存的指针的结构,更改其中一个将影响另一个。如果这不是您想要的,则需要进行深层复制。

例如:

struct book {
    char *name;
    int cost;   // in cents, so you don't have to deal with floating point issues
};

struct book first;
first.name = strdup("title1");
first.cost = 500;

struct book second;
second.name = strdup(first.name);
second.cost = first.cost;