为什么我遇到分段错误



我正在尝试在 2D 矩阵中打印同心矩形图案。

但是,它向我显示了分段错误。我尝试将所有代码作为注释。

我认为声明本身有错误。这是什么?

int l = 2*A - 1; 
vector<vector<int> > ar(l);
for(int i = 0; i<(2*A - 1); i++)
{
for (int j = 0; j<(2*A - 1); j++)
{
int h= max(abs(A - i + 1),abs(A - j + 1));
ar[i][j] = h+1;
}
}
return ar;
我认为

声明本身有错误。这是什么?

你是对的。您有一个二维向量,并且您仅通过声明以下内容来处理单个层:

vector<vector<int> > ar(l);

简单的解决方法是:

std::vector< std::vector<int> > ar(l, std::vector<int>(l));

现在,这将确保初始化充满0S 的二维向量数组,大小为2*A - 1

现在看: https://www.ideone.com/1wYCba


简短说明:但是,如果您真的在研究同心矩形图案,那么您的代码/逻辑是错误的。上面的代码不会打印您想要的内容,即使现在它符合。

问题是,当你创建了一个包含2*A - 1个元素的向量时,这些元素中的每一个都是一个空向量。因此,当您尝试访问元素的元素(两个下标(时,您会访问不存在的内容。

一种解决方案是将这些空向量更改为具有假定元素数的向量。在开始内部循环之前,请添加:

ar[i].resize(2*A - 1);

(如果A是固定的,您可能会发现std::array比向量更方便。

相关内容

  • 没有找到相关文章

最新更新