C
1#define offsetof(s, mem) (size_t)&(((s *)0) -> mem)
offsetofマクロの定義を見てみますと。
やっていることは、なんとな~~くは分かるのですが・・・・
(s *)これはなんです???
アロー演算子が出てきているので、ポインタですよね??
シンタックスシュガーですか?
(((s *)0) -> mem)
この部分の式について何をやっているのか詳しく教えてください。
[追記]
実験してみました。
C
1struct d { 2 int j; 3 char g; 4 long r; 5 }a; 6 7 printf("%p, %p, ", &(a), &(a.g)); 8 printf("%d\n", &(a.g) - &(a)); 9 10 struct d *v = NULL; 11 // printf("%d", v ->j); segmentation fault 12 printf("&(v) = %p\n", &(v)); 13 printf("&(v -> j) = %p\n", &(v -> j)); 14 printf("&(v -> g) =%p\n", &(v -> g));
&(v) = 00C2FE5C
&(v -> j) = 00000000
&(v -> g) =00000004
こんな結果になりました。オフセットになっております。
C
1struct d v; 2 3printf("%p", v); 4printf("%p", v.g);
結果は、
&(v) = 002EFED4
&(v.g) =002EFED8
ちゃんとアドレスが出てきます。
分からないのは、「ヌルポインタにしたときに、なんで、アドレスがオフセットに変化しているか・・・」
ということです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/18 14:31 編集
2017/01/18 14:49
2017/01/18 14:54