2011-01-01 11 views
8

Al diseñar un nuevo lenguaje de programación, ¿es seguro asumir que un C int y un puntero tienen el mismo tamaño en la máquina?¿Es seguro asumir que un puntero es del tamaño de un int en C?

+4

Probablemente una pregunta de desbordamiento de pila. – Orbling

+0

Vea también: [C++: ¿Es seguro lanzar el puntero a int y luego volver al puntero nuevamente?] (Http://stackoverflow.com/questions/3567905/c-is-it-safe-to-cast-pointer- to-int-and-later-back-to-pointer-again) – Shog9

+1

posible duplicado de [sizeof (int) == sizeof (void \ *)?] (http://stackoverflow.com/questions/502811/sizeof- int-sizeof-void) – Amro

Respuesta

16

No. Un puntero puede ser más grande o más pequeño que un número entero. Si necesita pasar un puntero como un entero por alguna razón (como la realización de enteros, en lugar de puntero, aritmética), se garantiza que caben en un intptr_t.

No se garantiza que encajen en un tamaño_t como se sugiere en otra respuesta, pero en la práctica es poco probable que no lo sean, ya que el tamaño direccionable más grande suele ser igual a la dirección direccionable más grande.

1

no, pero un puntero debe tener el mismo tamaño que un intptr_t.

+0

Parece que sizeof (int)! = sizeof (int *) con la máquina y el compilador que estoy usando en este momento ... así que si algo similar es seguro, no involucra int . – compman

+1

@ user9521: Como dice Dan, siempre use los tipos 'size_t'. El problema principal con la conversión de código a x64 es la prevalencia de personas suponiendo que el tamaño int es el mismo, esa práctica fue desaprobada hace muchos años. – Orbling

+2

-1 - De hecho, es probable que tengas razón, pero de jure estás equivocado. En arquitecturas de memoria segmentadas (y otras clases de patologías), size_t puede ser más pequeño que intptr_t. http://stackoverflow.com/questions/1464174/size-t-vs-intptr-t. –

1

Creo que se refiere al tamaño de los tipos de datos definidos por la plataforma no C lang. A lo mejor de mi conocimiento, C no define ningún tamaño específico para los tipos de datos. La respuesta a su pregunta es que no puede suponer esto, por ejemplo, en win32 sizeof (int) == sizeof (puntero) == 4 bytes, sin embargo en win64 sizeof (int) == 4 y sizeof (puntero) == 8

+2

El lenguaje C define varios tamaños de datos mínimos (por ejemplo, size_t debe ser de al menos 16 bits), tamaños relacionales (long no puede ser más corto que corto), así como algunos tipos de tamaño fijo (uint32_t es exactamente 32 bits). –

+0

@Joe tiene razón, debería haber restringido mi respuesta al tamaño relativo de int y puntero. – Gaurav

+0

@Joe: Parece que uint32_t apareció por primera vez en el estándar C en C99 (ver http://en.wikipedia.org/wiki/Stdint.h) porque fue entonces cuando stdint.h se convirtió en parte del estándar. (No sé si las implementaciones a veces lo proporcionarían antes de C99). – compman

3

No, especialmente en entornos de 64 bits:

LP64 Esto cubre * nix entornos, pero lo mismo es cierto en las ventanas para LLP64.

5

No, en absoluto. Muchos compiladores no tienen el mismo tamaño.

1

No; en mi MacOS X 10.6.5. máquina, un int es de 32 bits y un puntero es de 64 bits por defecto.

Si necesita un entero que es el tamaño adecuado para mantener un puntero también, utilizar #include <inttypes.h> (o <stdint.h>) y uintptr_t - suponiendo que tiene el apoyo C99, o puede simularlo.

-2

Creo que el kernel de Linux pasa punteros como long sin signo. Se garantiza que tengan al menos el mismo tamaño que un puntero :)

+3

No. Linux garantiza que son del mismo tamaño. El lenguaje C no hace promesas en absoluto. –

+0

Esta es en realidad una buena respuesta porque muestra cierto comportamiento de kernel y su desprecio por las reglas de lenguaje C. Causa errores en la vida real, como el [Bug 4441: procesador VIA C7-D de OpenSSL: Hang in 30-test_afalg.t] (https://rt.openssl.org/Ticket/Display.html?id=4441). Parece que se debe a que el kernel está lanzando punteros (i686, 32 bits) a integrales de mayor tamaño (sin signo largo y luego almacenados en un '__u64'). – jww

Cuestiones relacionadas