C中静态和非静态数组的区别

时间:2018-04-20 07:24:24

标签: c arrays memory static

我想知道为什么这个尺寸可达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上测试过它。

2 个答案:

答案 0 :(得分:5)

就C而言,具有静态存储持续时间的对象在程序的整个执行时间内存在,而具有自动存储持续时间的对象(默认为功能范围)仅存在于其范围内。直接后果是您将只有一个静态版本的实例,而每次调用该函数时都会创建一个自动对象。 C对尺寸限制没有任何说法。

但当然,有一个简单的解释:C的大多数实现使用堆栈来存储自动变量。每个函数调用都有自己的堆栈框架,因此这可以确保每个函数都使用自己的&#34;局部变量&#34;的实例。操作系统限制了堆栈的总大小,这是您在此处遇到的限制。另一方面,具有静态存储持续时间的对象直接在您的可执行文件中定义,该内存将在您的进程启动时从操作系统中获取。

答案 1 :(得分:2)

静态声明通常在程序启动时立即分配,并且只要程序运行仍然分配,而非静态声明通常存储在堆栈中,并且可以在函数终止后立即重用。这可能就是为什么这两个分配的行为不同。

我想说在第二种情况下,程序崩溃的事实与操作系统处理堆栈的方式有关。但我无法确定