关于二维数组开太大导致崩溃的问题及解决措施
用Xcode编译器运行,下面一行代码:
#include <iostream>
typedef unsigned long long ULL;
using namespace std;
int main()
{
ULL a[1024][1024] = {1};
cout<<a[0][0]<<" "<<a[1][1]<<endl;
return 0;
}
结果程序会崩溃,具体显示如下:
原因:
数组放在main函数里面,表示该数组是局部变量,不是全局变量,所以该数组是开在栈上,而栈的空间往往比较小,所以二维数组定义太大会导致爆栈。
全局变量全部存储在静态存储区。 在程序开始执行过程中给全局变量分配空间,程序执行完毕就释放空间。程序执行过程中固定的分配空间,而不需要动态进行分配是释放。
静态局部变量属于静态存储类别,在静态存储区内分配存储单元。 在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储空间,函数调用结束后即释放。
解决措施:将局部变量改成全局变量
即将数组定义放在主函数外面,具体如下:
#include <iostream>
typedef unsigned long long ULL;
using namespace std;
ULL a[1024][1024];
int main()
{
a[1024][1024] = {1};
cout<<a[0][0]<<" "<<a[1][1]<<endl;
return 0;
}