1

主题的标题也可以是“size_t 是否足以容纳一个地址?”

我正在尝试获取结构和其中一个字段之间的偏移量,并且我正在使用 size_t 变量来保存偏移量:

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

我知道这有点强迫,我只是想知道我以后是否会因此而遇到某种错误。我知道我可以使用 int 做同样的事情,但我想知道它是否可以在 64 位系统上保存地址。

您对此有何看法?

4

4 回答 4

7

使用. offsetof_<stddef.h>

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

于 2011-03-16T17:49:11.803 回答
3

使用#include <stddef.h> ... offsetof(struct foo, field). 它被定义为 type size_tsize_t不一定大到足以容纳任何地址,但它大到足以容纳结构中的任何偏移量,因为它大到足以容纳 sizeof(any struct)。

于 2011-03-16T17:49:36.827 回答
0

要手动执行此操作,您可能会考虑先进行指针减法,然后再进行size_t强制转换,如下所示:

size_t offset = (size_t)((void*)&struct.field - (void*)&struct);
于 2011-03-16T17:52:00.153 回答
0

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

由于代码的寿命往往比我们想象的要长,因此一些维护工作最终会修复其中一个值的可能性几乎是肯定的。这样做会对(很久以后)对现场秩序的更新造成严重破坏。

我已经维护了这样的代码。我的建议是用不同的方式来做,而不需要知道代码中的确切字段对齐方式。

于 2011-03-16T17:52:58.170 回答