とある科学の備忘録

とある科学の備忘録

CやPythonのプログラミング、Arduino等を使った電子工作をメインに書いています。また、木製CNCやドローンの自作製作記も更新中です。たまに機械学習とかもやってます。

【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つとも全く同じで、どちらも「データ型 変数名;」です。

*1: ちょっと細かい説明: 関数内で変数を宣言すると、その変数のためのメモリーが確保されます。しかしreturnすると、確保されたメモリーは破棄されてしまうのです。メモリーが確保されてから、破棄されるまでを、その関数の「寿命」といいます。