18

Cプログラミング言語について...

C/C++ Structure offsetの質問の一部には、「& は常に構造体の最初のフィールドの最初のバイトを指しているとは限らない」と記載されています。

しかし、 http: //www.lysator.liu.se/c/rat/c5.htmlの「ANSI Rationale」を見ると、セクション 3.5.2.1 構造体と共用体の指定子で「最初に穴が発生することはありません」と記載されています。したがって、「根拠」が決定的なものかどうかはわかりませんが、非常に目に見える質問のその部分と矛盾しているようです.

それで、それはどれですか? C構造体の最初のフィールドは常にoffsetof 0であることが保証されていますか?

struct A
{
    int x;
};

struct B
{
    struct A myA;
    int y;
};

B myB;

移植可能な方法と同じであることが保証&myB &(myB.myA)れていますか?

(より具体的には、Libev の libev ユーザーデータ トリック、How to pass arguments to related callbacksおよび他の多くの場所では、構造体の最初のフィールドが offsetof 0 にあると想定しています...それは本当に移植可能ですか?)

4

1 に答える 1

24

C99 標準セクション 6.7.2.1 箇条書き 13 から:

構造体オブジェクト内で、非ビット フィールド メンバーとビット フィールドが存在するユニットには、宣言された順序で増加するアドレスがあります。適切に変換された構造体オブジェクトへのポインターは、その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。構造体オブジェクト内に名前のないパディングがある場合がありますが、先頭にはありません。

したがって、あなたの質問に対する答えはイエスです。

于 2013-05-10T13:06:19.517 に答える