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