gpt4 book ai didi

c - 如何使用 'memcpy' 在不同结构之间执行 'offsetof'?

转载 作者:太空宇宙 更新时间:2023-11-04 00:53:31 25 4
gpt4 key购买 nike

我有以下两个结构。我需要复制 d, e, f来自 sourcedestination使用 memcpyoffsetof .我该怎么做?

struct source
{
int a;
int b;
int c;
int d;
int e;
int f;
};

struct destination
{
int d;
int e;
int f;
};

最佳答案

通常,您不能使用 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));

destinationd 的偏移量保证为零,因为它是结构的初始成员。由于成员 def 具有相同的对齐要求,因此填充(如果有)将在 结构中排在它们之后destination,以及在 struct source 中它们之前或之后。

转换为 char* 是必需的,因为偏移量以字节表示。

表达式

offsetof(struct source,f)-offsetof(struct source,d)+sizeof(int)

df 之间的运行长度,包括在内。请注意,使用 sizeof(struct destination) 是不安全的,因为它可能在末尾有填充,这在 struct source 中不存在,导致读取超过分配的内存。

关于c - 如何使用 'memcpy' 在不同结构之间执行 'offsetof'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10534292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com