int在C中在堆栈上分配一个大型数组时,程序执行时没有错误.但是,如果我事先在堆栈上初始化变量,则会发生段错误(可能是因为大型数组超出了堆栈大小).如果在声明数组后初始化变量,这对我来说是有意义的.是什么导致这种行为,记忆明智?
我的印象是,只需在堆栈上声明一个变量,就会分配所需的空间,导致在分配非常大的数据类型时立即崩溃.
我怀疑它与编译器优化它有关,但它没有意义,考虑到我foo在第二个例子中也没有改变.
我正在使用gcc 7.2.0进行编译,没有设置任何标志.在Ubuntu 17.10上执行.
这运行没有错误:
int main(){
int i;
unsigned char foo [1024*1024*1024];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这会立即崩溃:
int main(){
int i = 0;
unsigned char foo [1024*1024*1024];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人能告诉我这里发生了什么吗?