¿Todos los punteros de datos son del mismo tamaño en una plataforma para todos los tipos de datos?

¿Son caracteres char* , int* , long* o incluso long long* del mismo tamaño (en una plataforma determinada)?

No se garantiza que sean del mismo tamaño, aunque en las plataformas con las que tengo experiencia suelen serlo.

Proyecto en línea C 2011:

6.2.5 Tipos

28 Un puntero a void tendrá los mismos requisitos de representación y alineación que un puntero a un tipo de carácter. 48) Del mismo modo, los punteros a versiones calificadas o no calificadas de tipos compatibles deberán tener los mismos requisitos de representación y alineación. Todos los punteros a tipos de estructura deben tener los mismos requisitos de representación y alineación entre sí. Todos los punteros a tipos de unión tendrán los mismos requisitos de representación y alineación entre sí. Los punteros a otros tipos no necesitan tener los mismos requisitos de representación o alineación.


48) Los mismos requisitos de representación y alineación pretenden implicar intercambiabilidad como argumentos para funciones, valores de retorno de funciones y miembros de uniones.

No necesariamente. El estándar no garantiza sizeof(double*) == sizeof(int*) . Por ejemplo, supongamos que un procesador con dos buses de direcciones con diferentes anchuras (como en algunos procesadores de architecture de Harvard) podría tener punteros con diferentes tamaños.

En procesadores integrados de 16 bits que tienen RAM (paginada) y / o flash, el uso de páginas puede hacer que los punteros sean de diferentes tamaños, aunque esto es independiente del tamaño de los datos que señalan.

Por ejemplo, en el procesador HCS12 de Freescale que tiene flash acumulado, los punteros de datos son todos 16 bits.

Sin embargo, los punteros de función son 16 bits para punteros cercanos (para código en la misma página que la función de llamada, o en destello no bancarizado) o 24 bits para punteros lejanos (para código en una página diferente), incorporando el número de página en la dirección .

Las cosas son complicadas si desea almacenar datos constantes en flash paginado, ya que debido a la limitación del tamaño del puntero de datos, la función que utiliza los datos debe estar en la misma página que los datos a los que se accede.

Es concebible que un procesador de 16 bits con memoria RAM almacenada también tenga diferentes tamaños para punteros de datos cercanos y lejanos.

Tenga en cuenta lo que dice el estándar C, citado por John Bode. Tenga en cuenta, también, que el estándar C no dice nada sobre el tamaño de los punteros a las funciones en absoluto.

El estándar POSIX establece algunos requisitos adicionales:

2.12.3 Tipos de puntero

Todos los tipos de punteros de función tendrán la misma representación que el puntero de tipo para anular. La conversión de un puntero de función a vacío * no alterará la representación. Un valor nulo * resultante de dicha conversión se puede convertir al tipo de puntero de función original, utilizando un molde explícito, sin pérdida de información.

Nota: El estándar ISO C no requiere esto, pero se requiere para la conformidad con POSIX.

No existe tal garantía en los estándares C o C ++ ISO, pero en la práctica, aún no he visto una plataforma donde esto no sea válido.

Tenga en cuenta que, independientemente de esto, reinterpret_cast de un puntero a otro conducirá más a menudo a UB, con algunas excepciones ( void* y unsigned char* para POD). Lo mismo ocurriría con cualquier truco sindical. Entonces la pregunta obvia es: ¿por qué te importa?

Al progtwigr el modo real x86 con Watcom C, puede tener un modelo de memoria mixta con punteros cercanos de 16 bits y punteros lejanos de 32 bits.

En los días DOS de modo protegido, un puntero de función y un puntero de datos podrían tener diferentes longitudes porque los datos podrían estar en una sección diferente.

Generalmente sí, todos los apuntadores a cualquier cosa, ya sea que apunten a una cadena int o a larga o una cadena o una matriz de cadenas o una función, apuntan a una sola dirección de memoria, que es del mismo tamaño en una máquina. Esto se debe a que el procesador en una máquina tiene un registro de dirección en el que se cargan estos punteros, y el tamaño de ese registro de direcciones controla el tamaño de los punteros.

La única excepción podría ser en casos como antiguas máquinas Intel 8088 de 16 bits donde había un proceso de dos pasos para determinar la dirección de memoria, que involucraba un puntero de segmento de 16 bits (que identificaba un bloque de 64 KB de memoria dentro del espacio de direcciones de 1 MB). y luego una segunda dirección de memoria de 16 bits para identificar la dirección de memoria específica dentro de ese segmento. Estas dos direcciones de 16 bits se combinaron para obtener la dirección completa de memoria de 20 bits. En ese escenario, entonces, imagino que podría ser posible diferenciar entre las direcciones individuales de 16 bits y la dirección combinada de 20 bits.