Code Fix

上級

static付きローカル変数が関数呼び出しをまたいで値を保持し続ける

関数内でstaticを付けて宣言した変数は、関数を抜けても値が消えません。次回その関数が呼ばれたときも、前回の値から処理が続きます。

なぜエラーが出ないのか

出力: 1
(エラーなし)
Cは何も報告しません。コンパイルも実行も正常に完了するためです
出力: 1
実際の挙動 — 期待した結果と食い違っている箇所
見つけ方
エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます

このエラーが出る典型パターン

パターン1

 1  #include <stdio.h>
 2  
 3  int nextId(void) {
 4             int id = 0;
           ^
 5      id++;
 6      return id;
 7  }
 8  
 9  int main(void) {
10      printf("%d\n", nextId());
11      printf("%d\n", nextId());
12      printf("%d\n", nextId());
13      return 0;
14  }
出力: 1 1 1期待: 1 2 3

staticを付けないと、呼ばれるたびにid=0から初期化されるため常に1が返ります。staticを付けると前回の値が保持され、呼ぶたびに増加していきます。

直し方: (空)static にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  #include <stdio.h>
 2  
 3  int counter(void) {
 4             int count = 10;
           ^
 5      count += 5;
 6      return count;
 7  }
 8  
 9  int main(void) {
10      printf("%d\n", counter());
11      printf("%d\n", counter());
12      return 0;
13  }
出力: 15 15期待: 15 20

初期化式(count = 10)は最初の1回だけ実行されます。staticを付けなければ毎回10からやり直しになるため、常に同じ結果になります。

直し方: (空)static にします。

この問題を解いてみる →

パターン3

 1  #include <stdio.h>
 2  
 3  int total(void) {
 4             int sum = 0;
           ^
 5      sum += 3;
 6      return sum;
 7  }
 8  
 9  int main(void) {
10      printf("%d\n", total());
11      printf("%d\n", total());
12      printf("%d\n", total());
13      return 0;
14  }
出力: 3 3 3期待: 3 6 9

普通のローカル変数だと思い込んでいると、カウンタや合計値が意図せず積み上がらない原因になります。

直し方: (空)static にします。

この問題を解いてみる →

よくある誤解

普通のローカル変数と同じ感覚で「呼ばれるたびに初期値に戻る」と思ってしまうと、カウンタや合計値が意図せず積み上がっていく原因になります。初期化式(例: static int count = 0;)は最初の1回だけ実行され、2回目以降の呼び出しでは無視されます。

まとめ

static付きローカル変数が関数呼び出しをまたいで値を保持し続けるは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)