広告スペース

第23回 グローバル変数

C言語のグローバル変数・スコープ・変数の寿命・static変数を解説。

スコープ ― 変数が使える範囲

変数が参照できる範囲(スコープ)は宣言した場所で決まります。
int main(void) {
  int a = 10;          // main内で有効
  if (a > 0) {
    int b = 20;        // このブロック内だけで有効
    printf("%d\n", a+b); // OK
  }
  // printf("%d\n", b);  ← エラー!bはスコープ外
}
ローカル変数
関数・ブロック内でのみ有効。抜けると消える
グローバル変数
関数の外で宣言。どこからでも使える
static変数
関数内でも値を保持し続けるローカル変数

変数の寿命 ― いつ生まれ、いつ消えるか

スコープは「どこから見えるか」でしたが、寿命(lifetime)は変数がメモリ上にいつ確保され、いつ解放されるかを指します。

3種類の寿命

種類宣言場所生成タイミング消滅タイミング
auto(ローカル)関数・ブロック内ブロックに入ったときブロックを抜けたとき
グローバル関数の外プログラム開始時プログラム終了時
static関数内(static付き)プログラム開始時プログラム終了時
void example(void) {
  int        a = 1;   // auto: 呼ぶたびに生成→抜けると消滅
  static int b = 1;   // static: 一度だけ生成。値は次回も残る
  a++; b++;
  printf("a=%d b=%d\n", a, b);
}
int main(void) {
  example();  // a=2 b=2
  example();  // a=2 b=3  ← aはリセット、bは保持
  example();  // a=2 b=4
}

寿命を可視化してみよう

ボタンを押すと、example() を3回呼んだときに各変数がどう変化するかアニメーションで確認できます。
ステップ 0 / 9
コール状態
メモリ上の変数
出力

グローバル変数 ― 全関数で共有

#include<stdio.h>

int counter = 0;        // グローバル変数(main等の外)

void increment(void) {
  counter++;            // 引数なしでも触れる
}

int main(void) {
  increment();
  increment();
  increment();
  printf("%d\n", counter); // → 3
}
使いすぎ注意: グローバル変数は便利ですが、どこで変更されているか追いづらいためバグの原因になりがち。必要最小限に。

static変数 ― 関数内で値を保持

通常のローカル変数は関数を抜けると消えますが、staticをつけるとプログラム終了まで残ります
void count(void) {
  static int n = 0;  // 初回のみ0で初期化。以降は保持
  n++;
  printf("呼ばれた回数: %d\n", n);
}

int main(void) {
  count();  // → 1
  count();  // → 2
  count();  // → 3
}
使い所: 「関数が何回呼ばれたか」や「前回の結果を覚えておきたい」とき。グローバル変数を避けたいが状態は欲しいという場面で便利。

自分で書いてみよう ― スコープ

scope.c
出力
「実行」を押してください...
広告スペース

関連する講座

関数編
第20回 関数(基本)
C言語の関数の定義と呼び出し。引数・戻り値の仕組みを図解。
入門編
第3回 変数
C言語の変数とは?int, double, charの使い方を図解で解説。
関数編
第22回 プロトタイプ・マクロ
C言語のプロトタイプ宣言と#defineマクロの使い方を解説。
← 前の講座
第22回 プロトタイプ・マクロ
次の講座 →
第24回 配列を引数に

確認クイズ

この講座の理解度をチェックしましょう!

Q1. グローバル変数の初期値(int型)は?

未定義
0
-1

グローバル変数は宣言時に自動的に 0 で初期化されます。ローカル変数は初期化しないと未定義値になります。

Q2. static 変数の特徴は?

関数を抜けても値が保持される
他のファイルからアクセスできる
実行速度が速くなる

static ローカル変数は関数を抜けても値が消えず、次回呼び出し時に前の値が残っています。

Q3. グローバル変数の多用が推奨されない理由は?

メモリを多く使うから
どこからでも変更できてバグの原因になるから
実行速度が遅くなるから

グローバル変数はプログラムのどこからでも変更可能なため、意図しない変更によるバグが発生しやすくなります。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。丁寧な解説で基礎を固められます。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で、演習問題も充実。大学の教科書としても採用多数。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。基礎を終えた後のステップアップに最適。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。