Defined in header <stddef.h> | ||
#define offsetof(type, member) /*implementation-defined*/ | ||
The macrooffsetof expands to aninteger constant expression of typesize_t, the value of which is the offset, in bytes, from the beginning of an object of specified type to its specified subobject, including padding if any.
Given an objecto of typetype with static storage duration,&(o.member) shall be an address constant expression and point to a subobject ofo. Otherwise, the behavior is undefined.
If the type name specified in | (since C23) |
Contents |
Ifoffsetof is applied to a bit-field member, the behavior is undefined, because the address of a bit-field cannot be taken.
member is not restricted to a direct member. It can denote a subobject of a given member, such as an element of an array member.
Even though it is specified in C23 that specifying a new type containing an unparenthesized comma inoffsetof is undefined behavior, such usage is generally not supported even in earlier modes:offsetof(struct Foo{int a, b;}, a) generally fails to compile.
typeof can be used to avoid the bad effect of commas in the definition of a new type, e.g.offsetof(typeof(struct{int i, j;}), i) is well-defined. | (since C23) |
Possible output:
the first element is at offset 0the double is at offset 8
The following behavior-changing defect reports were applied retroactively to previously published C standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| DR 496 | C89 | only structs and struct members were mentioned | unions and other subobjects are also supported |
| unsigned integer type returned by thesizeof operator (typedef)[edit] | |
C++ documentation foroffsetof | |