我正在尝试使用GCC中的函数__builtin_return_address来学习有关运行时数据结构的一些基本概念,所以如果我问一个全新的和愚蠢的问题,请原谅我:
我的测试代码就是这个
#include <stdio.h>
void a(int i)
{
if (i>0) {
printf("The return address is %p\n", __builtin_return_address(0) );
a(--i);
}
else
return;
}
int main ()
{
a(10);
return 0;
}
输出
The return address is 0x4005ee
The return address is 0x4005db
The return address is 0x4005db
The return address is 0x4005db
The return address is 0x4005db
...
所以我的问题是,为什么那些递归调用函数的返回地址都是相同的,就像它们都返回到顶级调用者一样?它们不应该像“递归直接来电者”一样吗?
感谢。
答案 0 :(得分:2)
f5 f4 f3 f2 f1 a(5) --> f5
f5 f4 f3 f2 f1 a(5) a(4) --> f3
f5 f4 f3 f2 f1 a(5) a(4) a(3) --> f1
f5 f4 f3 f2 f1 a(5) a(4) a(3) a(2) --> a(4)
f5 f4 f3 f2 f1 a(5) a(4) a(3) a(2) a(1) --> a(2)
在递归期间不要更改索引!
f5 f4 f3 f2 f1 a(5) --> f5
f5 f4 f3 f2 f1 a(5) a(5) --> f4
停在ret_add(i) == ret_add(0)