【6日でできるC言語入門】グローバル変数とローカル変数

 C言語のプログラムでは、変数の定義場所によって有効範囲(スコープ)が異なることを理解することが重要です。特に「グローバル変数」と「ローカル変数」という2つの概念は、複数の関数でデータをやり取りしたり、プログラムの安全性や保守性を考えるうえで欠かせません。
ここでは、それぞれの違いや特徴、注意点について、サンプルプログラムを使いながら詳しく解説します。

1.グローバル変数とローカル変数の基本

1.1. サンプルプログラムで比較

まず、グローバル変数とローカル変数がどのように振る舞うのか、実際のプログラムを見てみましょう。

サンプルプログラム

プロジェクト/ファイル名: Lesson40_1/main.c

#include <stdio.h>

// グローバル変数
int counter = 5;

// プロトタイプ宣言
void increment(void);
void display(void);

int main(void) {
    int local = 20; // main関数のローカル変数
    printf("main関数内\n");
    printf("counter=%d\n", counter);
    printf("local=%d\n", local);
    printf("--------------------\n");

    increment();
    display();
    return 0;
}

void increment(void) {
    // グローバル変数counterの値を増やす
    counter++;
    printf("increment関数内\n");
    printf("counter=%d\n", counter);
    int temp = 50; // increment関数のローカル変数
    printf("temp=%d\n", temp);
    printf("--------------------\n");
}

void display(void) {
    printf("display関数内\n");
    printf("counter=%d\n", counter);
    int show = 100; // display関数のローカル変数
    printf("show=%d\n", show);
    printf("--------------------\n");
}

実行結果

main関数内
counter=5
local=20
--------------------
increment関数内
counter=6
temp=50
--------------------
display関数内
counter=6
show=100
--------------------

1.2. グローバル変数とローカル変数の違い

項目グローバル変数ローカル変数
定義場所関数の外(ファイルの先頭など)各関数の中
有効範囲プログラム全体(全関数からアクセス)その関数内のみ
int counter;int local;
名前の重複プログラム内で1つのみ関数ごとに同じ名前を使ってもOK
値の保持全関数で共通して同じ値を参照・変更関数が終了すると値は消える

2.スコープと変数の振る舞い

2.1. スコープ(有効範囲)の可視化

複数の関数で同じ名前の変数があっても、ローカル変数は定義した関数内でのみ有効です。

// グローバル変数
int shared = 1;

void foo(void) {
    int shared = 99; // ローカル変数(グローバル変数とは別物)
    printf("foo関数のshared=%d\n", shared); // 99
}

void bar(void) {
    printf("bar関数のshared=%d\n", shared); // 1
}

ポイント
ローカル変数のsharedはfoo関数内だけで有効。bar関数はグローバル変数sharedを参照します。

2.2. グローバル変数の注意点

  • すべての関数からアクセス可能ですが、プログラムの規模が大きくなると管理やバグの原因になりやすいため、むやみに多用しないことが推奨されます。
  • 名前の重複はできません(1つのプログラムに1つだけ)。

3.main関数の戻り値について

3.1. main関数のreturn値

main関数のreturnで返される値は、プログラムの実行結果をOSに伝えるものです。

  • return 0; … 正常終了(成功)
  • return 1; など … 異常終了(失敗)

これはUnix系の慣習であり、WindowsやLinuxなどでも広く使われています。

まとめ

  • グローバル変数は全関数から共通でアクセス可能、ローカル変数は各関数内だけで使える変数です。
  • 変数のスコープを意識することで、プログラムの安全性と保守性が向上します。
  • main関数の戻り値は、プログラムの成功・失敗をOSへ知らせる役割を持ちます。

変数スコープの理解は、バグの予防や効率的なプログラミングの基礎です。