offsetof

来自cppreference.com
< c‎ | types
定义于头文件 <stddef.h>
#define offsetof(type, member) /*implementation-defined*/

offsetof 展开成 size_t 类型的整数常量表达式,其值为从指定类型对象起始到其指定子对象的偏移,若填充存在则包含之。

给定拥有静态存储期的 type 类型对象 o&(o.member) 应当为地址常量表达式并指向 o 的子对象。否则行为未定义。

若在 type 中定义新类型,则行为未定义。

(C23 起)

注解

若将 offsetof 应用到位域成员,则行为未定义,因为不能取位域的地址。

不限制 member 为直接成员。它能指代给定成员的子对象,例如数组成员的元素。

尽管 C23 中指定在 offsetof 中定义新类型为未定义行为,这种用法在较早模式的实现中也仅受到部分支持: offsetof(struct Foo { int a; }, a) 通常得到支持,但 offsetof(struct Foo { int a, b; }, a) 不如此,因为 struct Foo 定义中的逗号。

示例

#include <stdio.h>
#include <stddef.h>
 
struct S {
    char c;
    double d;
};
 
int main(void)
{
    printf("the first element is at offset %zu\n", offsetof(struct S, c));
    printf("the double is at offset %zu\n", offsetof(struct S, d));
}

可能的输出:

the first element is at offset 0
the double is at offset 8

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C 标准。

DR 应用于 出版时的行为 正确行为
DR 496 C89 仅提及结构体与结构体成员 亦支持联合体与其他子对象

参阅

sizeof 运算符返回的无符号整数类型
(typedef)