2013-03-14 60 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