小编Nis*_*sky的帖子

为什么在这种特定情况下在堆栈上分配大元素不会失败?

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)

有人能告诉我这里发生了什么吗?

c arrays stack segmentation-fault

5
推荐指数
1
解决办法
97
查看次数

标签 统计

arrays ×1

c ×1

segmentation-fault ×1

stack ×1