C中数组的最大大小
我明白,硬件将限制程序执行期间分配的内存量。 但是,我的问题是不考虑硬件。 假设内存的数量没有限制,那arrays没有限制吗?
C中数组的大小没有固定的限制
任何单个对象(包括任何数组对象)的大小都受SIZE_MAX
限制, SIZE_MAX
是sizeof
运算符的结果size_t
types的最大值。 (C标准是否允许大于SIZE_MAX
字节的对象是不完全清楚的,但实际上这样的对象不被支持;参见脚注)。由于SIZE_MAX
由实现决定,并且不能被任何程序修改,所以强制上限任何单个对象的SIZE_MAX
字节。
typesvoid*
的宽度是一个generics指针types,它强制执行程序中的所有对象的总大小(可能大于单个对象的最大大小)的上限。
C标准在这些固定尺寸上施加了下限,但没有上限。 不符合的C实现可以支持无限大小的对象,但是它原则上可以支持任何有限大小的对象。 上限是由各个C实现,它们所在的环境以及物理而不是语言所强加的。
例如,一致的实现可以有SIZE_MAX
等于2 1024 -1,这意味着它可以在原则上有对象高达179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137215个字节。
祝你好运find实际上支持这些对象的硬件。
脚注 :没有明确的规则,没有对象可以大于SIZE_MAX
字节。 你不能有效地将sizeof
运算符应用于这样的对象,但是像其他运算符一样, sizeof
可以溢出; 这并不意味着你不能对这样的对象进行操作。 但实际上,任何理智的实现都会使size_t
足够大,以表示它支持的任何对象的大小。
不考虑内存,数组的最大大小受用于索引数组的整数types的限制。
一个64位的机器理论上可以处理最多2 ^ 64个字节的内存。
C99 5.2.4.1“翻译限制”至less保证:
实施应该能够翻译和执行至less一个程序,该程序至less包含以下每个限制的一个实例:13)
- 一个对象中的65535字节(仅在托pipe环境中)
13)实施应尽可能避免施加固定的翻译限制。
这表明符合的实现可能会拒绝编译一个超过short
字节的对象(包括数组)。
我想最大的理论数组将是“无符号长”的最大值(或无论您的编译器支持最新的标准/最大的整数)
指针的大小将限制您可以访问的内存。 即使硬件提供对无限制内存的支持,如果您可以使用的最大数据types是64位,那么您将只能访问2 ^ 64字节的内存。
我正在寻找一种方法来确定数组的最大大小。 这个问题似乎也一样,所以我想分享我的发现。
最初,C没有提供任何函数来确定在编译时间内数组中可分配元素的最大数量。 这是因为它将取决于机器可用的内存在哪里执行。
另一方面,我发现,内存分配函数( calloc()
和malloc()
)可以分配更大的数组。 而且,这些函数允许您处理运行时内存分配错误。
希望有所帮助。