2016-09-28 64 views
0

我想通過其內存地址調用一個函數。聲明功能與內存地址

我做一樣的東西:

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

回答

1

地址0x22feac看起來像普通的代碼地址空間中的任何地址。但這取決於你的環境。在源代碼中使用由數字文字指定的地址通常是一個糟糕的主意。

但是可能存在您從外部獲取的地址,例如來自Windows功能GetProcAddress。如果你確定你真的知道自己在做什麼,那麼你可以這樣賦值給一個函數指針:

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

auto讓你遵循「不要重複自己」的格局。