3

次の構造体があります。

struct parent {
    char *name;
};

struct child {
    struct parent parent;
    int other_child_specific_data;
};

また、以下で動作する関数もありますstruct parent

void print_parent_name(struct parent *p)
{
    printf("%s\n", p->name);
}

質問:その関数を次のように呼び出すことを確信できますか:

struct child c;
c.parent.name = "Child #1";

print_parent_name(&c);

常に同じになります

print_parent_name(&c + offsetof(struct child, parent));

?

言い換えると、問題は次とおりoffsetof(struct child, parent) ですstruct parent parentstruct child

誰かがC標準への参照を与えることができますか? offsetof(struct child, parent)そして、そのような構造体をゼロに等しくしないようなハードウェアまたはソフトウェア構成はありますか?

4

2 に答える 2

3

はい、ご安心ください。構造体は常にメンバーが定義されている順序でセットアップされ、アライメントによってゼロ オフセットからゼロ以外のオフセットを作成することはできません。

しかし、あなたのライン

print_parent_name(&c + offsetof(struct child, parent));

&cは構造体へのポインターであり、ポインター演算を呼び出して、オフセットに構造体のサイズを乗算するため、必要なことは実行されません。もちろん、とにかくオフセットがゼロの場合、これは効果がありませんが、私があなたなら、これを使用します:

print_parent_name(&c.parent);

これには、ポインターのキャストを回避するという優れた効果があります。

于 2013-10-10T14:05:50.317 に答える