我已经为窗口
定义了一个指针地址#ifdef _WIN64
typedef uint64_t unit_pointer;
# define PRINTF_PTR "%I64x"
#else
typedef unsigned long unit_pointer;
# define PRINTF_PTR "%lx"
#endif
TEST *obj = &test_obj;
char obj_pointer_add[50];
sprintf(obj_pointer_add, PRINTF_PTR, (unit_pointer)obj);
现在我想在其他地方重新创建obj指针,因为我知道obj_pointer_add。 我怎么能把obj_pointer_add转换回unit_pointer?
unit_pointer point_address= (unit_pointer)obj_pointer_add; (ERROR CONVERTING)
TEST *new_obj = reinterpret_cast<TEST *>(point_address); (fail because of pointer_address wrong)
由于
答案 0 :(得分:3)
我真的不知道你为什么需要这个。但是,我建议你这种更简单的方法(IMO)摆脱那些"#if / #endif"
:
TEST *obj = new TEST();
std::stringstream stream; //
stream << std::hex << obj; //Convert address to a hex-string
std::string hex_str_addr(stream.str()); //
// ...
std::uintptr_t addr;
std::stringstream(hex_str_addr) >> std::hex >> addr; //Convert back to a address
TEST *new_obj = reinterpret_cast<TEST*>(addr);
使用了解系统指针大小的uintptr_t
。
答案 1 :(得分:0)
您可以使用相同的格式sscanf
将其变为变量。
注意:您可以仅在完全相同的过程中执行此操作。因此,如果存储指针并重新启动程序,则无法再次使用存储的指针。如果你使用它在同一个进程中传递指针,你为什么要把它作为一个字符串,而不是使用实际的指针?