繁体   English   中英

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

[英]How are variables stored in memory in recursion?

我不确定在递归过程中如何创建变量并将其存储在内存中。 以下是取自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怎么可能比第一次通话更早?

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

局部变量(包括函数参数)存储在堆栈中。 堆栈朝向较低的地址增长,这是您观察到的:

记忆图

因此,递归越深,地址就越低。

这是因为局部变量在堆栈上,堆栈从高内存分配到低内存。 也就是说,定义变量越早,它的地址就越高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM