3

C 言語は、C プログラムの変数を介して 2 種類のメモリ割り当てをサポートすることが知られています。

1) 静的割り当ては、静的変数を宣言するときに発生します。各静的変数は、固定サイズのスペースの 1 つのブロックを定義します。この領域は、プログラムの開始時に一度割り当てられ、解放されることはありません。

2) 関数の引数やローカル変数などの自動変数を宣言すると、自動割り当てが発生します。自動変数のスペースは、宣言を含む複合ステートメントに入ると割り当てられ、その複合ステートメントを終了すると解放されます。

(これはhttp://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_3.htmlからの完全な引用です)

問題は、メモリ割り当てに関して関数「ローカル」で静的変数を呼び出すのは正しいですか、またその理由は何ですか? 事前にみんなに感謝します。

PS C標準からの引用は大歓迎です。

4

5 に答える 5

4

C 標準では、ローカル変数という用語が定義されていません。自動および静的は、保存期間を指します。

C11 (n1570)、§ 6.2.4 オブジェクトの保存期間

オブジェクトには、その寿命を決定する保存期間があります。

于 2013-02-28T12:01:42.667 に答える
3

「関数ローカル静的変数」などと呼ぶこともできますが、単純に「ローカル変数」と呼ぶと、実際には静的であり、いくつかのプロパティを持っていることがわかったときに驚くかもしれません。グローバル変数の。

于 2013-02-28T11:58:23.247 に答える
2

C には 2 種類の静的変数があります。

  1. グローバルな静的変数。staticこれらの変数は、この翻訳単位でのみ表示されることが示されています。

  2. ローカル スコープを持つ静的変数 (つまり、関数内)。これらは一度初期化され、スコープ外に出た後も値イベントを保持します。

staticそして、あなたの質問に:いいえ、変数をautomatic同時にすることはできません。それらのアドレスを確認すると、static変数が現在のスタック フレームに存在しないことがわかります。

于 2013-02-28T12:01:34.563 に答える
2

変数のコンテキストでは、ローカルという用語は、ほとんどの場合、ストレージ メカニズムと有効期間ではなく、可視性とスコープを示します。

C でローカル変数という用語を使用することは、実際には不正確であり、標準ではそれについて語られていません。

非公式には、関数内の静的変数は、関数の可視スコープ内でローカルであると言えますが、それ以上のものではありません。

ローカル変数という用語をまったく使用しないことをお勧めします。代わりに、関数内の静的変数、自動変数、ファイル スコープ内の静的変数、およびグローバルについて説明する必要があります。

于 2013-02-28T12:01:53.507 に答える
1

問題は、メモリ割り当てに関して関数「ローカル」で静的変数を呼び出すのは正しいですか、またその理由は何ですか?

静的変数は、プログラムに割り当てられたメモリのデータ セクションに格納されます。静的変数のスコープが終了しても、そのスコープ外でアクセスできますが、これは、データ セグメントの内容がスコープから独立している可能性があることを示している可能性があります。

#include <stdio.h>

int increment(void);

int main()
{
printf("\ni = %d",increment());
printf("\ni = %d",increment());
printf("\ni = %d",increment());
}

int increment(void)
{
static int i = 1;
return i++ ;
}

上記の例では、increment() への各関数呼び出しの後、関数が戻るたびに関数内の静的変数 i がスコープ外になりますが、その値は永続的に保持されます。これが可能なのは、変数が関数と同じスタック上になく、完全に別のメモリ領域 (データ セグメント) に存在するためです。

于 2013-02-28T12:11:08.357 に答える