变量如何在递归中存储在内存中?

The*_*nic 8 c recursion function

我不确定在递归过程中如何创建变量并将其存储在内存中.以下是取自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;  
}
Run Code Online (Sandbox Code Playgroud)

产生输出:

第3级:0x3ce1f8bc

第4级:0x3ce1f89c

等级4:0x3ce1f89c

第3级:0x3ce1f8bc

似乎原始函数调用的本地"n"变量的地址顺序晚于第一个(也是唯一的)递归调用的地址.这是为什么?

当我调用一个函数时,是不是根据传递给它的实际参数声明和定义了它的形式参数?这是不是意味着第一次调用的本地整数n是在第二次(递归)调用之前创建的?第二次通话的n怎么可能比第一次通话更早?

Jas*_*son 8

这是因为在递归函数调用期间创建的本地自动变量存储在堆栈中,并且堆栈在大多数平台(包括x86)上从较高地址"降低"到较低地址.因此,在该过程中稍后调用的函数将具有比从较早的函数调用存储的变量具有"较低"地址的变量.