2013-03-14 64 views
2

我为窗口转换回__int64或长期

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

感谢

+1

你怎么知道指针是无符号的64位数? – 2013-03-14 09:06:07

+1

如果您想使用'printf'打印一个指针,您应该使用''%p“'格式。 – 2013-03-14 09:07:23

回答

0

你可以sscanf它,使用相同的格式,到一个变量。

注:可以确切同样的过程做到这一点。所以如果你存储指针并重新启动你的程序,你不能再次使用存储的指针。如果你使用它在同一个进程中传递指针,你为什么要把它作为一个字符串,而不是使用实际的指针?

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这是了解你的系统指针的大小。

+0

它的工作原理! 感谢您的帮助 – alan 2013-03-14 16:40:04

+0

@alan:不客气,您可以将我的答案标记为_accepted_。 – deepmax 2013-03-14 16:48:19