【C言語】NO.8 変数の寿命
変数には寿命があります。もう少し正確に言うと、関数の中に定義されている変数には寿命があります。
1.変数の寿命
下のプログラムを見てください。
int add(int); int main() int sum; sum = add(10); printf("sumの値は%dです\n", sum); sum = add(20); printf("sumの値は%dです\n", sum); sum = add(100); printf("sumの値は%dです\n", sum); return 0; } int add(int x){ int gokei = 0; gokei += x; return gokei; }
add()関数は、呼び出し元からもらった値をgokeiにどんどん加えていくつもりで作った関数です。例えば、
sum = add(10);
とすれば、sumの値は10になり、続けて
sum = add(20);
とすれば、sumの値は、10 + 20 で30になり、そのうえで
sum = add(100);
とすればsumの値は30+100 で 130になることを期待して作ったわけです。
しかし、実際に実行するとこうなります。
実行結果
sumの値は10です
sumの値は20です
sumの値は100です
関数が制御を戻すたびに(returnn文が実行されるたびに)関数の中の変数は削除されます。
なので、add関数内の変数gokeiには、どんどんxの値が足されているわけではありません。次にadd関数が呼び出された時には、
int add;
で初期化されてしまいます。*1
2.解決策
では、関数がreturnしても、値を保持し続けるにはどうしたらよいでしょうか。その方法は二つあります。
(1)「static」というキーワード
解決策の一つ目は、変数に「static」というキーワードをつけることです。
上のソースコードの add関数内の「int a; 」という部分を次のように書き換えてください。
static int a;
どうですか、うまくいきましたか?
(2)変数を宣言する位置を変更する
変数には「ローカル変数」と「グローバル変数」があります。
この二つの変数の違いは、
ローカル変数:
- 関数の{}の中で宣言する
- 関数の{}の中からしかアクセスできない
- 関数がreturnされると、変数のデータは初期化される
- 関数の{}の外、(つまりソースコードの一番最初)に宣言する
- プログラムのどこからでもアクセス可能
- 関数がreturnされても、変数のデータはそのまま
今までは、ローカル変数のみを扱ってきました。しかし、グローバル変数を使うことで、値を保持し続けて、どこからでもアクセスできる変数を作ることができます。宣言の仕方は2つとも全く同じで、どちらも「データ型 変数名;」です。