如何将typedef结构复制到另一个结构中?
如果我有一个名为books
的typedef结构,而我有一个名为books first
的结构变量。现在,我声明books second
如何将第一内容传递给第二?有功能可以做到吗,或者我可以只用second = first
来做到这一点?
答案 0 :(得分:1)
如果first
和second
具有相同的类型,则只需执行second = first;
即可。类型是内置的还是用户定义的都没有关系。 C会将first
的内容复制到second
。试试吧。
通常,C语言中的变量只是具有名称和类型的数据。
如果两个变量a
和b
的类型匹配,则可以将一个分配给另一个: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;