我对结构比较困惑。有许多复制结构的方法。
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))
我读到上面的方法不安全。因为如果我们改变结构成员的顺序,它就行不通了。没人解释怎么不安全?这让我感到困惑,因为这两个变量都是相同的结构,在本例中,我指定了我想要复制的内容。那为什么不安全?有人能解释一下吗?
发布于 2014-05-23 12:22:32
当然,唯一明智的方法是使用赋值:
c1 = *c2;确实,指向结构的指针c2的实际数值与第一个成员的地址相同。但这并不重要,,。分配中涉及的值的类型都是struct complex,这就是分配所使用的内容,所有所需的位都将被复制。
做不用memcpy()复制一个结构,绝对没有意义!它实际上可以是一个净负值,因为th结构可以包含赋值操作符(作为一个操作符,其代码生成由编译器控制)可以处理和跳过的填充,从而节省时间。函数memcpy()不知道填充,当然,它的工作是复制所有的字节,这就是它要做的。
当然,也不要使用memcpy()复制单个int-sized成员。那只是..。不对,别那么做。
而且,任务是更高层次的,因此更抽象,从而更紧凑和更有效的沟通。
当然,如果结构包含自己的指针(您的结构不包含),则必须注意执行深拷贝,并分配指向数据的新实例,并进行复制。然而,这与实际复制的方式无关。
使用struct赋值。一直都是。
发布于 2014-05-23 11:34:19
您可以通过以下方式更改字段的顺序:
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是一个声明为这里的宏。
发布于 2014-05-23 11:34:28
在这种情况下,更改结构成员的顺序没有任何影响。正如您所提到的,Struct字段是显式的。
当事情变得更复杂时,就更容易犯错误。正如你所做的那样:
memcpy(&c1.real, &c2->real, sizeof(struct complex));它应该是:
memcpy(&c1.real, &c2->real, sizeof(c1.real));越简单越好:
c1.real = c2->real;通过使用memcpy,还有另一个问题:您失去了类型安全性。有时您需要这样做,但通常在处理两个具有相同数据类型的实体时就不这样做了。
https://stackoverflow.com/questions/23827927
复制相似问题