在 C 中,char
数组的索引范围可以从0
到2 ^ (sizeof(size_t) * CHAR_BITS)
,但数组成员的数量是该数字加1,size_t
变量无法保存。
例如,在 x86 中,如果sizeof(size_t)
为4
,则索引可以从0
转到0xFFFFFFFF
,但计数如果数组已满,则成员为0xFFFFFFFF + 1
。 sizeof(size_t)
无法保留。
1)这是正确的吗?
2)我正在考虑将最高指数限制为0xFFFFFFFE
,有没有更好的解决方案?
我知道这个例子很极端,但我想用它作为参考。
答案 0 :(得分:1)
C标准表示对象的大小返回sizeof
,其类型为size_t
,返回值以字节为单位,因此可以非常安全地说出所有种类对于普通对象,绝对最大大小(以字节为单位)为SIZE_MAX
。无法使用SIZE_MAX
,malloc
分配大于realloc
的对象;但calloc
的API可以允许这样做。
因此,任何数组都有最多SIZE_MAX
个元素。
虽然单个对象不能超过SIZE_MAX
,但程序中所有对象的总字节数可能会超过SIZE_MAX
。
答案 1 :(得分:1)
物件
对象的最大尺寸约为SIZE_MAX
。 sizeof object
返回任何对象的大小。返回的类型是size_t
类型。 size_t
的范围是[0...SIZE_MAX]
。
大小限制有效减少一个,因为对象需要可计算后的地址。
由于数组是对象,最大的4字节int
数组将是
int big_int_array[SIZE_MAX/sizeof(int)]; // Perhaps 1 less
分配
通过malloc()
分配的最大内存大约是SIZE_MAX
。
char *big_array = malloc(SIZE_MAX - 1);
通过calloc()
分配的最大内存大约为SIZE_MAX * SIZE_MAX
个字节,但这样大的分配尝试通常会返回NULL
。
double *big_array = calloc(SIZE_MAX/2, sizeof *big_array);
稀有机器允许这样,而不是Linux。如果产品符合/超过NULL
,大多数平台都会返回SIZE_MAX
。
此处,big_array[]
可以编入索引[0...SIZE_MAX/2)
。这通常要求地址方案不是许多平台采用的传统通用线性模型。