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

¿Cómo puedo imprimir la dirección variable usando iostream s? ¿Hay un std:: ??? característica como std::hex para hacer este tipo de conversión (dirección -> cadena), entonces std::cout << std::??? << teta << std::endl imprimirá esa dirección?¿Cómo simular el formato% p de printf al usar std :: cout?

(no de sprintf, por favor;))

Respuesta

26

moldeada a void*:

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

iostreams general, se supone que tiene una cadena con cualquier puntero char*, pero un puntero void* es sólo eso - una dirección (simplificado), por lo que los iostreams no pueden hacer otra cosa que transformar esa dirección en una cadena, y no el contenido de esa dirección.

1

Dependiendo de wheter o no desea utilizar más opciones de formato printf da, se podría considerar el uso de sprintf

Por ello, se puede dar formato a una cadena al igual que lo hace con printf, y después imprimirlo con std::cout

Sin embargo, esto implicaría el uso de una matriz de caracteres temporal, por lo que la elección depende.

Un ejemplo:

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

y en este caso (void *) de fundición es mejor - sin matriz temporal se ajustan a una sola línea de código de depuración (log4cxx) .. –

+1

en lugar de 'insegura sprintf' usted podría considere 'snprintf' o (mejor) Boost.Format. –

+3

-1 para MAGIC_BUFFER_SIZE y sprintf. – Puppy

Cuestiones relacionadas