【问题标题】:Why am I getting segmentation fault为什么我得到分段错误
【发布时间】:2026-02-13 12:00:01
【问题描述】:

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

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

我认为声明本身有问题。这是什么?

   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;

【问题讨论】:

  • 您正在使用向量的向量,但只分配外部的。查看here 以获取正确分配。
  • 试试ar[i][j] = h+1;,而不是ar.at(i).at(j) = h+1;at 成员函数执行边界检查。然后,将其包装在 try 块中并捕获异常。
  • 您已声明ar 的大小无法容纳任何ints。这是一个lx0 矩阵。
  • vector&lt;int&gt;s 中的vector&lt;vector&lt;int&gt; &gt; 被初始化为大小为零。因此,在内循环中所有at[i][j] 的使用都具有未定义的行为,因为operator[]() 不会调整向量的大小。

标签: c++ multidimensional-array segmentation-fault stdvector


【解决方案1】:

我认为声明本身有问题。它是什么?

你是对的。你有一个二维向量,你只需要通过声明来处理单层:

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


简短说明:但是,如果您真的在处理concentric rectangular pattern,那么您的代码/逻辑是错误的。上面的代码不会打印你想要的,即使现在它符合了。

【讨论】:

  • 非常感谢。我也犯了逻辑错误。
【解决方案2】:

问题在于,当您使用2*A - 1 元素创建一个向量时,这些元素中的每一个都是一个空向量。因此,当您尝试访问元素的元素(两个下标)时,您访问的是不存在的东西。

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

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

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

【讨论】:

    最近更新 更多