2016-09-28 9 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あなたは「自分自身を繰り返してはいけない」パターンに従うことができます。

関連する問題