2D矢量给出分段故障

时间:2013-10-21 12:08:08

标签: c++ vector segmentation-fault

我正在尝试使用矢量创建一个2D数组。我写了以下代码:

int main() {
    vector< vector<int> > v;

    int i, j;
    for(i=0; i<11; i++)
        for(j=0; j<11; j++)
            v[i].push_back(j);
    for(i=0; i<11; i++) {
        for(j=0; j<11; j++)
            cout<<v[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

现在我期待它打印数字0到10,十一次(每次都在新行中)。但是代码给出了运行时错误(分段错误)。谁能告诉我哪里出错了?

感谢。

5 个答案:

答案 0 :(得分:7)

当你声明任何东西的矢量时,它还没有任何元素。

因此:

v[i].push_back(j)

试图将j插入到位置i的向量v内的不存在的向量中。

在这种情况下,如果您知道大小,则应使用构造函数中所需的元素数初始化向量:

vector<vector<int> > v(11);

初始化向量v,里面有11个空向量。

答案 1 :(得分:1)

当您尝试访问不可用的内存时,会发生分段错误。通常在使用向量时,这意味着您正在访问向量之外的元素(太高或太低)。

当您使用vector时,请始终使用size()中的for loops函数,因为它可以防止它超越。您很可能通过转0...10来访问向量大小之外的元素(它将返回11个元素,并且无论如何它都未被初始化)。

答案 2 :(得分:1)

你没有推测第一级媒介。

for(i=0; i<11; i++)
    vector<int> subVector;
    v.push_back(subVector);
    for(j=0; j<11; j++)
        v[i].push_back(j);

答案 3 :(得分:0)

v[i]尚不存在,您的向量向量为空。

将其更改为vector< vector<int> > v(11);,以获得一个包含11个向量的初始向量。

答案 4 :(得分:0)

创建新矢量时,默认情况下它没有元素。您必须使用push_back()插入元素。对于您而言,您没有在向量中之前输入任何元素,而是尝试在该向量的第i个位置插入元素,而该位置仍然不存在。

所以您需要明确定义向量的大小,即

vector<vector<int> > v(10);

现在,向量知道有10个元素。

希望,它会有所帮助。 祝您编码愉快!