一般情况下,你不能可靠地做到这一点使用memcpy
,因为编译器允许垫两种结构不同。因此,执行部分复制的最安全方法是单独分配三个字段。
然而,由于编译器只具有不同的对齐要求,在特定情况下成员之间插入填充你可以使用memcpy
这样的:
struct source s {1,2,3,4,5,6};
struct destination d = {100, 200, 300};
memcpy(&d, ((char*)(&s))+offsetof(struct source,d), offsetof(struct source,f)-offsetof(struct source,d)+sizeof(int));
的destination
的d
偏移保证是零,因为它是结构的最初成员。由于成员d
,e
和f
具有相同的对齐要求,所以填充(如果有的话)将会在struct destination
之后以及在struct source
之前或之后跟随它们。
需要转换为char*
,因为偏移量以字节表示。
表达
offsetof(struct source,f)-offsetof(struct source,d)+sizeof(int)
是d
和f
(含)之间的游程的长度。请注意,使用sizeof(struct destination)
是不安全的,因为它可能在末尾有填充,而struct source
中不存在填充,导致读取通过分配的内存。
让我们了解您已经完成的工作。否则,人们会怀疑你试图让他们为你做功课。 – janneb
你为什么要使用memcpy - 这是关于struct packing的作业问题吗? –
如果这是家庭作业,请您添加作业标签吗?谢谢。 – octopusgrabbus