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

函数指针类型不兼容问题求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:54:22