在被指向函数执行过程中修改函数指针是否合法?
函数指针在指向函数执行期间修改的合法性与实现方案
一、合法性分析
你贴的代码里,在foo执行期间修改函数指针fun的操作是完全合法的。
函数指针本质就是存储函数地址的变量,这里fun是全局变量,在foo内部修改它仅仅是改变这个变量的取值,完全不会影响当前正在执行的foo函数流程——foo已经启动执行,这次调用的逻辑不会因为指针的变化而中断或跳转,修改只会作用于后续的函数调用。
运行你提供的代码,输出结果会是:
foo boo
第一次调用(*fun)()时执行foo,foo内部把fun改成指向boo;第二次调用就会执行boo,和预期一致。
二、满足循环需求的实现方案
针对你“循环执行函数指针,初始调用foo,当foo满足某个条件时一次性修改指针,之后每次都执行boo”的需求,直接加条件判断逻辑就能实现,示例代码如下:
#include <iostream> using fun_p = void (*)(); void foo(); void boo(); fun_p fun = &foo; // 这里用调用次数作为判断条件,你可以换成自己的业务逻辑,比如状态标志、外部输入等 int call_count = 0; void foo() { std::cout << "foo\n"; call_count++; // 假设条件是foo被调用2次后切换到boo if (call_count == 2) { fun = &boo; std::cout << "已切换为执行boo\n"; } } void boo() { std::cout << "boo\n"; } int main() { // 循环调用10次做示例 for (int i = 0; i < 10; i++) { (*fun)(); } return 0; }
关键说明:
- 用全局变量
call_count记录foo的调用次数,作为切换条件(你可以根据实际需求替换成任意判断逻辑,比如某个布尔状态、外部参数等) - 在
foo内部检查条件,一旦满足就把fun指向boo,后续循环调用会自动执行boo - 循环里每次调用
(*fun)(),都会根据当前fun的指向执行对应函数
运行这段代码,前2次会输出foo,第2次调用foo时触发切换,之后8次都会输出boo,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Artur Pyszczuk
相关产品推荐
相关产品推荐

