Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to simulate printf's %p format when using std::cout?

Tags:

unsigned char *teta = ....;
...
printf("data at %p\n", teta); // prints 0xXXXXXXXX

How can I print variable address using iostreams? Is there a std::??? feature like std::hex to do this kind of conversion (address -> string), so std::cout << std::??? << teta << std::endl will print that address?

(no sprintf's, please ;))

like image 229
kagali-san Avatar asked Apr 14 '11 00:04

kagali-san


2 Answers

Cast to void*:

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

iostreams generally assume you have a string with any char* pointer, but a void* pointer is just that - an address (simplified), so the iostreams can't do anything other than transforming that address into a string, and not the content of that address.

like image 135
Xeo Avatar answered Sep 24 '22 04:09

Xeo


Depending on wheter or not you want to use more formatting options printf gives, you could consider using sprintf

By it, you could format a string just like you'd do with printf, and afterwards print it out with std::cout

However, this would involve using a temporary char array so the choice depends.

An example:

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;
like image 28
lamas Avatar answered Sep 20 '22 04:09

lamas