Convertir un puntero que no sea `vacío` en `uintptr_t` y viceversa

2 minutos de lectura

avatar de usuario
Eugenio Sh.

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


Yo no me arriesgaría. La norma deja muy claro lo que está permitido y lo que no está permitido.

Escritura uintptr_t s = (uintptr_t)(void*)p; le indica a un lector de su código que sabe lo que está haciendo.

  • Honestamente, si viera ese código, me preguntaría si el autor sabía lo que estaba haciendo. En parte porque no tendría un recuerdo completo de los pasajes relevantes del estándar en cuestión. No digo que esté mal escribirlo de esa manera, pero tampoco me parecería obviamente correcto.

    – John Zwink

    15 de diciembre de 2015 a las 14:18


  • En cuyo caso, no estaría de más escribir un comentario. Depende de las políticas de su casa.

    – Betsabé

    15 de diciembre de 2015 a las 14:19


¿Ha sido útil esta solución?