当我尝试以下操作时,我得到一个访问冲突读取位置。我做错了什么?
uint64_t hInt = 2901924954136;
void* hPoint = reinterpret_cast<void*>(hInt);
uint64_t hIntBack = *static_cast<uint64_t*>(hPoint); //get access violation
here
我猜你的意思是将hInt
的地址存储在hPoint
中,而不是hInt
的值。
uint64_t hInt = 2901924954136;
void* hPoint = reinterpret_cast<void*>(&hInt);
// ^ addressof operator
你做的是:
- 将整数强制转换为 void 指针 - 很好,但指针可能指向不可用内存。
- 将 void 指针强制转换为指向无符号 64 位整数的指针 - 很好,但由于您获得它的方式,取消引用它是未定义的行为
- 取消引用指针,UB 在此处提供访问冲突
将指针投射到 int 到 void 的指针并再次返回是可以的(RSahu 答案(,或者甚至将 int 投射到指针并返回可以是 (*(,所以这很好:
uint64_t hInt = 2901924954136;
void* hPoint = reinterpret_cast<void*>(hInt);
uint64_t hIntBack = static_cast<uint64_t>(hPoint);
在指针使用至少 64 位的系统上(几乎任何当前系统(,标准保证hIntBack
具有与hInt
相同的值。在指针长度小于 64 位的旧系统上,您将丢失最高顺序位。
(*( 事实上,这不是由C++标准定义的,而是由 C99 定义的。由于常见的编译器处理这两种语言,因此大多数常见的编译器将接受将指针投射到大小足够大的整数并再次返回。