2011-04-14 55 views
18
unsigned char *teta = ....; 
... 
printf("data at %p\n", teta); // prints 0xXXXXXXXX 

如何使用iostream s打印可變地址?有沒有std:: ???功能如std::hex做這種轉換(地址 - >字符串),所以std::cout << std::??? << teta << std::endl將打印該地址?如何在使用std :: cout時模擬printf的%p格式?

(沒有的sprintf的,請;))

回答

26

演員到void*

unsigned char* teta = ....; 
std::cout << "data at " << static_cast<void*>(teta) << "\n"; 

輸入輸出流通常假設你有任何char*指針字符串,但void*指針就是這樣 - 一個地址(簡化),所以iostreams除了將該地址轉換爲字符串之外不能做任何其他操作,而不是該地址的內容。

1

根據wheter與否要使用更多的格式選項的printf給,你可以考慮使用sprintf

通過它,你可以格式的字符串,就像你用printf的事,事後將其打印出來與std::cout

但是,這將涉及使用臨時字符數組,所以選擇取決於。

一個例子:

unsigned char *teta = ....; 
... 
char formatted[ 256 ]; //Caution with the length, there is risk of a buffer overflow 
sprintf(formatted, "data at %p\n", teta); 
std::cout << formatted; 
+0

在此情況下(無效*)鑄造更好 - 沒有臨時數組將適合的調試(log4cxx)一行代碼.. – 2011-04-14 00:17:05

+1

,而不是不安全'sprintf'你可以考慮'snprintf'或(更好的)Boost.Format。 – 2011-04-14 06:16:50

+3

-1用於MAGIC_BUFFER_SIZE和sprintf。 – Puppy 2012-10-30 14:50:58