需要获取结构和其中一个结构之间的偏移量';C中的s字段

需要获取结构和其中一个结构之间的偏移量';C中的s字段,c,struct,field,offset,memory-address,C,Struct,Field,Offset,Memory Address,主题的标题也可以是“大小是否足以容纳地址?” 我试图获取结构和其中一个字段之间的偏移量,并使用一个size\u t变量来保存偏移量: size_t offset = (size_t)&struct.field - (size_t)&struct; 我知道这是一种强迫,我只是想知道我以后是否会因为这个而遇到某种错误。我知道我可以用int做同样的事情,但我想知道它是否能在64位系统上保存地址 您对此有何想法?使用中的宏的偏移量 由于大小\u t必须有足够大的范围来存储最大可能对象的

主题的标题也可以是“大小是否足以容纳地址?”

我试图获取结构和其中一个字段之间的偏移量,并使用一个size\u t变量来保存偏移量:

size_t offset = (size_t)&struct.field - (size_t)&struct;
我知道这是一种强迫,我只是想知道我以后是否会因为这个而遇到某种错误。我知道我可以用int做同样的事情,但我想知道它是否能在64位系统上保存地址


您对此有何想法?

使用
中的
宏的偏移量


由于
大小\u t
必须有足够大的范围来存储最大可能对象的大小,因此它也足够大以存储任何结构类型的任何成员的偏移量:结构成员的偏移量不能大于结构的大小。

使用
中的
偏移量


由于
size\u t
必须有足够大的范围来存储最大可能对象的大小,因此它也足够大以存储任何结构类型的任何成员的偏移量:结构成员的偏移量不能大于结构的大小。

使用
\include。。。偏移量(结构foo,字段)
。它被定义为类型
size\u t
<代码>大小不一定大到足以容纳任何地址,但它大到足以容纳结构中的任何偏移量,因为它大到足以容纳(任何结构)的大小。

使用
\35;包含。。。偏移量(结构foo,字段)
。它被定义为类型
size\u t
<代码> SigZyt < /Cord>不一定足够大,可以容纳任何地址,但它足够大,可以在结构中保存任何偏移量,因为它足够大,可以容纳siZof(任何结构)。

< P>手动完成此操作,您可以考虑首先执行指针减法,而<代码> SiZeStIt <代码>第二次,如:

size_t offset = (size_t)((void*)&struct.field - (void*)&struct);

手动完成此操作,您可以先考虑指针减法和<代码> SIZEZT < /代码>第二次,如:

size_t offset = (size_t)((void*)&struct.field - (void*)&struct);
只要所有项在编译时都是“固定”的,您就安全了。然而,您的代码将很难维护,通常应该避免以这种方式进行操作。它有将代码绑定到特定体系结构的风险,因为如果所有其他计算的偏移量没有适当更新,最终其中一个字段将发生更改,从而产生问题

由于代码的寿命往往比我们想象的要长,一些维护工作最终修复其中一个值的可能性几乎是肯定的。这样做会对字段顺序的更新造成严重破坏

我维护了这样的代码。我的建议是采用另一种方式,不需要知道代码中字段的精确对齐方式。

只要所有项在编译时都是“固定”的,您就安全了。然而,您的代码将很难维护,通常应该避免以这种方式进行操作。它有将代码绑定到特定体系结构的风险,因为如果所有其他计算的偏移量没有适当更新,最终其中一个字段将发生更改,从而产生问题

由于代码的寿命往往比我们想象的要长,一些维护工作最终修复其中一个值的可能性几乎是肯定的。这样做会对字段顺序的更新造成严重破坏

我维护了这样的代码。我的建议是以不同的方式进行,而不需要知道代码中的精确字段对齐