我对结构更加困惑。有很多方法可以复制结构。
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))
我读到上述方法并不安全。因为如果我们改变结构成员的顺序它就不会起作用。没人解释怎么不安全?它让我困惑,因为两个变量都是相同的结构,我正在指定我要复制的内容[在这种情况下是真实的]。那为什么不安全?有人可以解释一下吗?
答案 0 :(得分:2)
当然唯一合理的方法是使用作业:
c1 = *c2;
确实,c2
的实际数值(一个指向结构的指针)与第一个成员的地址相同。但是并不重要。赋值中涉及的值的类型都是struct complex
,这是分配正在使用的内容,所有需要的位都将被复制。
不使用memcpy()
复制结构,绝对没有意义!它实际上可以是净负数,因为结构可以包含填充,赋值运算符(作为运算符,其代码生成由编译器为此特定用法控制)可以处理和跳过,从而节省时间。函数memcpy()
当然不知道填充,它的工作是复制所有字节,这就是它将要做的事情。
当然,不使用memcpy()
复制单个int
大小的成员。那只是......不对,不要这样做。
此外,分配更高层次,因此更抽象,因此更紧凑,更有效地沟通。
当然,如果结构包含自己的指针(你的没有),你必须注意做一个deep copy,并分配指向数据的新实例并复制它。这与实际复制的方式无关。
使用struct
作业。总是
答案 1 :(得分:0)
我以下列方式更改字段的顺序:
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
是一个声明为here的宏。
答案 2 :(得分:0)
在这种情况下,更改结构成员的顺序无效。正如您所提到的那样,明确说明了结构字段。
当事情变得更复杂时,犯错更容易。正如你所做的那样:
memcpy(&c1.real, &c2->real, sizeof(struct complex));
应该是:
memcpy(&c1.real, &c2->real, sizeof(c1.real));
更简单更好:
c1.real = c2->real;
使用memcpy
还有另一个问题;你失去了类型安全。有时您需要这样,但通常不使用具有相同数据类型的2个实体。
答案 3 :(得分:0)
memcpy(&c1.real, &c2->real, sizeof(struct complex))
非常奇怪,因为机器人类型是原子的,所以不需要那种复制。另外sizeof(struct complex)
是错误的,因为它应该是sizeof(int)
(它只是整个结构的1/2尺寸)
简单的分配就足够了:
c1.real = c2->real;