【问题标题】:Declare variable in global/function scope. Stack difference?在全局/函数范围内声明变量。堆栈差异?
【发布时间】:2016-05-17 21:41:03
【问题描述】:

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

是否崩溃:

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

编辑:所以我知道,第二个例子是数据段中的内存。数据段可以有多大?会不会有堆区那么大?

【问题讨论】:

  • “堆栈变量不同” - 好吧,因为第二个不是堆栈变量。堆栈的大小是有限的,相对于整个程序的允许大小来说非常小。这是对非常大的数组使用 std::vector 的一个很好的理由。
  • 全局变量实际上并不是堆栈变量。它们是在加载时间分配的。此外,它似乎不应该崩溃,当我测试它时它没有。
  • 希望 this 有所帮助。
  • @YamMarcovic 这取决于堆栈大小。你的一定更大。

标签: c++ memory scope stack


【解决方案1】:

第一个

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

【讨论】:

  • 不要堆(通常)
  • @YamMarcovic 是的,我认为是一些特定的部分。但在讲座中,由于特定原因,我得到了一堆。我认为在课堂上讲授更容易。
猜你喜欢
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多