复制结构成员

我对结构更加困惑。 复制结构的方法有很多种。

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))

我读到上述方法并不安全。 因为如果我们改变结构成员的顺序它将不起作用。 没人解释怎么不安全? 它让我感到困惑,因为两个变量都是相同的结构,我指的是我要复制的东西[在这种情况下是真实的]。 那么为什么不安全呢? 有人可以解释一下吗?

当然唯一合理的方法是使用赋值:

 c1 = *c2; 

确实, c2 (指向结构的指针)的实际数值与第一个成员的地址相同。 但这没关系 。 赋值中涉及的值的类型都是struct complex ,即赋值所使用的,并且将复制所有需要的位。

不要使用memcpy()来复制结构,绝对没有意义! 它实际上可以是净负数,因为结构可以包含填充,赋值运算符(作为运算符,其代码生成由编译器为此特定用法控制)可以处理和跳过,从而节省时间。 函数memcpy()当然不知道填充,它的工作是复制所有字节,这就是它将要做的事情。

当然,也不要使用memcpy()来复制单个的int -sized成员。 那只是……不对,不要这样做。

此外,分配更高级,因此更抽象,因此更紧凑并且更有效地进行通信。

当然,如果结构包含它自己的指针(你的没有),你必须注意做一个深层复制 ,并分配指向数据的新实例并复制它。 这与实际复制的方式无关。

使用struct分配。 总是。

我以下列方式更改字段的顺序:

 struct complex { int imaginary; int real; ); 

然后memcpy(&c1.real, &c2->real, sizeof(struct complex))将尝试从real 开始复制字段,并且您尝试复制的字节数是整个结构的大小,它将在访问内存之后结构因此在某些情况下导致无效的内存访问,在某些情况下它不会产生任何错误。 但这次行动的结果并不是你所期望的。 对于那些,它不会复制imaginary的字段。

如果您需要复制部分结构 – 这是这样做的方法:

 memcpy(&c1.real, &c2->real, sizeof(struct complex) - offsetof(struct complex, real)); 

其中offsetof是一个像这里声明的宏。

在这种情况下,更改结构成员的顺序无效。 正如您所提到的,结构字段已明确说明。

当事情变得更复杂时,犯错更容易。 就像你做的那样:

 memcpy(&c1.real, &c2->real, sizeof(struct complex)); 

应该是:

 memcpy(&c1.real, &c2->real, sizeof(c1.real)); 

更简单更好:

 c1.real = c2->real; 

通过使用memcpy还有另一个问题; 你失去了类型安全。 有时您需要这样,但通常在使用具有相同数据类型的2个实体时不会。

memcpy(&c1.real, &c2->real, sizeof(struct complex))非常奇怪,因为机器人类型是primefaces的,所以不需要那种复制。 sizeof(struct complex)也是错误的,因为它应该是sizeof(int) (它只是整个结构的1/2大小)简单的赋值就足够了:

 c1.real = c2->real;