Tamaño máximo de size_t

2 minutos de lectura

avatar de usuario
Sunil Bojanapally

lo se en C tipo de retorno de sizeof el operador es size_t siendo un tipo entero sin signo definido en <stdint.h>. Lo que significa que el tamaño máximo debe ser 65535 como se indica en C99 estándar 7.18.3:

limit of size_t
  SIZE_MAX             65535

Sin embargo en gcc-4.8.2 archivo de cabecera stdint.h ha definido su tamaño mucho mayor que 65535 en contradicción con lo establecido en C99 estándar como se muestra a continuación,

/* Limit of `size_t' type.  */
# if __WORDSIZE == 64
#  define SIZE_MAX              (18446744073709551615UL)
# else
#  define SIZE_MAX              (4294967295U)
# endif

Amablemente ayúdame a entender por qué hay una diferencia o razón detrás de mi mala interpretación.

  • Cómo obtener SIZE_MAX en C89

    – phuclv

    7 de junio de 2017 a las 1:58

avatar de usuario
keith thompson

La norma dice que SIZE_MAX debe ser al menos 65535.

No especifica ningún límite superior y la implementación de gcc es perfectamente válida.

Citando la referencia que citó (énfasis agregado):

Su valor definido por la implementación será igual o mayor en magnitud (valor absoluto) que el valor correspondiente dado a continuación, con el mismo signo.

  • Ahora tiene sentido. SIZE_MAX 65535 es el límite mínimo, con el que me confundí limit of size_t pensándolo como límite máximo. Gracias

    – Sunil Bojanapally

    19 de marzo de 2014 a las 18:36

  • @SunEric: Correcto, 65535 es el mínimo máximo.

    –Keith Thompson

    19 de marzo de 2014 a las 18:46

  • Sospechar SIZE_MAX límite superior es UINTMAX_MAX.

    – chux – Reincorporar a Monica

    19 de marzo de 2014 a las 18:49

  • @chux: SIZE_MAX no puede ser más grande que UINTMAX_MAXpero no hay un límite superior especificado en UINTMAX_MAX. (Solo es un poco menos útil decir que el límite superior de SIZE_MAX es SIZE_MAX.)

    –Keith Thompson

    19/03/2014 a las 18:50

  • Varios límites en C a menudo tienen una relación como SIZE_MAX <= UINTMAX_MAX. (Probablemente todos los que no están firmados son tan limitados, pero muchos no lo saben, de ahí mi comentario). Pero algunos límites no están bien ordenados como SIZE_MAX comparado con LONG_MAX. Estos 2 entran en interacción usando fseek() (que devuelve long) para asignar un bloque para que coincida con un archivo usando malloc() que toma un size_t.

    – chux – Reincorporar a Monica

    19 de marzo de 2014 a las 18:57

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad