size_t的最大大小

Sun*_*lly 36 c gcc sizeof c99 size-t

我知道C返回类型的sizeof运算符是size_t在中定义的无符号整数类型<stdint.h>.这意味着它的最大尺寸应该65535在规定作为C99标准7.18.3:

limit of size_t
  SIZE_MAX             65535
Run Code Online (Sandbox Code Playgroud)

但是在gcc-4.8.2头文件stdint.h中定义的大小远远大于标准中所述的与下面所示的65535相矛盾的大小C99,

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

请帮助我理解为什么在我的误解背后存在差异或原因.

Kei*_*son 47

该标准规定SIZE_MAX必须至少为 65535.

它没有指定上限,gcc的实现完全有效.

引用你引用的参考文献(重点补充):

其实现定义值的大小(绝对值)应等于或大于下面给出的相应值,并使用相同的符号.

  • @SunEric:对,"65535"是最小值. (4认同)
  • C中的各种限制通常具有诸如"SIZE_MAX <= UINTMAX_MAX"之类的关系.(可能所有无符号都是如此有限 - 但许多人不知道这一点 - 因此我的评论.)但是,与"LONG_MAX"相比,某些限制并没有像"SIZE_MAX"那样有序.这两个使用`fseek()`(返回long)进行交互,使用`malloc()`分配一个块来匹配一个文件,它接受一个`size_t`. (4认同)
  • 现在它是有道理的.`SIZE_MAX 65535`是最小限制,我把它与'limit of size_t`混淆,认为它是最大限度.谢谢 (2认同)
  • 怀疑`SIZE_MAX`上限是'UINTMAX_MAX`. (2认同)
  • @chux:`SIZE_MAX`不能大于'UINTMAX_MAX`,但在'UINTMAX_MAX`上没有指定的上限.(说'SIZE_MAX`的上限是'SIZE_MAX`只是略微有用.) (2认同)