我更困惑于结构。有很多方法可以复制结构。
struct complex
{
int real;
int imaginary;
};
Assume c1 is complex structure variable. c2 is pointer of complex type.
一种方法是简单地将一个结构分配给另一个结构。
c1=*c2
。我试过了。它工作得很好。但c2将给出结构复合体的第一个元素的地址。那么整个结构将如何复制?我是不是更迷恋指针?
另一种方法是使用
memcpy
memcpy(&c1,c2,sizeof(struct complex))
。我怀疑的是成员结构的复制。
memcpy(&c1.real, &c2->real, sizeof(struct complex))
我听说上述方法不安全。因为如果我们改变结构成员的顺序,它就不起作用。没人解释为什么不安全?这让我很困惑,因为这两个变量都是相同的结构,我正在指定我要复制的内容[在本例中为real]。那为什么不安全呢?有人能解释一下吗?
最佳答案
当然,唯一明智的方法是使用作业:
c1 = *c2;
确实,指向结构的指针
c2
的实际数值与第一个成员的地址相同。但那不重要。赋值涉及的值的类型都是struct complex
,这就是赋值的工作方式,所有需要的位都将被复制。不要使用
memcpy()
来复制结构,这绝对没有意义!事实上,它可以是一个净负数,因为th结构可以包含赋值运算符(作为一个运算符,其代码生成由编译器针对这种特定用法控制)可以处理和跳过的填充,从而节省时间。当然,函数memcpy()
不知道填充,它的工作是复制所有字节,这就是它要做的。当然,也不要使用
memcpy()
来复制单个int
大小的成员。只是。。。不对,别那么做。此外,分配是更高层次的,因此更抽象,因此更紧凑,交流更有效。
当然,如果结构包含自己的指针(您的不包含),则必须注意执行deep copy,并分配指向数据的新实例并复制该实例。不过,这与实际的复制方式无关。
使用
struct
赋值。总是。关于c - 复制结构成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23827927/