Hay dos reglas estándar de C relacionadas:
estándar c99, 6.3.2.3
:
Un puntero a void puede convertirse en o desde un puntero a cualquier tipo de objeto o incompleto. Un puntero a cualquier tipo de objeto o incompleto se puede convertir en un puntero para anular y viceversa; el resultado se comparará igual al puntero original.
Y 7.20.1.4
:
El siguiente tipo designa un tipo entero sin signo con la propiedad de que cualquier puntero válido para anular se puede convertir a este tipo, luego volver a convertirlo en puntero para anular, y el resultado será igual al puntero original:
uintptr_t
Significa que el siguiente código es compatible:
int *p = NULL;
void *q = (void*)p;
uintptr_t s = (uintptr_t)q;
Pero, ¿realmente necesita el yeso de dos pasos? ¿El compilador realizará una conversión intermedia implícita si hace algo como:
int *p = NULL;
uintptr_t s = (uintptr_t)p;
(Bueno, probablemente lo hará en la mayoría de los compiladores, pero mi pregunta es sobre el cumplimiento estándar)
Tenga en cuenta que
p
no está inicializado en ambos. Probablemente algo como:int i = 42; int *p = &i; ...
lo arreglará– PP
15 de diciembre de 2015 a las 14:48
@l3x bueno, sí, gracias. En aras de la integridad lo arreglará.
– Eugenio Sh.
15 de diciembre de 2015 a las 14:49