我在Microsoft Visual Studio Express 2012中编译了以下C程序:
int main() {
int a[300000];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这与msvcr110d.dll中的堆栈溢出崩溃!__ crtFlsGetValue().
如果我将数组大小从300,000更改为200,000它可以正常工作(因为这个简单的程序可以说是"工作",因为它没有做任何事情).
我在Windows 7上运行,并且还在Cygwin下使用gcc尝试了这个并且它产生了相同的行为(在这种情况下是一个seg错误).
有没有搞错?
C中自动对象使用的空间大小存在特定于平台的限制("堆栈大小").大于该大小的对象(在嵌入式平台上可能是几千字节,在台式机上可能是几兆字节)不能被声明为自动对象.使它们变为静态或动态.
类似地,函数调用的深度存在限制,特别是在递归方面.
检查编译器和/或平台文档,以获取有关实际大小的详细信息,以及如何更改它的详细信息.(例如在Linux上退房ulimit
.)