8

再帰中に変数がどのように作成され、メモリに格納されるのかわかりません。以下は、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 は、最初の呼び出しより前のアドレスをどのように持つことができますか?

4

3 に答える 3

8

これは、再帰関数呼び出し中に作成されたローカル自動変数がスタックに格納され、x86 を含むほとんどのプラットフォームで、スタックが上位アドレスから下位アドレスへと「下に」成長するためです。したがって、プロセスの後半で呼び出される関数には、以前の関数呼び出しで格納された変数よりも「低い」アドレスを持つ変数が含まれます。

于 2013-07-12T01:44:53.917 に答える
3

ローカル変数 (関数の引数を含む) はスタックに格納されます。スタックは下位アドレスに向かって成長します。これは、次のように観察されます。

メモリ図

したがって、再帰を深く進めるほど、アドレスは低くなります。

于 2013-07-12T01:46:07.440 に答える
0

これは、ローカル変数がスタック上にあり、スタックがハイ メモリからロー メモリに割り当てられるためです。つまり、変数が定義されるのが早ければ早いほど、そのアドレスは高くなります。

于 2013-07-12T01:47:26.490 に答える