递归中递归函数的内存分配?

时间:2014-12-10 15:17:46

标签: c recursion

这是一个简单的递归代码。我想知道的是为什么我为Reverse函数获得相同的内存地址。据我所知,每次调用函数时都应该不同。它不会发生在这里。

#include <stdio.h>
void Reverse();
int main()
{
    printf("Enter a sentence: ");
    Reverse();
    return 0;
}
void Reverse()
{
    char c;
    scanf("%c",&c);
    if( c != '\n')
    {
        printf("%p\n",Reverse);
        Reverse();
        printf("%c",c);
    }
}

输入:

123456

输出:

Enter a sentence: 123456
0x80484be
0x80484be
0x80484be
0x80484be
0x80484be
0x80484be
654321

1 个答案:

答案 0 :(得分:1)

您看到函数指针保留了它的值,因为函数在程序的代码存储器中在物理上是相同的。

请记住,当您调用函数时,除其他内容外,至少会将返回地址压入堆栈。因此,当您调用并再次调用它时,越来越多的条目将被推送到堆栈上,沿着这些条目会返回很多返回地址。

当函数返回时,返回地址从堆栈中弹出,因此CPU在函数调用后继续执行。在递归函数的情况下,只要在递归调用之后存在指向堆栈的返回地址,就会多次发生这种情况。一旦(递归结束时)堆栈将耗尽,最后一个返回地址将导致CPU返回主站。

简而言之,堆栈是产生递归效果的东西,它与代码存储器的内容没什么关系。