C 言語の静的変数
胡金庫
2023年10月12日
この記事では、C 言語で静的変数を使用する方法について複数の方法を紹介します。
C 言語で関数呼び出しの間に値を保持するために static
変数を使用する
static
キーワードは複数のコンテキストで使用され、そのうちの 1つは、関数呼び出しの間にメモリに値を保持する変数を宣言することです。このタイプの変数は、静的な保存期間を持ちます。
次の例では、関数ブロックのスコープで変数 k
を宣言します。制御フローが up
関数を抜けると、k
の値はプログラムが終了するまでメモリに保持されています。この動作を利用して、プログラムの実行中にデータオブジェクトを永続的に保存することができます。
静的変数は明示的に初期化しないと自動的に 0 に初期化されることに注意してください。
#include <stdio.h>
#include <stdlib.h>
static int j = 0;
void up(void) {
static int k = 0;
j++;
k++;
printf(" up() called. k=%2d, j=%2d\n", k, j);
}
int main() {
int i;
for (i = 0; i < 3; i++) up();
exit(EXIT_SUCCESS);
}
出力:
up() called. k= 1, j= 1
up() called. k= 2, j= 2
up() called. k= 3, j= 3
static
キーワードを使って C 言語のファイルスコープ内の変数を宣言する
static
修飾変数は、任意の関数の外部で宣言することができ、単一のソースファイルのスコープ内で参照することができます。このような変数は内部リンク付きの静的変数と呼ばれ、その値は同じファイル内の関数でのみ使用できることを意味します。
両方の関数で k
という名前のローカル変数がゼロに初期化されていますが、down
関数が呼び出されたときには、変数 k
(up
で宣言されている) は同じスコープ内には存在せず、異なるメモリ位置で新しい変数が初期化されていることに注意してください。したがって、2 回の繰り返しの後に負の値が表示されます。関数のパラメータに static
修飾子を付けることはできないことに注意してください。
#include <stdio.h>
#include <stdlib.h>
static int j = 0;
void up(void) {
static int k = 0;
j++;
k++;
printf(" up() called. k=%2d, j=%2d\n", k, j);
}
void down(void) {
static int k = 0;
j--;
k--;
printf("down() called. k=%2d, j=%2d\n", k, j);
}
int main() {
int i;
for (i = 0; i < 3; i++) up();
for (i = 0; i < 2; i++) down();
exit(EXIT_SUCCESS);
}
出力:
up() called. k= 1, j= 1
up() called. k= 2, j= 2
up() called. k= 3, j= 3
down() called. k=-1, j= 2
down() called. k=-2, j= 1