再帰中に変数がどのように作成され、メモリに格納されるのかわかりません。以下は、C Primer Plus からの例です。
#include <stdio.h>
void recursiontest(int);
int main(){
recursiontest(3);
return 0;
}
void recursiontest(int n){
printf("Level %d : %#x\n", n, &n);
if(n < 4)
recursiontest(n + 1);
printf("LEVEL %d : %#x\n", n, &n);
return;
}
出力は次のようになります。
レベル 3 : 0x3ce1f8bc
レベル 4 : 0x3ce1f89c
レベル 4 : 0x3ce1f89c
レベル 3 : 0x3ce1f8bc
元の関数呼び出しに対してローカルな "n" 変数が、最初の (そして唯一の) 再帰呼び出しのアドレスよりも連続して後のアドレスであるかのように見えます。何故ですか?
関数を呼び出すとき、関数に渡される実引数に関して、その仮パラメーターが宣言および定義されていませんか? それは、最初の呼び出しに対してローカルな整数 n が 2 番目の (再帰的な) 呼び出しの前に作成されるということではないでしょうか? 2 番目の呼び出しの n は、最初の呼び出しより前のアドレスをどのように持つことができますか?