2D 向量给出分割错误

2D vector giving segmentation fault

本文关键字:分割 错误 向量 2D      更新时间:2023-10-16

我正在尝试使用矢量创建一个 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,十一次(每次在新行中)。但是代码给出了运行时错误(分段错误)。谁能告诉我哪里出错了?

谢谢。

当你声明任何事物的向量时,它还没有任何元素。

因此:

v[i].push_back(j)

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

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

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

这将向量 v 初始化其中有 11 个空向量。

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

使用vector时,请始终使用for loopssize()的功能,因为它可以防止其溢出。您很可能通过0...10访问向量大小之外的元素(这将返回 11 个元素,无论如何它在那里都是未初始化的)。

您没有初始化第一级向量。

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

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

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

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

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

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

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

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