Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问向量向量元素时的分段错误_C++_Crash_Segmentation Fault_Stdvector - Fatal编程技术网

C++ 访问向量向量元素时的分段错误

C++ 访问向量向量元素时的分段错误,c++,crash,segmentation-fault,stdvector,C++,Crash,Segmentation Fault,Stdvector,问题:我试图初始化一个二维正方形数组,并找出其对角线和的绝对差。为此,我编写了以下代码 #include<vector> #include<iostream> using namespace std; vector<vector<int>> init() // function to initialize the array { int size; cin>>size; vector<vector<int&g

问题:我试图初始化一个二维正方形数组,并找出其对角线和的绝对差。为此,我编写了以下代码

#include<vector>
#include<iostream>

using namespace std;

vector<vector<int>> init() // function to initialize the array
{
  int size;
  cin>>size;
  vector<vector<int>> vector(size);

  for(int i = 0; i < size; ++i)
  {
    vector[i].resize(size);
    for(int j = 0; j < size; ++j)
    {
      cin>>vector[i][j];
    }
  }


  return vector;
}



int diagonal_diff(vector<vector<int>> vector)// function to find difference                                                                                                               
{
  int diff;

  auto sum_1  = 0;
  auto size = vector.size();
  for(auto i  = 0; i < size; ++i)
  {
    auto j = i;
    sum_1 = vector[i][j] + sum_1;

  }

  int sum_2 = 0;
  for(auto i  = size -1; i >= 0; --i)
  {
    auto j = (size-1) - i;
    sum_2 = vector[i][j] + sum_2;

  }

  diff = sum_1 - sum_2;
  diff = (diff >= 0)? diff:diff*(-1);

  return diff;
}

int main()
{
  auto vector = init();//initialising array

  for(auto i  = 0; i < vector.size(); ++i)//printing the array
  {
    for(auto j = 0; j < vector.size(); ++j )
    {
      cout<< vector[i][j];
    }
  }

  auto temp = diagonal_diff(vector);// calling difference function
  cout<<temp<<endl;


  return 0;

}
#包括
#包括
使用名称空间std;
vector init()//用于初始化数组的函数
{
整数大小;
cin>>尺寸;
向量(大小);
对于(int i=0;i>载体[i][j];
}
}
返回向量;
}
int diagonal_diff(vector vector)//求差的函数
{
int-diff;
自动求和_1=0;
自动大小=vector.size();
用于(自动i=0;i=0;--i)
{
自动j=(尺寸-1)-i;
sum_2=向量[i][j]+sum_2;
}
diff=sum_1-sum_2;
差异=(差异>=0)?差异:差异*(-1);
返回差;
}
int main()
{
auto vector=init();//初始化数组
for(auto i=0;icoutinside
diagonal_diff
您有以下循环:

int sum_2 = 0;
for (auto i  = size - 1; i >= 0; --i)
{
    auto j = (size-1) - i;
    sum_2 = vector[i][j] + sum_2;   
}
问题是,
大小
申报如下:

auto size = vector.size();
vector.size()
返回一个
size\t
对象类型,这意味着没有负值

再次查看循环,并查看
i
声明:

auto i  = size - 1
因为
size
size\u t
类型,所以你的
i
也将自动
size\u t
。现在,你的循环的停止条件是:
i>=0
,这意味着当
i
size\u t
时总是
true
。当
i
等于0时,你到达第三个循环的部分:
--i>
,而不是得到
-1
,它得到的是
大小t
的最高值。然后您将尝试执行:
sum_2=vector[i][j]+sum_2;
,并获得一个异常

要解决此问题,只需将
i
声明更改为:
inti=size-1


注意:强烈建议不要使用
vector
作为名称,尤其是当您在代码中使用
usingnamespace std;
时。
vector
是一个类名,它可能会导致代码冲突。您可以使用
vec
作为名称。

在一个不相关的注释中,同时使用
vector
类和d
vector
变量令人困惑。请阅读并尽量避免使用标准类名作为变量。对于您的问题,我建议您。通过使用常见的调试技术,应该不难找到超出范围的地方(这是最可能的原因)。将一个无符号变量与>=0进行比较,同时将其递减,这是行不通的。@Swardfish感谢dude,很抱歉浪费了大家的时间,我不会再问这样愚蠢的问题了。当您在代码(或任何人的代码)中查找类似签名的问题时,可以安全地从假设您在某个地方有越界访问开始。将对操作符
[]
的所有调用替换为对
at
方法的调用。
at
进行边界检查,如果您的程序误入了杂草中,将通过抛出异常来通知您。