【发布时间】:2014-08-13 01:08:40
【问题描述】:
我在一次采访中被要求在不使用任何指针或 & 的情况下找出函数的地址。我无法回答他的问题,但是当我向他询问答案时,他给出了以下示例,其中函数 f1() 调用函数 f2()。因此,当函数 f2() 被调用时,堆栈会存储返回地址,该地址只不过是函数 f1() 的地址。在函数 f2() 中,我们可以读取堆栈,然后找出存储在堆栈中的地址,即函数 f1() 的地址。谁能详细解释一下我们如何从函数 f2() 中读取堆栈并找出 f1() 的地址。
int main()
{
f1();
return 0;
}
void f1()
{
f2();
}
【问题讨论】:
-
那是……完全不便携。
-
没有可移植的纯 C 方式来做到这一点。参见例如stackoverflow.com/questions/16088040/…
-
@sirpsychosexy,这涉及指针,问题标题明确禁止...
-
这是一个很做作的问题,在面试中用来测试OP对栈帧的了解。
-
在 gcc 中,您可以使用
register int rsp asm("rsp"); register int rbp asm("rbp");来获取 rsp 和 rbp 或任何其他寄存器的值,从而从堆栈中获取返回地址,或者直接使用__builtin_return_address。在 MSVC 中,有办法获取堆栈帧 here
标签: c