2016-06-01 12 views

答えて

3

wikiは言う:Cプログラミング言語で

を、静的を含むファイルに、その範囲を設定するために、グローバル変数 や関数で使用されます。ローカルの 変数では、静的に変数が自動的に割り当てられたメモリの代わりに割り当てられたメモリ に格納されます。 一方の言語が自動的に 割り当てられたメモリは、通常、一過性コールスタックとして実装されている間、静的に割り当てられたメモリは、典型的には、コンパイル時に番組のデータ セグメントに予約され、 メモリのいずれかのタイプの実装を決定しません。

静的ローカル変数:自動 ローカル変数と同じ範囲を有しながら機能 内部staticとして宣言された変数は、静的に割り当てられています。したがって、1つの呼び出しの間に関数が 静的ローカル変数に入れた値は、 関数が再び呼び出されたときにも存在します。

+0

Rahulに感謝します。静的変数はコンパイル時に割り当てられたメモリを取得します。 –

+2

言語によって実装が指定されていないことを強調してください。 – phoxis

+2

@seereddisekharコンパイル時には実際には割り当てられません。実行ファイルを実行すると、ローダは実行可能ファイルに指定されているとおりにメモリ内の実行可能ファイルをペースします。したがって、ロード時に実際の割り当てが行われますが、仕様をコンパイルするときに相対アドレスとオフセットが定義されます。 – phoxis

3

はい、静的変数は関数呼び出しの間に存続します。それらはグローバル変数のようにプログラムのデータセクションにあります。

Cアプリケーションの一般的なメモリレイアウトの詳細については、hereを読むことができます。

+0

データセクションは、関数呼び出しの完了後にクリアされませんか? –

+0

いいえ、関数が実行終了すると、データセクションは影響を受けません。 – kaspersky

1

変数が*の変数が実行時に実行されているため、それらを保存して取得する必要があるという誤った前提がありました。

これは静的変数がスタック外のまったく異なるメモリセグメントに割り当てられているため、関数が自動変数の有効範囲を終了するときに解放されません。

通常、静的データセグメントは、プログラムに入ると一度作成され、初期化されます。その後、プログラムが実行されている間、セグメントは割り当てられたままになります。すべてのグローバル変数は、すべての関数の静的変数とともに、コンパイラによってこのセグメントに配置されます。そのため、関数の入力や終了はこれらの変数に影響しません。

*「スタック」の正式名称は「自動記憶領域」です。

3

以前に与えられた回答の上にいくつかのより多くの情報を追加 -

静的オブジェクト用のメモリをコンパイル/リンク時に割り当てられます。それらのアドレスは、リンカ制御ファイルに基づいてリンカによって固定されます。

リンカファイルは、物理メモリレイアウト(Flash/SRAM)と、異なるプログラム領域の配置を定義します。

実際には、静的領域は2つのセクションに分かれています.1つは初期値用で、もう1つは実行時に行われた変更です。

最後に、特に指定しない場合、値はコンパイル時に0に設定されることに注意してください。

0

この例を考えてみます。

static int foo; 

void f(void) 
{ 
    static int bar; 
} 

FOOバー間の唯一の違いは、FOOバー機能範囲を有し、一方、スコープファイルがあることです。両方の変数は、プログラムの全ライフタイム中に存在します。

関連する問題