如果在全局范围或函数范围内声明堆栈变量,为什么它们会有不同?由于堆栈溢出,两个示例之一崩溃。但是只有一个在范围内定义变量。

是否崩溃:

constexpr size_t MAX = 1000000;  // Customise

int main()
{
  int arr[MAX];

  return arr[MAX - 1];
}


不会崩溃:

constexpr size_t MAX = 1000000;  // Customise

int arr[MAX];

int main()
{
  return arr[MAX - 1];
}


信息:Cygwin,海湾合作委员会4.9

编辑:所以我知道,第二个例子是数据段中的内存。数据段可以有多大?可以和堆面积一样大吗?

最佳答案

第一个

constexpr size_t MAX = 1000000;  // Customise

int main()
{
  int arr[MAX];

  return arr[MAX - 1];
}


您在函数中声明数组,因此它将进入堆栈,这是有限的,并且会导致堆栈溢出。

第二个

constexpr size_t MAX = 1000000;  // Customise

int arr[MAX];

int main()
{
  return arr[MAX - 1];
}


您在全局声明它,应该在函数之间可访问,这样它就可以堆(相当大)。因此,此处不使用堆栈。

资料来源:Static and global variable in memory

10-07 19:30
查看更多