无法找出为什么我会出现分段错误

Sin*_*ngh 0 c++

我是 cpp 的新手,我正在尝试解决一个练习,但我遇到了分段错误。

代码的第一部分包括初始化向量的向量。(任务 1)

然后是task2。我尝试在 while cicle 之前打印 Task 2 但它从不打印。所以我猜错误出在代码的第一部分!您可以在下面找到可以编译的代码。

您可以使用的可能输入:

0 0 0 0 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

您可以在下面找到可以编译的代码。

#include <iostream>
#include <vector> 
using namespace std;
int main (){

    const int matrix_size = 5;
    int i =0,j=0,taskdone=0;
    vector<vector<int>> mat(matrix_size, vector<int>(matrix_size));

    for(i = 0;i < matrix_size; i++)
    {
        for(j = 0; j < matrix_size; j++)
        {
            cout <<"Value mat"<<mat[i][j] << "j is "<<j<< "\n";
            cin >> mat[i][j];

        }
        cout << endl;
         cout << "Done "<<i<<"|\n";
    }
  i =0;j=0;
  cout << "task 2 ";
  while(!mat[3][3]==1){
      cout << "task 2 ";
      if(mat[i][j]==1){
          if(i<3){
              mat[i+1][j]=1;
              mat[i][j]=0;
              taskdone++;
              i++;
              cout<< "task 1 "<<taskdone;
          }else if (i>3){
              mat[i-1][j]=1;
              mat[i][j]=0;
              taskdone++;
              i--;
              cout<< "task 2 "<<taskdone;
          }
          if(j<3){
              mat[i][j+1]=1;
              mat[i][j]=0;
              taskdone++;
              j++;
              cout<< "task 3 "<<taskdone;
          }else if (j>3){
              mat[i][j-1]=1;
              mat[i][j]=0;
              taskdone++;
              j--;
              cout<< "task 4 "<<taskdone;
          }

      }else{
          i++;
          j++;
          cout<<"i : "<<i << "j "<<j;
      }

  }
  cout<<taskdone;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

los*_*ard 6

您需要学习使用调试器,因为它会很快告诉您它的段错误位置。

Program received signal SIGSEGV, Segmentation fault.
main () at x.cpp:25
25        if(mat[i][j]==1){

(gdb) p i
$1 = 5
(gdb) p j
$2 = 5
Run Code Online (Sandbox Code Playgroud)

您正试图访问 mat 的边界之外。

mat[i][j]==1 对于 0 输入不正确,因此它会转到 else

else{
      i++;
      j++;
      cout<<"i : "<<i << "j "<<j;
  }
Run Code Online (Sandbox Code Playgroud)

这很快将其置于垫子的范围之外。它不打印任务 2、I、j 等,因为它被行缓冲 - 如果你在打印输出中有一个 \n 它会显示它们。