如何递归使用__builtin_return_address()?

时间:2015-04-03 18:39:24

标签: gcc recursion stack return

我正在尝试使用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
...

所以我的问题是,为什么那些递归调用函数的返回地址都是相同的,就像它们都返回到顶级调用者一样?它们不应该像“递归直接来电者”一样吗?

感谢。

1 个答案:

答案 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)