阵列的最大索引及其在平台上的长度

时间:2017-09-01 21:28:18

标签: c arrays

C 中,char数组的索引范围可以从02 ^ (sizeof(size_t) * CHAR_BITS),但数组成员的数量是该数字加1,size_t变量无法保存。

例如,在 x86 中,如果sizeof(size_t)4,则索引可以从0转到0xFFFFFFFF,但计数如果数组已满,则成员为0xFFFFFFFF + 1sizeof(size_t)无法保留。

1)这是正确的吗? 2)我正在考虑将最高指数限制为0xFFFFFFFE,有没有更好的解决方案?

我知道这个例子很极端,但我想用它作为参考。

2 个答案:

答案 0 :(得分:1)

C标准表示对象的大小返回sizeof,其类型为size_t,返回值以字节为单位,因此可以非常安全地说出所有种类对于普通对象,绝对最大大小(以字节为单位)为SIZE_MAX。无法使用SIZE_MAXmalloc分配大于realloc的对象;但calloc的API可以允许这样做。

因此,任何数组都有最多SIZE_MAX个元素。

虽然单个对象不能超过SIZE_MAX,但程序中所有对象的总字节数可能会超过SIZE_MAX

答案 1 :(得分:1)

物件

对象的最大尺寸约为SIZE_MAXsizeof 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)。这通常要求地址方案不是许多平台采用的传统通用线性模型。