我和这个答案持有相同的看法,即标准始终保证size_t
足够大,可以容纳给定系统中最大的类型。
然而,在gcc/Mingw上,这段代码无法编译:
#include <stdint.h>
#include <stddef.h>
typedef uint8_t array_t [SIZE_MAX];
错误:数组 'array_t' 的大小太大
我是否对标准有什么误解?在给定的实现中,size_t
是否允许过大?还是这是Mingw的另一个错误?
编辑:进一步研究表明
typedef uint8_t array_t [SIZE_MAX/2]; // does compile
typedef uint8_t array_t [SIZE_MAX/2+1]; // does not compile
恰好与之相同
#include <limits.h>
typedef uint8_t array_t [LLONG_MAX]; // does compile
typedef uint8_t array_t [LLONG_MAX+(size_t)1]; // does not compile
因此,我现在倾向于认为这是Mingw中的一个漏洞,因为基于有符号整数类型设置最大允许大小没有任何意义。
SIZE_MAX
大小的数组很可能会占用所有内存空间。 - Paul Ogilviesizetype
的有符号对应项(注释中的INT_MAX
是误导性的)强制执行。在第5933行,index
被赋值为c_common_signed_type(sizetype);
。这可能解释了“半范围”问题。 - Grzegorz Szpetkowskiptrdiff_t
类型是有符号的。 - Grzegorz SzpetkowskiSIZE_MAX
的对象存在。它只是暗示编译器不能允许大于SIZE_MAX
的对象存在。即使您并未实际创建该对象,由于sizeof
也可以应用于类型,因此这仍然成立。 - Brian Bi