C 言語の静的変数

胡金庫 2023年10月12日
  1. C 言語で関数呼び出しの間に値を保持するために static 変数を使用する
  2. static キーワードを使って C 言語のファイルスコープ内の変数を宣言する
C 言語の静的変数

この記事では、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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook