gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:45 24 4
gpt4 key购买 nike

我想知道为什么这可以达到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com