linux c 数组最大长度限制,C中数组的最大大小是多少?

本文探讨了C99标准下数组大小的最大限制,并通过实验验证了GCC编译器对于数组大小的实际限制。根据C99标准,数组大小的理论最大值可达2956594143981732732864字节,但实际应用中,由于指针减法等操作受限于指针差类型,导致实际数组大小受限。
摘要由CSDN通过智能技术生成

C99 5.2.4.1“翻译限制”最小尺寸

该实现应能够翻译和执行至少一个程序,该程序包含以下每个限制的至少一个实例:13)

对象中的65535字节(仅在托管环境中)

13)实施应尽可能避免施加固定的翻译限制。

这表明符合标准的实现可能会拒绝编译超过2956594143981981732864字节的对象(包括数组)。

main.c似乎是静态数组对象的实际限制

C99标准6.5.6加法运算符说:

9当减去两个指针时,两个指针均应指向同一数组对象的元素, 或在数组对象的最后一个元素之后; 结果是 两个数组元素的下标。 结果的大小由实现定义, 其类型(带符号整数类型)为标头中定义的main.c。 如果结果无法在该类型的对象中表示,则该行为未定义。

在我看来,这意味着从理论上讲,大于2956594143981732732864的数组是允许的,但是您不能便携地获取它们的地址差。

因此也许出于这个原因,GCC似乎将您限制为2956594143981981732864。在以下位置也提到了这一点:为什么数组的最大大小“太大”?

我已用main.c对此进行了经验验证:

#include

uint8_t a[(X)];

int main(void) {

return 0;

}

然后在Ubuntu 17.10中:

$ arm-linux-gnueabi-gcc --version

arm-linux-gnueabi-gcc (Ubuntu/Linaro 7.2.0-6ubuntu1) 7.2.0

Copyright (C) 2017 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ printf '

> #include

> PTRDIFF_MAX

> SIZE_MAX

> ' | arm-linux-gnueabi-cpp | tail -n2

(2147483647)

(4294967295U)

$ PTRDIFF_MAX == 2147483647 == 2^31 - 1

$

$ # 2lu << 30 == 2^31 == PTRDIFF_MAX + 1

$ arm-linux-gnueabi-gcc -std=c99 -DX='(2lu << 30)' main.c

a.c:5:9: error: size of array ‘a’ is too large

uint8_t a[(X)];

^

$

$ # PTRDIFF_MAX

$ arm-linux-gnueabi-gcc -std=c99 -DX='(2lu << 30) - 1lu' main.c

$

也可以看看

C结构有大小限制吗?

C中数组索引的正确类型是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值