2

reinterpret_cast の正しい使い方を知りたいです。void ** ポインターを使用して uint64_t 型のアドレス (0x1122 など) を保存する必要があるシナリオがあります (以下のコード例を参照)。そうする3つの方法はすべてうまくいくようです。それらの違いは何ですか?それらの1つは実際に間違っていますか?また、これを行う最良の方法は何ですか? ありがとう!

#include <iostream>
#include <cstdint>

using std::cout;
using std::endl;

int main()
{
    void **localAddr;
    void *mem;
    localAddr = &mem;
    // The above three lines is the setup that I have to work with.
    // I can't change that. Given this setup, I need to assign an
    // address 0x1122 to mem using localAddr.

    // Method 1
    *localAddr = reinterpret_cast<uint64_t*>(0x1122);
    cout << mem << endl; // Prints 0x1122

    // Method 2
    *(reinterpret_cast<uint64_t*>(localAddr)) = 0x1122;
    cout << mem << endl; // Prints 0x1122

    // Method 3
    *localAddr = reinterpret_cast<void*>(0x1122);
    cout << mem << endl; // Prints 0x1122

    return 0;
}
4

1 に答える 1

4

方法3が正しい方法です。

他の人も同様の結果(少なくともsomteimes)を与える可能性がありますが、多かれ少なかれ正しくありません。

ポインタのタイプを強制的に。にするため、ポインタが64ビットではなく32ビットの場合、方法2uint64_tは失敗します。

方法1は機能しますが、不要ですが、必要uint64_tありません。どちらmemlocaladdrvoidポインター型です。

あなたが仕事を得ることを願っています...

于 2013-01-25T00:46:06.727 に答える