2013-06-02 147 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; 

}