C言語

変数が使用できる有効な範囲(スタティック変数とスコープ)

前回は、ローカル変数とグローバル変数について学びました。今回は、静的なローカル変数などと呼ばれているスタティック変数について学びます。

スタティック変数とは

ローカル変数は、ブロック内でのみ有効です。このため、ブロック内の処理が終了すると、変数は使用できなくなります。次に同じブロック内の処理を行うときは、変数を作り直すことになり、前回とは別のメモリを使用するため、値も変わってしまいます。
そこで、型名の前にstatic(スタティック)とつけることにより、グローバル変数と同じようにプログラムが終了するまで、変数の値が残るようになります。ただし、グローバル変数と違い、利用できるのは、宣言されたブロック内のみになります。
このような変数を静的なローカル変数とも呼ばれたりしますが、スタティック変数と呼ばれることが多いです。
また、このスタティック変数は、グローバル変数と同様に、初期化しない場合、自動的に 0 で初期化されることになっています。

スタティック変数を使用したサンプルプログラムを次に示します。

#include <stdio.h>

void update(void);

int main(void)
{
    int number = 5;
    update();
    printf("main:%d\n", number);
    number++;
    update();
    printf("main:%d\n", number);
    update();
    return 0;
}

void update(void)
{
    static int number;
    number++;
    printf("update:%d\n", number);
}

update関数内で、numberをスタティックで宣言しています。これにより、update関数が最初に呼び出されたときは、numberの値は 0 になっています。
そして、インクリメントし、1 になります。次にupdate関数が呼び出されると、インクリメントし、2になります。
update関数内のnumberとmain関数のnumberは別変数なので、main関数のnumber変数には影響しません。
サンプルプログラムの実行結果を次に示します。

実行結果

update:1
main:5
update:2
main:6
update:3

このように、update関数が終了しても、numberの値は保持されていることが分かったかと思います。

スタティック変数については、簡単ですが、以上となります。

-C言語