K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2303] 無題
投稿者:mhash
2022/06/29 21:11:14

連投申し訳ありません。Cの標準ライブラリのoffsetofマクロについて質問させてください。 https://www.wdic.org/w/TECH/offsetof 上記リンク先のページにあるように、Cのoffsetofマクロを #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) という形式で実装している処理系は多いかと思います。そして、TYPE構造体の先頭部分のアドレスを0番地とすれば、MEMBERへのオフセットが取得出来ることも理解できます。 しかし、『ポインタ完全制覇』でも触れられていた通り、0という定数は、ポインタ型として扱われる文脈ではNULLになるはずです。このマクロはNULL参照を行ったとしてクラッシュを引き起こさないのでしょうか? それとも、offsetofをこのように実装している処理系では何らかの特別な処理を入れているのでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2304] Re:offsetofの定義について
投稿者:(ぱ)こと管理人
2022/06/29 23:32:51

>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の定義は、これに合致しているのではないでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2305] Re:offsetofの定義について
投稿者:mhash
2022/07/10 19:13:03

>>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の定義は、これに合致しているのではないでしょうか。 > ご返信遅くなり申し訳ありません。 空ポインタからアドレス型の定数を生成するのは大丈夫だから、それを有効なアドレス空間内でポインタ演算して、その先を参照するのはOKということですよね? ご回答ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]