函数指针类型不兼容问题求助:Hook赋值报错且运行时指针为空
解决方案
问题出在错误的类型转换:你把HookFunction返回的void*转成了int*,但orgFunction是函数指针类型,两者不兼容,导致编译器报错。同时直接把orgFunction改成void*会破坏类型信息,引发运行时指针失效的问题。
正确的类型转换方式
直接将HookFunction的返回值强制转换为与orgFunction完全匹配的函数指针类型即可,不需要转成int*。
修改后的代码:
// 原函数指针定义不变 int (*orgFunction)(int a1, int a2 , int a3 , int a4, int a5); int orgFunctionHook(int a1, int a2 , int a3 , int a4, int a5) { // do something.. return orgFunction(a1,a2,a3,a4,a5); } void Load(){ // 转换为对应的函数指针类型 orgFunction = (int (*)(int, int, int, int, int))HookFunction((char*)"something", 0x50000, (void*)orgFunctionHook); }
更简洁的写法(用typedef简化类型):
如果觉得函数指针类型太长,可以先定义一个类型别名,让代码更清晰:
// 定义函数指针类型别名 typedef int (*OrgFuncPtr)(int, int, int, int, int); OrgFuncPtr orgFunction; int orgFunctionHook(int a1, int a2 , int a3 , int a4, int a5) { // do something.. return orgFunction(a1,a2,a3,a4,a5); } void Load(){ // 使用别名进行类型转换 orgFunction = (OrgFuncPtr)HookFunction((char*)"something", 0x50000, (void*)orgFunctionHook); }
为什么这样可行?
HookFunction返回的void*是通用指针类型,可以转换为任何数据/函数指针类型(在大多数平台上,函数指针和数据指针的内存布局兼容)。- 直接转换为目标函数指针类型,既满足编译器的类型检查要求,又保留了原函数指针的类型信息,避免运行时指针被清空的问题。
内容的提问来源于stack exchange,提问作者Schevenz Rs
相关产品推荐
相关产品推荐

