【问题标题】:Segmentation fault while returning a 2d vector in C++在 C++ 中返回二维向量时出现分段错误
【发布时间】:2018-02-18 04:58:57
【问题描述】:
vector<vector<int> > Solution::prettyPrint(int A) 
   {
       vector<vector<int>>res(2*A-1, std::vector<int>(2*A-1));
       int flag=A;

       int i, k=0,l=0;
       int m=2*A-1, n=2*A-1;
       while(k<=m && l<=n)
          {
               for(i=l; i<2*A-1; i++)
                   res[k][i]=flag;//1st row
               k++;

               for(i=k; i<2*A-1; i++)
                   res[i][n]=flag;//last column
               n--;

               for(i=n; i>l; i--)
                   res[m][i]=flag;//last row
               m--;

               for(i=m; i>k; i--)
                  res[i][l]=flag;//1st column
               l++;

               flag--;


           }
            return res;
        }

为什么它会给出分段错误错误,因为我已经为完整的 2d 矩阵分配了内存,该矩阵将是 [2A-1][2A-1]。

如果 A=3 输出必须像 3 3 3 3 3 \n 3 2 2 2 3 \n 3 2 1 2 3 \n 3 2 2 2 3 \n 3 3 3 3 3 \n

【问题讨论】:

  • 有效索引从 0 到 (2*A-1)-1。因此,当您访问 n 时 - 它超出了访问范围
  • 虽然发布了实际答案,但为了将来,请确保您学习了一些调试技术。就像使用调试器一样。并评论事情。在这里,我们有四个 for 循环,并且有人怀疑 bug 存在于其中一个中。找出它是哪一个本来是你的工作。

标签: c++ vector segmentation-fault spiral 2d-vector


【解决方案1】:

您超出了范围,因为索引从 0 开始到 2*A-1。由于int m=2*A-1, n=2*A-1; 你需要改变这个:

while(k<=m && l<=n)

到这里:

while(k < m && l < n)

【讨论】:

    【解决方案2】:

    这是你的错误:

    while(k<=m && l<=n)
    

    你应该使用:

    while(k<m && l<n)
    

    因为向量索引从 0 开始,而不是从 1 开始。

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 2022-01-07
      • 1970-01-01
      • 2022-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多