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

为什么函数指针的强制转换和基础类型的强制转换表现不一致?

问题原因分析

基础类型转换合法的原因

你给出的基础类型指针转换代码本质是同类型指针互转:

int* b = new int(40);
int c = *(int *)b;

b本身就是int*类型,强转成int*属于无意义的空转,解引用后拿到的确实是指针指向的有效int值,所以运行完全正常。

函数指针转换失败的核心原因

std::function是C++标准库提供的可调用对象包装类模板,它的实例是一个标准库类对象,和原生函数指针是完全没有继承关系的独立类型:

// abc的类型是 void(*)(int),是原生函数指针
void abc(int a){
    cout<<a<<endl;
}

// 这里的转换是完全非法的未定义行为
std::function<void(int)> callback = *(std::function<void(int)>*)abc;

这里的错误有两层:

  • 你直接把原生函数指针的值(指向函数代码段的地址)强转成std::function<void(int)>类型的指针,相当于把代码段的内存地址当成了存储std::function对象的内存地址,二者的内存布局完全不兼容
  • 对这个非法指针解引用时,会直接读取代码段的内存当成类对象数据处理,轻则触发程序崩溃,重则出现完全不可预期的运行异常。

正确写法

std::function本身支持直接赋值兼容签名的原生函数指针,不需要任何强转:

std::function<void(int)> callback = abc;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:36:06