我在下面运行代码并得到一些奇怪的输出:
#include <iostream>
using namespace std;
int main()
{
for(int ll=1444; ll<1450; ++ll)
{
cout<<ll<<endl;
cout<<"###### 0 #######"<<endl;
int mtx[ll][ll];
cout<<"###### 1 #######"<<endl;
}
return 0;
}
输出结果为:
1444
###### 0 #######
###### 1 #######
1445
###### 0 #######
###### 1 #######
1446
###### 0 #######
###### 1 #######
1447
###### 0 #######
###### 1 #######
1448
###### 0 #######
Segmentation fault
我尝试用ll的值逐个检查,当ll达到1448时,会发生分段错误。
然后我将数组从int更改为bool,问题消失了。
基于ll&#39的值的计算:
ll=1447, total space of array is 1447*1447*4 = 8375236 bytes = 8178.95 Kbytes
ll=1448, total space of array is 1448*1448*4 = 8386816 bytes = 8190.25 Kbytes
可能的原因是这个数组的大小是否大于默认页面大小? (如何在Ubunut 14.04中查看..?)
BTW,尝试使用java并没有问题。
答案 0 :(得分:5)
您正在将数组分配到堆栈中,默认堆栈大小通常为8 MB。
答案 1 :(得分:2)
你在这里做的是在每个周期在堆栈上分配一个[n] [m]的数组。根据堆栈的大小(你可以设置它,但有限制),你最终会耗尽内存。
您要做的是使用new运算符在堆上分配内存,或者使用将为您执行此操作的容器。
由于您使用的是C ++,
使用STL
#include <vector>
#using std
这将创建一个向量向量,每个向量都是维ll。
vector<vector<int>> v(ll, vector<int>(ll, 0));
这会创建一个与二维数组大小相同的一维矢量。我通常会使用这种方法,因为它可以最简单地完成工作。这里的缺点是你必须以v [i * ll + j]的形式处理向量而不是v [i] [j]
vector<int> v(ll*ll, 0)
不使用STL
这会在堆上创建一个数组数组,并且不是连续的。你必须记住在完成数据结构后在循环中调用delete。这被认为是错误的,因为您正在创建一个数组数组,这通常是一个效率较低的数据结构,因为它不连续。
int **v = new int *[ll];
for (int i = 0; i < ll; i++)
v[i] = new int[ll];
这会在堆上创建一个连续的2d数组,有关详细信息,请参阅this
int (*array)[256] = malloc(512 * sizeof *array);
另见 How do I declare a 2d array in C++ using new?
使用新的
创建二维数组要修复此代码,我会执行以下操作:
int main()
{
for(int ll=1444; ll<1450; ++ll)
{
cout<<ll<<endl;
cout<<"###### 0 #######"<<endl;
std::vector<int> v(ll * ll, 0);
cout<<"###### 1 #######"<<endl;
}
return 0;
}
代码没有经过测试,但你明白了