我有这段代码在运行时会出现段错误。
#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()分配大对象,并且可以在堆栈上本地分配小数组。但是我想确切地知道这些小数组的大小。我也希望解决方案是可移植的。
另外,如果我在分配数组之前在堆栈上有其他东西怎么办?在这种情况下,堆栈的最大大小不能用作我的数组的大小,因为堆栈将溢出。
答案 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个字节。