You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

__builtin_return_address返回地址异常:为何返回地址高于main起始地址?

为什么__builtin_return_address返回的地址比main的起始地址高?

你的代码:

uintptr_t foo( void )
{
    return (uintptr_t)__builtin_extract_return_addr(__builtin_return_address(0));
}

int main( int argc, char **argv )
{
    printf("foo:	%zu\nmain:	%zu\n", foo(), (uintptr_t)main);
    return (0);
}

输出结果:

foo:    94718524985719
main:   94718524985687

问题原因解析

  • 你误解了__builtin_return_address(0)的作用:它返回的不是foo函数的末尾地址,而是调用foo的那条指令的下一条指令的地址——也就是main函数里,调用foo之后要执行的代码的地址。
  • main函数的起始地址(uintptr_t)main是main第一条指令的内存位置,而调用foo的代码在main函数内部的中间位置,返回后要执行的代码在main内部更靠后的地方,所以这个地址自然比main的起始地址要高。
  • 函数在内存中的指令是按执行顺序排布的,main从起始地址开始执行,调用foo的语句是main里的某一行,执行完foo后回到main继续往下走,这个返回地址属于main函数指令流的后半段,地址值大于main的起始地址完全正常。

内容的提问来源于stack exchange,提问作者Fayeure

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:10:38