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 在第二次(递归)调用之前创建?第二次调用的 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 回答