将字符地址转换回__int64或long

时间:2013-03-14 09:03:51

标签: c++

我已经为窗口

定义了一个指针地址
#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)

由于

2 个答案:

答案 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将其变为变量。

注意:您可以完全相同的过程中执行此操作。因此,如果存储指针并重新启动程序,则无法再次使用存储的指针。如果你使用它在同一个进程中传递指针,你为什么要把它作为一个字符串,而不是使用实际的指针?