int fact(int n) {
if(n <= 1) {
return 1;
} else {
int pre = fact(n - 1);
int result = n * pre;
return result;
}
}
int main(int argc, char** argv) {
int result = fact(10);
printf("fact(10) = %d\n", result);
return 0;
}
さて、gdb でプログラムをしばらく step 実行してみましょう。
で、呼び出し関係が深くなったところで、スタックを眺めると例えばこんな感じです。
当然と言えば当然なんですが、 n, pre, result といった局所変数は、 各関数呼出しのフレーム毎に存在します。 C では、関数呼び出しの際は、その値がコピーされ、呼び出された関数の引数(局所変数でもある)として扱われます。 だから、各関数の n は違う値なのです。
これも、必ず debugger で、実行の様子や、関数の呼び出し関係、局所変数の関係を確認しましょう。
2001.11.04/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp