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

Raf*_*Raf 1 c memory arrays static

我想知道为什么这个尺寸可达1e8.对于大于1e8的大小,编译器说"大小太大".

#include <stdio.h>
int main() {
    printf("allocating...\n");
    static float m[(int)1e8];
    printf("done\n");
}
Run Code Online (Sandbox Code Playgroud)

虽然这只能达到1e5.如果size设置为1e6,它编译正常,但在运行时甚至在打印第一行之前崩溃.

#include <stdio.h>
int main() {
    printf("allocating...\n");
    float m[(int)1e5];
    printf("done\n");
}
Run Code Online (Sandbox Code Playgroud)

这些限制是什么?为什么static有更高的限制?


编辑:平台是windows7中的MinGW64.尚未在linux中测试过.

小智 5

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

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