C言語 | 関数 | 変数の有効範囲

変数のスコープと生存期間は、宣言する場所によって決まります。

自動変数

ブロック内で宣言した変数を自動変数、またはローカル変数と呼びます。処理がブロックに入ると作成され、ブロックを抜けると破棄されます。そのブロック内でのみ参照できます。

void Function(void) {
  int iValue;
}

int main(void) {
  int iValue;
}

この2つは同じ名前ですが、スコープが異なるため衝突しません。スコープは関数だけでなくブロック単位で考えます。

#include <stdio.h>

int main(void) {
  {
    int iCount;
    for (iCount = 0; iCount < 10; iCount++)
      printf("1st for : iCount = %d\n", iCount);
  }
  {
    int iCount;
    for (iCount = 0; iCount < 10; iCount++)
      printf("2nd for : iCount = %d\n", iCount);
  }
  return 0;
}

外部変数

関数の外側で宣言した変数を外部変数、またはグローバル変数と呼びます。生存期間はプログラム終了まで続き、複数の関数で共有できます。

#include <stdio.h>

int iValue = 10;
void Function(void);

int main(void) {
  Function();
  iValue = 100;
  Function();
  return 0;
}

void Function(void) {
  printf("iValue = %d\n", iValue);
}

グローバル変数はどの関数からも変更できるため、大規模なプログラムでは理解を難しくします。共有状態が必要でない限り、引数と戻り値を優先してください。

ローカル変数とグローバル変数の名前が同じ場合、より近いローカル宣言が優先されます。