命名空间
变体
操作

offsetof

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

offsetof 展开为一个类型为 size_t整数常量表达式,其值为从指定类型的对象的开头到其指定子对象的偏移量(以字节为单位),包括任何填充。

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

如果在 type 中指定的类型名包含一个不在匹配括号之间的逗号,则行为未定义。

(自 C23 起)

内容

[编辑] 备注

如果将 offsetof 应用于位域成员,则行为未定义,因为无法获取位域的地址。

member 不限于直接成员。它可以表示给定成员的子对象,例如数组成员的元素。

即使 C23 规定在 offsetof 中指定包含未括号的逗号的新类型是未定义的行为,但这种用法通常在早期模式中也不受支持:offsetof(struct Foo { int a, b; }, a) 通常无法编译。

typeof 可用于避免逗号在新类型定义中的不良影响,例如,offsetof(typeof(struct { int i, j; }), i) 是定义明确的。

(自 C23 起)

[编辑] 示例

#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) [编辑]
C++ 文档 for offsetof