Puntero de lanzamiento a int más grande

Tengo un puntero En un sistema de 32 bits es de 32 bits. En un sistema de 64 bits es de 64 bits.

Tengo un campo entero largo y largo usado como identificador, y a veces quiero usar el valor del puntero allí. (Nunca vuelvo a un puntero: una vez que lo lanzo al campo de enteros, solo lo comparo para la igualdad).

En los sistemas de 32 y 64 bits, parece seguro hacerlo. (En sistemas apuntados más grandes no es así). ¿Es eso cierto?

Y luego, ¿hay una manera de hacer que GCC no dé la siguiente advertencia solo cuando se construye en plataformas donde esto es seguro (que es, en este momento, todas las plataformas de destino)?

error: convertir a puntero desde un entero de diferente tamaño [-Werror = int-to-pointer-cast]

De acuerdo con el estándar, no hay garantía de que un puntero se ajuste a un tipo entero. En la práctica, de lo contrario, en la mayoría de las computadoras personales, existen varios modelos de memoria . Puede ver que los tipos de punteros y enteros no siempre tienen el mismo tamaño (incluso en computadoras “convencionales”).

Debería utilizar los tipos opcionales intptr_t y uintptr_t , desde C99.

C11 (n1570), § 7.20.1.4

El siguiente tipo designa un tipo entero con signo con la propiedad de que cualquier puntero válido para void se puede convertir a este tipo, luego se convierte de nuevo en puntero a void , y el resultado se comparará igual al puntero original: intptr_t .

El siguiente tipo designa un tipo entero sin signo con la propiedad de que cualquier puntero válido para void se puede convertir a este tipo, luego se convierte de nuevo en puntero a void , y el resultado se comparará igual al puntero original: uintptr_t .

Aquí hay un pequeño ejemplo:

 #include  #include  int n = 42; int *p = &n; intptr_t i = (intptr_t)(void *)p; int *q = (void *)i; printf("%d\n", *q); 

Si desea tener un tipo entero que se garantice que sea lo suficientemente grande como para contener un puntero, considere intptr_t (firmado) o uintptr_t . El estándar garantiza que estos tipos de datos son lo suficientemente grandes como para contener un puntero. No se puede suponer nada más, especialmente no tanto long int es lo suficientemente largo.