在全局/函数范围内声明变量。堆叠差异?

时间:2016-02-08 09:22:13

标签: c++ memory scope stack

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

崩溃:

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,GCC 4.9

编辑:我知道,第二个例子是数据段中的内存。数据段有多大?它可能像堆区一样大吗?

1 个答案:

答案 0 :(得分:2)

第一个

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];
}

你在全局声明它,应该可以在函数之间访问,所以它进入堆(相当大)。所以不要在这里使用堆栈。

来源:$ionicModal