如何获得最大可能的数组大小?

时间:2013-12-15 08:19:36

标签: c

我有这段代码在运行时会出现段错误。

#include <stdlib.h> // size_t

int main()
{
    size_t s = 0xFFF;
    char a[ s * s ];

    a[ 0 ] = 'a';

    return 0;
}

当我将变量s的值更改为0xFF时,它可以正常工作。

如何以便携方式确定阵列的最大可能尺寸?

我使用64位linux,代码用

编译
gcc file.c

更新

我知道应该使用malloc()分配大对象,并且可以在堆栈上本地分配数组。但是我想确切地知道这些数组的大小。我也希望解决方案是可移植的。

另外,如果我在分配数组之前在堆栈上有其他东西怎么办?在这种情况下,堆栈的最大大小不能用作我的数组的大小,因为堆栈将溢出。

3 个答案:

答案 0 :(得分:2)

问题不是由“数组的最大大小”引起的(我不认为这样的限制甚至存在),而是由于堆栈大小的限制,因为你在堆栈上声明了数组。

如果您使用的是Linux,则可以getrlimit进行查询。您也可以发现getrusage有帮助。但是我相信大件物品应该在堆上分配(通过类似malloc)。

要更改最大堆栈大小,请参阅Change stack size for a C++ application in Linux during compilation with GNU compiler

答案 1 :(得分:1)

这不是最大数组大小的问题,是最大堆栈帧大小的问题。最大大小取决于操作系统,架构和最大堆栈大小。例如,在Linux上,您可以使用setrlimi(LIMIT_STACK,...)进行调整,在Windows上有几种方法可以控制它,请参阅Thread Stack Size

但这些都不适用。如果要分配大型数组,请从堆中分配,而不是在堆栈中分配。

答案 2 :(得分:0)

数组位于堆栈中。您可以使用命令ulimit -s检查默认堆栈大小。比如说,ulimit -s告诉你堆栈大小是1024字节(实际上它应该是一些像8MB的值),在你的情况下,s使用8个字节,所以a可以达到最大值然后是1016个字节。