如果我们在全局或函数范围内声明它们,为什么堆栈变量有不同?由于堆栈溢出,两个示例崩溃之一。但只有一个,它在范围内定义一个变量。
崩溃:
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
编辑:我知道,第二个例子是数据段中的内存。数据段有多大?它可能像堆区一样大吗?
答案 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