Saltar al contenido

printf(“%p”) y conversión a (void *)

Queremos compartirte la mejor solución que hallamos en línea. Nosotros queremos que te resulte de utilidad y si deseas compartir algún detalle que nos pueda ayudar a crecer hazlo con total libertad.

Solución:

El %p el especificador de conversión requiere un argumento de tipo void *. Si no pasa un argumento de tipo void *la llamada a la función invoca un comportamiento indefinido.

Del estándar C (C11, 7.21.6.1p8 funciones de entrada/salida formateadas):

“p – El argumento será un puntero a void.”

No se requiere que los tipos de puntero en C tengan el mismo tamaño o la misma representación.

Un ejemplo de una implementación con representación de diferentes tipos de punteros es Cray PVP donde la representación de los tipos de punteros es de 64 bits para void * y char * pero 32 bits para los otros tipos de punteros.

Consulte el “Manual de referencia de Cray C/C++”, Tabla 3. en “9.1.2.2” http://docs.cray.com/books/004-2179-003/004-2179-003-manual.pdf

En el lenguaje C, todos los tipos de punteros difieren potencialmente en sus representaciones. Entonces sí, int * es diferente de void *. Una plataforma de la vida real que ilustraría esta diferencia podría ser difícil (o imposible) de encontrar, pero a nivel conceptual la diferencia sigue ahí.

En otras palabras, en general, los diferentes tipos de punteros tienen diferentes representaciones. int * es diferente de void * y diferente de double *. El hecho de que su plataforma utilice la misma representación para void * y int * no es más que una coincidencia, en lo que respecta al lenguaje C.

El lenguaje establece que se requiere que algunos tipos de punteros tengan representaciones idénticas, lo que incluye void * contra char *punteros a diferentes tipos de estructuras o, por ejemplo, int * y const int *. Pero estas son solo excepciones a la regla general.

Otras personas han abordado adecuadamente el caso de pasar un int * a un función prototipada con un número fijo de argumentos que espera un tipo de puntero diferente.

printf no es tal función. Es una función variádica, por lo que la promociones de argumento predeterminado se utilizan para sus argumentos anónimos (es decir, todo después del formato string) y si el tipo promovido de cada argumento no exactamente coincide con el tipo esperado por el efector de formato, el comportamiento no está definido. En particular, incluso siint * y void * tienen representación idéntica,

int a;
printf("%pn", &a);

tiene un comportamiento indefinido.

Esto se debe a que el diseño del marco de llamada puede depender del tipo concreto exacto de cada argumento. En la vida real se han producido ABI que especifican diferentes áreas de argumentos para tipos punteros y no punteros (por ejemplo, al Motorola 68000 le gustaría mantener los punteros en los registros de direcciones y los no punteros en los registros de datos en la mayor medida posible). No tengo conocimiento de ninguna ABI del mundo real que segregue distintas puntero tipos, pero está permitido y no me sorprendería saber de uno.

Si te ha resultado de utilidad nuestro artículo, nos gustaría que lo compartas con otros entusiastas de la programación de esta manera contrubuyes a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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