我的2D阵列太大了吗?

时间:2015-09-01 04:52:01

标签: c++ arrays

我在下面运行代码并得到一些奇怪的输出:

#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并没有问题。

2 个答案:

答案 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;
}

代码没有经过测试,但你明白了