c - 配列 - 構造体の中に構造体 ポインタ




Cでは、構造体へのポインタは常に最初のメンバを指していますか? (2)

特定の関数セットを操作したいと考えるC構造体がいくつかあるとします。

私は次のことが正当なアプローチであるかどうか疑問に思います。

typedef struct Base {
     int exampleMember;
     // ...
} Base;

typedef struct Foo {
     Base base;
     // ...
} Foo;

typedef struct Bar {
     Base base;
     // ...
} Bar;

void MethodOperatesOnBase(void *);

void MethodOperatesOnBase(void * obj)
{
     Base * base = obj;
     base->exampleMember++;
}

この例では、構造体FooBar両方がBaseメンバで始まることに気づくでしょう。

そして、 MethodOperatesOnBaseでは、 void *パラメータをBase *にキャストしvoid *

私はこのメソッドにFooへのBarとポインタへのポインタを渡したいと思って、構造体の最初のメンバをBase構造体に頼っています。

これは受け入れ可能なのか、それとも私が気づく必要がある(おそらくコンパイラ固有の)問題があるのでしょうか? (構造体の最初のメンバの位置を変更する何らかのパッキング/パディングスキームなど)



はい、C標準は、これが動作することを特に保証しています。

(C1x§6.7.2.1.13:「適切に変換された構造体オブジェクトへのポインタは、その最初のメンバを指します...その逆もあります。構造体オブジェクトの中では名前は付けられていません。







c