#include <stddef.h> size_t offsetof(type, member);
このマクロが有用なのは、 構造体を構成するフィールドのサイズは実装によって変化するし、 コンパイラによりフィールド間に挿入するパディングのバイト数も 違う可能性があるからである。 その結果、あるエレメントのオフセットは必ずしもそれより前の エレメントのサイズの合計とはならない。
member がバイト境界に位置していない場合 (すなわち、ビットフィールドの場合) には、 コンパイラでエラーが発生する。
$ ./a.out offsets: i=0; c=4; d=8 a=16 sizeof(struct s)=16
int
main(void)
{
    struct s {
        int i;
        char c;
        double d;
        char a[];
    };
    /* 出力はコンパイラ依存である */
    printf("offsets: i=%zu; c=%zu; d=%zu a=%zu\n",
            offsetof(struct s, i), offsetof(struct s, c),
            offsetof(struct s, d), offsetof(struct s, a));
    printf("sizeof(struct s)=%zu\n", sizeof(struct s));