【发布时间】:2020-01-09 15:08:00
【问题描述】:
size_t 是否保证足够大以表示任何类型的大小?根据this参考:
size_t可以存储一个理论上可能的对象的最大尺寸 任何类型(包括数组)。
这通常是一个可靠的参考,但我在标准的相关部分中找不到任何证明或争议这一主张的内容。
【问题讨论】:
-
size_t 是 sizeof 运算符“返回”的类型,因此编译器应确保声明的对象适合它。至于动态分配的数组,我认为在技术上没有保证,但实际上,实现通常会将分配的大小限制为 ptrdiff_t,以防止 UB 在同一个对象中进行远距离指针减法。
-
@PSkocik 这就是为什么我用“语言律师”标记它
-
@PSkocik 鉴于
malloc()的大小参数是size_t,似乎很难想象一个实现能够动态分配大于size_t可以表示的任何东西。如果您假设calloc()可以分配一个更大的对象,因为结果大小是两个size_t参数的乘积,这意味着必须有一个无符号整数类型能够表示大于size_t的大小并且更大type 应该被用作实际的size_t类型。这似乎充其量是不正当的。 -
@AndrewHenle 是的
-
@PSkocik 好吧,一点挖掘表明“[t]he
calloc函数为nmemb对象数组分配空间”。根据 C 标准,数组是否被视为一个对象?如果不是,这是一个漏洞,允许calloc()创建大于size_t可以表示的数组。现在我们已经进入了语言律师理论的兔子洞......
标签: c language-lawyer size-t