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?
Respuesta
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.
no, pero un puntero debe tener el mismo tamaño que un intptr_t.
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
@ 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
-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. –
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
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). –
@Joe tiene razón, debería haber restringido mi respuesta al tamaño relativo de int y puntero. – Gaurav
@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
No, especialmente en entornos de 64 bits:
LP64 Esto cubre * nix entornos, pero lo mismo es cierto en las ventanas para LLP64.
No, en absoluto. Muchos compiladores no tienen el mismo tamaño.
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.
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 :)
No. Linux garantiza que son del mismo tamaño. El lenguaje C no hace promesas en absoluto. –
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
- 1. ¿Es seguro asumir que un servidor tendría PHP 5?
- 2. ¿Es seguro asumir generalmente que toString() tiene un costo bajo?
- 3. ¿Es seguro asumir que un GUID siempre será único?
- 4. ¿Es seguro asumir que el almacenamiento de vectores STL es siempre contiguo?
- 5. ¿Hay puntero en C# como C++? ¿Es seguro?
- 6. En C, ¿es seguro lanzar un puntero de función variable a un puntero de función con argumentos finitos?
- 7. ¿Es seguro asumir que la ruta C: \ WINDOWS \ system32 siempre existe?
- 8. ¿Qué es un puntero Singleton en C?
- 9. ¿Es seguro devolver un puntero a una variable local estática?
- 10. Es un parámetro int * exactamente igual que un parámetro int []
- 11. ¿Es seguro mantener un puntero a una variable fuera del alcance?
- 12. ¿Es seguro mantener los punteros de C++ en C#?
- 13. ¿Por qué sizeof (param_array) es el tamaño del puntero?
- 14. ¿Cómo declaras un puntero a una función que devuelve un puntero a una matriz de valores int en C/C++?
- 15. ¿Cuándo es seguro * para el alias de puntero estricto?
- 16. Obtener el tamaño del puntero en C
- 17. En un bucle for mejorado de java, ¿es seguro asumir que la expresión para enrutar será evaluada solo una vez?
- 18. devuelve un int o pasa un puntero int - ¿Qué es mejor?
- 19. size_t es el tamaño del puntero en la práctica
- 20. ¿Es una buena práctica liberar un puntero NULL en C?
- 21. ¿Es un molde de (puntero a const) a (puntero a no const) inválido C++?
- 22. ¿No es un iterador en C++ una especie de puntero?
- 23. C++: La inicialización del puntero a puntero a int
- 24. Pasando un puntero a putchar a una función que recibe un int (*) (int)
- 25. ¿Cuál es el tamaño del puntero en una computadora de 64 bits en C++?
- 26. ¿Qué es un puntero sintético?
- 27. En C: ¿Cómo establecer un puntero a un miembro de la estructura que es una matriz?
- 28. ¿Qué versiones de Java se instalan comúnmente en los navegadores, es seguro asumir 1.4?
- 29. ¿Por qué tener un puntero a un puntero (int ** a)?
- 30. ¿Es seguro asumir una comparación estricta en una declaración de cambio de JavaScript?
Probablemente una pregunta de desbordamiento de pila. – Orbling
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
posible duplicado de [sizeof (int) == sizeof (void \ *)?] (http://stackoverflow.com/questions/502811/sizeof- int-sizeof-void) – Amro