声明功能与内存地址

问题描述:

我想通过其内存地址调用一个函数。声明功能与内存地址

我做一样的东西:

int GetNewValue(int args) 
{ 
    return args * 2; 
} 

int main() 
{ 
    /* 
     Function address: 0x22feac 
    */ 

    int(*GetVal)(int) = 0x22feac; // instead of '&GetNewValue' 
} 

但是在编译的时候,我得到以下错误:

[Error] invalid conversion from int to int (*)(int) [ -fpermissive ]

我怎么能说从它的地址的方法?

(注意上面的例子中使用了简单的恒定,但在我真正的代码,我从挂钩一个DLL注入的功能。)

+1

你可以使用'reinterpret_cast',但为什么你这样做? –

+0

你可以对那个int执行施法游戏,但是为什么? C++的输入规则旨在防止这种类型的东西。 – user4581301

+2

你想得到这个编译?将其更改为int(* GetVal)(int)=(int(*)(int))0x22feac;'。但是,这是UD,你确定你想要吗? – DeiDei

地址0x22feac看起来像普通的代码地址空间中的任何地址。但这取决于你的环境。在源代码中使用由数字文字指定的地址通常是一个糟糕的主意。

但是可能存在您从外部获取的地址,例如来自Windows功能GetProcAddress。如果你确定你真的知道自己在做什么,那么你可以这样赋值给一个函数指针:

intptr_t functionAddress = 0x22feac; 
auto GetVal = reinterpret_cast<int(*)(int)>(functionAddress); 

auto让你遵循“不要重复自己”的格局。