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

函数地址的地址存储问题及C++程序是否存在未定义行为问询

C++问题解答

1. 是否可以存储函数地址的地址?

可以。函数地址的本质是函数指针(比如void (*)()类型),而函数指针本身是可被取地址的对象,因此你可以定义指向函数指针的指针(比如void (**)()类型),用来存储函数指针的地址——也就是你所说的“函数地址的地址”。

需要注意的是,存储的地址必须指向有效且处于生命周期内的函数指针对象,否则后续访问会触发未定义行为。

2. 给定C++程序是否存在未定义行为?

存在未定义行为,你的核心判断方向正确,细节补充如下:

看代码关键逻辑:

void store(void (*&&fp)())  { fpp = &fp; }

调用s.store(&f)时,&f作为函数指针右值会绑定到形参fp上。fp是store函数的局部形参,它的生命周期仅覆盖store函数的执行过程——当store执行完毕返回后,fp会被销毁,它的地址变为无效的野地址。

而fpp存储的正是这个已销毁的fp的地址,后续main中调用s.call()时,(*fpp)()会尝试解引用该无效地址,这属于访问已销毁局部变量的内存,完全符合C++标准中未定义行为的范畴。


内容的提问来源于stack exchange,提问作者Dr. Gut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:26:00