声明功能与内存地址
问题描述:
我想通过其内存地址调用一个函数。声明功能与内存地址
我做一样的东西:
int GetNewValue(int args)
{
return args * 2;
}
int main()
{
/*
Function address: 0x22feac
*/
int(*GetVal)(int) = 0x22feac; // instead of '&GetNewValue'
}
但是在编译的时候,我得到以下错误:
[Error] invalid conversion from
int
toint (*)(int)
[-fpermissive
]
我怎么能说从它的地址的方法?
(注意上面的例子中使用了简单的恒定,但在我真正的代码,我从挂钩一个DLL注入的功能。)
答
地址0x22feac
看起来像普通的代码地址空间中的任何地址。但这取决于你的环境。在源代码中使用由数字文字指定的地址通常是一个糟糕的主意。
但是可能存在您从外部获取的地址,例如来自Windows功能GetProcAddress
。如果你确定你真的知道自己在做什么,那么你可以这样赋值给一个函数指针:
intptr_t functionAddress = 0x22feac;
auto GetVal = reinterpret_cast<int(*)(int)>(functionAddress);
的auto
让你遵循“不要重复自己”的格局。
你可以使用'reinterpret_cast',但为什么你这样做? –
你可以对那个int执行施法游戏,但是为什么? C++的输入规则旨在防止这种类型的东西。 – user4581301
你想得到这个编译?将其更改为int(* GetVal)(int)=(int(*)(int))0x22feac;'。但是,这是UD,你确定你想要吗? – DeiDei