¿Cuál es la diferencia de usar\% p,\% u y\% x para imprimir la dirección de variable en C?


Mejor respuesta

Si necesita imprimir una dirección de algo , o el contenido de una variable de puntero, la única forma verdaderamente portátil de hacerlo es usar el especificador de formato\% p. El estándar C establece que los caracteres impresos están definidos por la implementación, pero en la práctica, la mayoría de las implementaciones de la biblioteca C generan una secuencia de dígitos hexadecimales que representan la dirección.

Los especificadores de formato\% u y\% x esperan un entero sin signo e imprima el valor en decimal y hexadecimal, respectivamente. No esperan una dirección .

Si usa\% u o\% x (o cualquier otra cosa que\% p) para intentar imprime una dirección, puede parecer que funciona en algunos entornos, pero en realidad será comportamiento indefinido y no portátil . No puede suponer que el tamaño de un puntero es el mismo que el tamaño de un entero sin signo (o cualquier otro tipo de datos enteros). Por ejemplo, en muchos entornos de 64 bits, un entero sin signo es de 32 bits. Si el número de bits en un puntero no coincide con el número de bits en un entero sin signo en su entorno e intenta usar\% u o\% x para imprimir una dirección, obtendrá un resultado incorrecto y el resultado de la siguiente Los elementos de la misma llamada a printf también pueden ser incorrectos.

Por tanto, si va a imprimir una dirección, utilice siempre el especificador de formato\% p, para código portátil que evite comportamientos indefinidos. Nunca asuma que el tamaño de un puntero es el mismo que el tamaño de cualquier otro tipo de datos C.

Responda

Solo el \%p conversión entiende correctamente un puntero. La conversión \%p imprime un puntero de una manera específica de implementación.

Las \%u y \%x Las conversiones son para los tipos unsigned int o int, que pueden tener o no el mismo tamaño que un tipo de puntero. La conversión \%u imprime un entero decimal sin signo, mientras que \%x imprime un entero hexadecimal sin signo en minúsculas.

Para imprima un puntero con \%u o \%x, deberá convertir el puntero en un int o unsigned int. Ese elenco puede perder información si sizeof(void *) > sizeof(int).

Ver también: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *