-2

重複の可能性:
C ++で構造体へのポインタを宣言すると、そのメンバーにメモリが自動的に割り当てられます。私が間違っている?

構造Humanを次のように定義するとします。

struct Human{int year, Human* Mom};

式を行います

Human* Bob;

ボブとそれが指しているヒューマンオブジェクトの両方にメモリを自動的に割り当てますか?気づいたので

Bob == NULL

偽です。これは、上記の式がオブジェクトHumanの静的メモリを作成することを意味しますか?

また、私はそれに気づきました

Bob->year 

自動的に0に初期化されませんが、

Bob->Mom 

NULLに初期化されていますが、それはなぜですか?

もう1つ、メモリを動的に割り当てる場合、たとえば

Human* Bob = new Human;

それから私はそれを見つけました

Bob->Mom

もはやNULLではありません、これはどのように起こっていますか?

4

5 に答える 5

1

少なくとも、構造体宣言は次のように修正する必要があります。

struct Human { int year; Human *Mom; };

ステートメント:

Human *Bob;

次に、保存場所を作成しますが、関数内で作成された場合は初期化しません。グローバルスコープの場合、ゼロ(NULL)に初期化されますが、Bob == NULLfalseと言うので、初期化されていないローカル変数である必要があります。それは何も指さない。の値が未定義であるため、割り当てのターゲットとして以外に使用すると、未定義の動作が呼び出されますBob

いいえ; Bob示されている定義は、を指すストレージを割り当てていません。

他の観察結果はすべて、ランタイムシステムの癖に依存します。動作が定義されていないため、何が起こる可能性があり、標準によれば「OK」です。以下を使用するときに適切に設定された値を取得するには、型のデフォルトのコンストラクターが必要です。

Human *Bob = new Human;

提供しておらず、システムが提供する必要がないため、ポイントされたオブジェクトは初期化されていません。

于 2012-12-12T03:05:20.167 に答える
0

ポインタ値を初期化するのはあなたの責任です。それらを何か(0またはなどNULL)に設定していない限り、それらの値は未定義であり、対応する割り当てごとに異なる初期化されていないポインター値を取得する可能性があります。

割り当てに関しては、再帰的または自己参照的なデータ構造を定義しました。Momメンバーの追加のHumanに実際にメモリを割り当てた場合はどうなるかを考えてください。次に、別の人間を割り当てる必要がBob->Mom->Momあります...

だから、いや。1つだけHuman割り当てられます。ネイティブポインタは単なるメモリアドレスの場所であり、それ以上のものではありません。

コンストラクターを使用すると、ポインターの初期化を自分で簡単に行うことができます。

struct Human { 
    int year; 
    Human *Mom; 
    Human() : year(0), Mom(NULL) {}
};
于 2012-12-12T03:03:09.820 に答える
0

いいえ、メモリは割り当てられません。ボブはガベージ値を持つポインタなので、誰がそれが何を指しているのかを知っています。

于 2012-12-12T03:03:25.133 に答える
0

人間*ボブという表現をします。ボブとそれが指しているヒューマンオブジェクトの両方にメモリを自動的に割り当てますか?Bob==NULLがfalseであることに気付いたからです。これは、上記の式がオブジェクトHumanの静的メモリを作成することを意味しますか?

いいえ、そうではありません。ボブは初期化されていないので、ランダムなゴミを指すだけです。ボブに明示的にメモリを割り当てる必要があります。

もう1つ、メモリを動的に割り当てる場合、たとえばHuman * Bob = new Human; それから私はBob->MomがもはやNULLではないことを発見しました、これはどのように起こっているのですか?

上記のように、初期化されていないメモリには何かが含まれている可能性があります。ポインタに従おうとすると、災害につながります。すべてのポインタを初期化するNULLか、割り当てられたメモリブロックにすぐに向けることをお勧めします。

于 2012-12-12T03:04:51.763 に答える
0

In your code, the only instruction you have given to the compiler is to create a pointer (either a 32 bit or 64 bit variable) which you intend to point to a structure of type "Human".

Since you have not initialized the pointer, its value is most likely what was in that memory space - that could be a 0 (NULL), or anything else.

When you call Bob->Mom, you are dereferencing the pointer (Bob) and looking at an area in memory that is arbitrary (potentially a space you are not allowed access to). You most likely will get a segmentation fault (on a *nix machine).

What you should do is:

Human* Bob = new Human();

That will create dedicated space for the structure and return the address of that structure and assign it to the pointer Bob. Now, when you dereference Bob, it will actually point to a space which has been allocated specifically for the Human structure.

于 2012-12-12T03:11:12.090 に答える