offsetof
Defined in header
<stddef.h>
|
||
#define offsetof(type, member) /*implementation-defined*/
|
||
The macro offsetof expands to an integer constant expression of type size_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 object
o
of type
type
with static storage duration,
&
(
o.
member
)
shall be an address constant expression and point to a subobject of
o
. Otherwise, the behavior is undefined.
If the type name specified in
|
(since C23) |
Notes
If
offsetof
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 in
offsetof
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) |
Example
Possible output:
the first element is at offset 0 the double is at offset 8
Defect reports
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 |
See also
unsigned integer type returned by the
sizeof
operator
(typedef) |
|
C++ documentation
for
offsetof
|