-1

Possible Duplicate:
Why does this C code work?

I do see a macro defined to compute the structure offset as follows

#define offsetof(st, m) ((size_t)(&((st *)0)->m))

But I don't get on how this definition works. It looks like a member of structure is accessed via a NULL pointer. Can any one please elaborate how this expression works?

4

2 に答える 2

1

この式はコンパイル時に最適化され、プログラムのコンパイル時のオフセット値になります。

コンパイラは、定数ポインタ (0) を認識し、そこから定数オフセットを認識し、必要なアドレス(== オフセット) を生成する定数折りたたみを適用します。0 + offset

これが最適化なしで機能するのか、基本的な定数の折り畳みが常に行われるのかは興味深いことです。

PS より正確にはScalar Replacement of Aggregates、以下の Lei Mou が指摘したように、この最適化は と呼ばれます。

于 2012-12-12T12:08:50.720 に答える
1

1) 最初に 'st' 型の構造体への null ポインターが作成されます: (st *)0

2) 次に、この構造体のメンバーが取得されます: ->m

3) 次に、メンバーのアドレスが取得されます: &(...)

4) 最後に、メンバーのアドレスが size-t 型にキャストされます: (size_t)(...)

作業はステップ 3 で行われます。ポインターがヌル (つまり、アドレス == 0) であるため、メンバーから離れたアドレスには構造内のメンバーの位置が含まれているだけです。

于 2012-12-12T12:12:22.503 に答える