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

C语言中静态数组和非静态数组的区别,c,arrays,memory,static,C,Arrays,Memory,Static,我想知道为什么它可以工作到1e8大小。对于大于1e8的大小,编译器会说“大小太大” #包括 int main(){ printf(“分配…\n”); 静态浮点m[(int)1e8]; printf(“完成”\n); } 而这只适用于1e5。如果将size设置为1e6,则它可以正常编译,但在运行时甚至在打印第一行之前崩溃 #include <stdio.h> int main() { printf("allocating...\n"); float m[(int)1e

我想知道为什么它可以工作到1e8大小。对于大于1e8的大小,编译器会说“大小太大”

#包括
int main(){
printf(“分配…\n”);
静态浮点m[(int)1e8];
printf(“完成”\n);
}
而这只适用于1e5。如果将size设置为1e6,则它可以正常编译,但在运行时甚至在打印第一行之前崩溃

#include <stdio.h>
int main() {
    printf("allocating...\n");
    float m[(int)1e5];
    printf("done\n");
}
#包括
int main(){
printf(“分配…\n”);
浮动m[(int)1e5];
printf(“完成”\n);
}
这些限制是什么?为什么
静态
有更高的限制



编辑:windows7中的平台是MinGW64。尚未在linux中进行测试。

对于C,具有静态存储持续时间的对象在程序的整个执行时间内都有效,而具有自动存储持续时间(在函数作用域中是默认值)的对象仅在其作用域内有效。直接的结果是,静态版本只有一个实例,而每次调用函数时都会创建一个自动对象。C对尺寸限制没有任何意见


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

对于C,具有静态存储持续时间的对象将在程序的整个执行时间内存在,而具有自动存储持续时间(这是函数作用域中的默认值)的仅在其作用域内存在。直接的结果是,静态版本只有一个实例,而每次调用函数时都会创建一个自动对象。C对尺寸限制没有任何意见


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

静态声明通常在程序启动时分配,并且在程序运行时仍会分配,而非静态声明通常存储在堆栈上,并且可以在函数终止时重新使用。这可能就是这两种分配行为不同的原因


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

静态声明通常在程序启动时分配,并且在程序运行时仍然分配,而非静态声明通常存储在堆栈上,并且在函数终止时可以重新使用。这可能就是这两种分配行为不同的原因


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

如果您在Linux系统上,您可以键入
ulimit-s
来确定允许的最大堆栈大小。这通常是8MB。(以1KB的倍数打印)。如果您在Linux系统上,可以键入
ulimit-s
以确定允许的最大堆栈大小。这通常是8MB。(以1KB的倍数打印)。
#include <stdio.h>
int main() {
    printf("allocating...\n");
    float m[(int)1e5];
    printf("done\n");
}