2

我已经为窗口定义了一个指针地址

#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)

谢谢

4

2 回答 2

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哪个知道您的系统指针大小。

于 2013-03-14T09:43:19.247 回答
0

您可以sscanf使用相同的格式将其转换为变量。

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

于 2013-03-14T09:19:44.213 回答