c++ - 正确使用reinterpret_cast的方法

标签 c++

我想知道如何使用reinterpret_cast。我有一个场景,其中我必须使用 void ** 指针保存 uint64_t 类型的地址(例如 0x1122)(请参见下面的示例代码)。这三种方法似乎都有效。它们之间有什么区别?其中之一实际上是错误的吗?另外,这样做的最佳方法是什么?谢谢!

#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;
}

最佳答案

方法 3 是正确的方法。

虽然其他人很可能给出类似的结果(至少在某些情况下),但它们或多或少是不正确的。

如果指针是 32 位而不是 64 位,方法 2 将会出错,因为您强制指针的类型为 uint64_t

方法 1 可以工作 - 但没有必要,但你不需要 uint64_t 那里 - memlocaladdr 是 void 指针类型。

希望你能得到这份工作...

关于c++ - 正确使用reinterpret_cast的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14513417/

相关文章:

C++ win32 应用程序在我从文件对话框中选择文件一段时间后卡住?

c++ - 如何使用 auto 和 decltype 关键字来简化模板参数推导?

python - swig shared_ptr 导致不透明对象

c++ - 函数指针的比较是否合法

c++ - 标准 C++ 库中有哪些异常类

c++ - 如何抑制第三方源文件中的警告?

c++ - 哪些存储类型不完整的 STL 数据结构可以用作类成员?

写入 `&str_send[0] = &str_recv[c * 6];` 时,C++ 表达式不可赋值

c++ - 元素明智的 vector 乘法 C++(代码不工作)

C++:结构/类中的构造函数与初始化列表