【发布时间】: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 这取决于堆栈大小。你的一定更大。