2013-06-02 185 views
0

我試圖將指針的地址存儲爲字符串。換句話說,我想將組成地址的字節的內容插入char向量中。C++:將地址存儲爲字符串

這樣做的最好方法是什麼?

我需要一個完全便攜的方法,包括64位系統。

+0

將每個字符即地址添加到向量中? – Dineshkumar

+1

請參閱http://stackoverflow.com/questions/7850125/convert-this-pointer-to-string。 – user1929959

+0

@Dineshkumar,現在更清楚了嗎? – Subway

回答

2

爲了得到一個陣列(或載體,如果你更喜歡)的地址的實際字節,這應該是訣竅:

int foo = 10; 
int* bar = &foo; 

// Interpret pointer as array of bytes 
unsigned char const* b = reinterpret_cast<unsigned char const*>(&bar); 

// Copy that array into a std::array 
std::array<unsigned char, sizeof(void*)> bytes; 
std::copy(b, b + sizeof(void*), bytes.begin()); 

獲取包含十六進制表示的陣列分成單個字符(這使得任何意義上的),我會使用一個字符串流 - 因爲有些人已經建議。你也可以使用snprintf來獲取地址的字符串表示,但這更多的是C風格的方式。

// Turn pointer into string 
std::stringstream ss; 
ss << bar; 
std::string s = ss.str(); 

// Copy character-wise into a std::array (1 byte = 2 characters) 
std::array<char, sizeof(void*) * 2> hex; 
std::copy(s.begin(), s.end(), hex.begin()); 
+0

我只是好奇,獲取十六進制表示字符的方式是什麼? – Subway

+0

@Subway我已經爲我的答案添加了代碼。 – Niko

2

的最簡單的方法是做

char buf[sizeof(void*) * 2 + 3]; 
snprintf(buf, sizeof(buf), "%p", /* the address here */); 
+0

感謝您的回答。爲什麼是32?它不是比需要的更大嗎? – Subway

+0

@Subway它太多了,但它現在可以在任何平臺上運行。我正在用便攜式方式進行編輯。 – Guillaume

+0

32位使用8 + 1,64位使用16 + 1,所以這種方法允許高達128位,但在這種情況下它不會有空值。您可以根據平臺調整緩衝區大小,例如'char buf [sizeof(size_t)* 2 + 1]'。 – Dave

0
void storeAddr(vector<string>& v,void *ptr) 
{ 
    stringstream s; 
    s << (void*)ptr ; 
    v.push_back(s.str()); 
} 
+0

這裏的演員什麼都不做;它從'void *'投射到'void *' – Dave

1
std::string serialized (std::to_string ((intptr_t) ptr)); 
+0

謝謝Artem。沒有比C風格的鑄造更適合的C++鑄造嗎? – Subway

+0

地鐵,這是一個品味的問題。有時一個較不詳細的版本更容易閱讀。如果你是不同指導方針的粉絲,可以隨意使用它們。 – ArtemGr

+0

地鐵,intptr_t是一個C風格的事情(從'stdint.h')。如果你願意,你可以使用'std :: intptr_t'。 – ArtemGr

1

C++方式DOS這是使用字符串流

#include <string> 
#include <sstream> 

int main() 
{ 
    MyType object; 
    std::stringstream ss; 
    std::string result; 

    ss << &object; // puts the formatted address of object into the stream 
    result = ss.str(); // gets the stream as a std::string 

    return 0; 

}