>
https://www.wdic.org/w/TECH/offsetof
>上記リンク先のページにあるように、Cのoffsetofマクロを
>#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
>という形式で実装している処理系は多いかと思います。そして、TYPE構造体の先頭部分の
>アドレスを0番地とすれば、MEMBERへのオフセットが取得出来ることも理解できます。
>しかし、『ポインタ完全制覇』でも触れられていた通り、0という定数は、ポインタ型とし
>て扱われる文脈ではNULLになるはずです。このマクロはNULL参照を行ったとしてクラッシュ
>を引き起こさないのでしょうか?
ご質問は、ヌルポインタから->MEMBERの形で指す先を参照した時点で落ちるのでは、
ということですよね。
これについてはJIS X 3010:2003であれば「6.6 定数式」のところに、「アドレス定数」として
以下の記述があります。
| アドレス定数(address constant)は,空ポインタ,静的記憶域期間のオブジェクトを
| 指し示す左辺値を指すポインタ又は関数指示子を指すポインタとする。
| アドレス定数は,単項&演算子若しくは整数定数のポインタ型へのキャストによって
| 明示的に生成されるか,又は配列型若しくは関数型の式の使用によって
| 暗黙に生成されたものでなければならない。配列添字演算子[],メンバアクセス演算子.
| 及び->,アドレス単項演算子&,間接単項演算子*,並びにポインタへのキャストは,
| アドレス定数の生成に使用してもよいが,これらの演算子を使用することによって
| オブジェクトの値をアクセスしてはならない。
空ポインタから->とか&で「アドレス定数」を生成するのはよいが、その先を参照しては
いけない、と書いてあるように読めます。
このoffsetofの定義は、これに合致しているのではないでしょうか。