我想知道为什么这可以达到 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。尚未在 Linux 中测试过。
最佳答案
在 C 语言中,static 存储期限的对象在程序的整个执行期间都存在,而automatic 存储期限的对象(这是默认的功能范围)仅存在于其范围内。直接后果是您将永远只有一个静态版本的实例,而每次调用该函数时都会创建一个自动对象。 C 没有任何关于大小限制的说法。
当然,有一个简单的解释:大多数 C 实现使用堆栈 来存储自动变量。每个函数调用都有自己的堆栈框架,因此这可以确保每个函数都使用自己的“局部变量”实例。操作系统限制了堆栈的总大小,这就是您在这里遇到的限制。另一方面,具有静态存储持续时间的对象直接在您的可执行文件中定义,该内存将在您的进程启动时从操作系统中获取。
关于c - C中静态和非静态数组的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49936247/