Namespaces
Variants

offsetof

From cppreference.net
< 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, 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++ documentation for offsetof