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