我想知道为什么这个尺寸可达1e8。对于大于1e8的大小,编译器说"大小太大"。
#include <stdio.h>
int main() {
printf("allocating...\n");
static float m[(int)1e8];
printf("done\n");
}
虽然这只能达到1e5。如果size设置为1e6,它编译正常,但在运行时甚至在打印第一行之前就崩溃了。
#include <stdio.h>
int main() {
printf("allocating...\n");
float m[(int)1e5];
printf("done\n");
}
这些限制是什么?为什么static
有更高的限制?
编辑:平台是windows7中的MinGW64。 Haven尚未在linux上测试过它。
答案 0 :(得分:5)
就C而言,具有静态存储持续时间的对象在程序的整个执行时间内存在,而具有自动存储持续时间的对象(默认为功能范围)仅存在于其范围内。直接后果是您将只有一个静态版本的实例,而每次调用该函数时都会创建一个自动对象。 C对尺寸限制没有任何说法。
但当然,有一个简单的解释:C的大多数实现使用堆栈来存储自动变量。每个函数调用都有自己的堆栈框架,因此这可以确保每个函数都使用自己的&#34;局部变量&#34;的实例。操作系统限制了堆栈的总大小,这是您在此处遇到的限制。另一方面,具有静态存储持续时间的对象直接在您的可执行文件中定义,该内存将在您的进程启动时从操作系统中获取。
答案 1 :(得分:2)
静态声明通常在程序启动时立即分配,并且只要程序运行仍然分配,而非静态声明通常存储在堆栈中,并且可以在函数终止后立即重用。这可能就是为什么这两个分配的行为不同。
我想说在第二种情况下,程序崩溃的事实与操作系统处理堆栈的方式有关。但我无法确定