次のプログラムがクラッシュしなかったとき、私は驚いた。ポインタを使って構造体要素にアクセスする
typedef struct _x {
int a;
char b;
int c;
} x;
main() {
x *ptr = 0;
char *d = &ptr->b;
}
は、私の理解あたりとして->
オペレータは&
演算子より優先順位が高いです。だから私はNULLポインタを逆参照しようとすると、以下のステートメントでプログラムがクラッシュすると考えましたtr
。
char *d = &ptr->b;
しかし、文&ptr->b
は有効なアドレスを評価します。誰かが私が間違っている場所を説明してもらえますか?アドレス*((x*)0)
に対して(タイプint
である)_x.a
後_x
内b
のオフセットを意味
これは 'offsetof'マクロと何らかの形で似ています。 – ruslik