2012-01-27 4 views
0

関数が呼び出されると、メモリブロックがスタックにプッシュされ、関数がそのジョブを終了すると、先にプッシュされたメモリブロックがポップアウトされることがわかります。 すべての状況で正しいですか。関数に静的変数の宣言が含まれていても?はいの場合、静的変数はどのように値を保持しますか?それらはヒープ内のメモリ空間に割り当てられ、スタックされませんか?関数内で宣言された静的変数のメモリ領域はどれですか?

+0

私は、.bssと.dataが何であるか、そしてそれらがヒープとスタックにどのように関係しているかを知りません。 – bubble

+1

[メモリ内の静的変数と大域変数](http://stackoverflow.com/questions/2421254/static-and-global-variable-in-memory)と他にもたくさんの重複があります。すべての "関連する"質問は、画面の右側に注意してください。 –

+0

@Brian静的変数がヒープに割り当てられている場合、その質問に対する答えは具体的には言いません。また、誰かが信頼できるリンクを挙げることができるようにしたいと思います。 – bubble

答えて

3

スタティックローカル変数はスタックに存在しません。グローバル変数と同じメモリに存在します。 .bssは、初期化されていないグローバル変数が存在するメモリです。 .dataは初期値で宣言された変数を保持できます。

+0

ヒープ上のメモリ空間が割り当てられているとだけ言えますか?または、ヒープと.bssと.dataを区別する何かがあります – bubble

+0

ヒープは通常、mallocを介した動的割り当てに使用されるスペースを参照します。したがって、静的変数はヒープスペース – TJD

+0

を消費しないため、3つ以上のタイプのメモリスペース。ヒープ、スタック、およびグローバル変数または静的変数にスペースが割り当てられているもの。私は正しいですか? – bubble

2

staticキーワードで宣言されたオブジェクトには、静的な記憶期間があります。静的記憶期間を持つオブジェクトは、実行が定義されているブロックを終了するときに解放されません。静的オブジェクトの存続期間はプログラムの存続期間です。オブジェクトはプログラムの開始時に作成され、プログラムが終了すると破棄されます。

+0

yaですが、ここで私の質問は、時間が消費されない空間についてです。 – bubble

+2

@bubbleこれは、言語がスタックを必要としないため、言語によって指定されていません。しかし、スタックを使った実装では、 'static'オブジェクトは通常単純にスタックに格納されません。 Unixでは、 'static'オブジェクトが.bss、.data、または.rodataに格納されることが期待できます。 – ouah

関連する問題