Cでは、構造体の最初の要素は構造体自体と同じアドレスを持ちます。最初の要素がPODの場合、C++の非POD構造体でも同じことが言えますか?C++非ポッド開始アドレス
struct bar
{
struct bar *p1, *p2;
unsigned char h;
}
struct foo
{
struct bar node;
int a;
private:
int x;
};
int main(void)
{
struct foo A;
struct bar *ptr;
ptr = &A.node;
struct foo *n = ((struct foo*)((char*)(ptr)-(unsigned long)(&((struct foo*)0)->node)));
return 0;
}
私は「多分offsetofはマクロが誤って使用された... NULLオブジェクトの非静的データメンバ 『FOO ::ノード』への不正なアクセス」を取得:このコードは与えられた例
、警告。
私の質問はこれです - これはnon-POD構造体ですが、 'node'はfoo(同じアドレス)の先頭にあると思いますか?
はい、私はちょうど再解釈キャストを使用することができますし、私は警告を取得しない場合:だから
struct foo *o = reinterpret_cast<struct foo*>(ptr);
をC++の構造体は、公共PODデータで始まる場合、最初の要素はオブジェクトのアドレスを共有します標準ごとに?
おかげ
--edit-- In a class with no virtual methods or superclass, is it safe to assume (address of first member variable) == this?は、可能な答えと指摘しました。 「アクセス・オプションを介在させずに宣言された(非ユニオン)クラスの非静的データ・メンバーは、後のメンバーがクラス・オブジェクト内でより高いアドレスを持つように割り当てられます」ということに言及しています。私の場合は、オブジェクト自体と同じアドレスです。
標準はそれについて何も言わないので、私はそれが当てはまるとは思いません。私は、ポインタの構造体の終わりにオブジェクトを変更し、必要に応じてそれらを割り当てることに対処する必要があります。
C++では、 'struct'はstruct型の変数を宣言するためには必要ありません。 –
[cppreference](http://en.cppreference.com/w/cpp/language/data_members)から:* "アクセス制御の異なるメンバーは不特定の順序で割り当てられます(コンパイラはそれらをグループ化することがあります)" * - 'bar'が最初のメンバとして確保されていることを保証できないことを意味するはずです。 – UnholySheep
' struct'は仮想テーブルポインタを持ち、最初にあるプラットフォームで私が知っているものと一致します。そうではありません。 – Slava