这是一个简单的递归代码。我想知道的是为什么我为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
答案 0 :(得分:1)
您看到函数指针保留了它的值,因为函数在程序的代码存储器中在物理上是相同的。
请记住,当您调用函数时,除其他内容外,至少会将返回地址压入堆栈。因此,当您调用并再次调用它时,越来越多的条目将被推送到堆栈上,沿着这些条目会返回很多返回地址。
当函数返回时,返回地址从堆栈中弹出,因此CPU在函数调用后继续执行。在递归函数的情况下,只要在递归调用之后存在指向堆栈的返回地址,就会多次发生这种情况。一旦(递归结束时)堆栈将耗尽,最后一个返回地址将导致CPU返回主站。
简而言之,堆栈是产生递归效果的东西,它与代码存储器的内容没什么关系。