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

标签 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。尚未在 Linux 中测试过。

最佳答案

在 C 语言中,static 存储期限的对象在程序的整个执行期间都存在,而automatic 存储期限的对象(这是默认的功能范围)仅存在于其范围内。直接后果是您将永远只有一个静态版本的实例,而每次调用该函数时都会创建一个自动对象。 C 没有任何关于大小限制的说法。

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

关于c - C中静态和非静态数组的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49936247/

相关文章:

c - NCURSES printw 正确输出 RETURN 和 SPACE 的键码

python - 避免 Python 循环时出现索引错误

javascript - 在 json 数组中搜索

c - 创建 AST 后进行语义检查

C openMP 程序的完全空白输出

arrays - 从 VBA 字符串数组中获取第 n 个元素

c# - 在另一个线程中使用线程时发生内存泄漏

arrays - 在 MATLAB 中预分配数组的替代方法是什么?

java - 对象数组与索引列表+数组

c - 如何将 char 赋值给 int 值?