2017-11-15 11 views
0

私はcでメモリ割り当てを手に入れようとしていました。スタックセグメントと初期化されていないデータセグメントの違い

following linkによると、スタックと初期化されていないデータセグメントが異なり、ローカル関数の初期化されていないデータは、初期化されていないデータセグメントに移動します。

この場合、初期化されていないローカル変数を持つコードの場合、スタックセグメントには何が格納されますか?それは空ですか?

+1

のみスタックに割り当てられたデータをスタックに入ります。これは、変数が初期化されているかどうかにかかわらず適用されます。静的局所変数はデータセグメントに入ります。明示的に初期化されていない場合はBSSセクションに、ゼロ以外の値に初期化されている場合はデータセグメントの初期化された部分にある可能性があります。 –

答えて

1

ローカル関数の初期化されていないデータは、初期化されていないデータセグメントに移動します。

まあまあではありません。

読む慎重に、(from the same link、強調鉱山)

[...]初期化されていないデータは、データ・セグメントの終わりから始まり、はゼロに初期化または実行されているすべてのグローバル変数と静的変数が含まれていますソースコード内で明示的に初期化されていない [...]

したがって、自動ストレージ変数は、初期化されているかどうかにかかわらず、スタックセグメントに残ります。

つまり、これは「一般的な記憶表現」であり、普遍的ではないことに注意してください。 Cの標準では、スタックセグメント(または他のもの)を持つことは必須ではありません。

+0

downvoteの理由は?私は何を取りこぼしたか? –

2

「geeksforgeeks」チュートリアルを読むことはお勧めしません。あなたにはいくつかの誤解があります。

.bssセグメントは、実際には、ゼロ記憶されたの静的記憶期間の変数のストアです。明示的に値ゼロに初期化された変数を含みます。 静的記憶期間と異なる共通セグメントの例については、hereを参照してください。

固定保存期間の変数は、最終的に.bss.dataになります。ローカル変数は、スタックが初期化されているかどうかに関係なく、常にスタックまたはCPUレジスタに格納されます。非静的ローカル変数 -

(。これのどれもISO C標準によってではなく、業界のデファクトスタンダードで指定されていないことに注意してください)

+0

"静的ストレージ期間"について詳しく教えてください。したがって、ローカルの静的初期化されていない変数は.dataになります。 –

+0

@nalinkanoongoすべてが掲載されたリンクで説明されています。 – Lundin

+0

入手しました。 –

関連する問題