在访问向量矢量的元素时的分段错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在访问向量矢量的元素时的分段错误相关的知识,希望对你有一定的参考价值。
问题:我正在尝试初始化一个正方形2d数组并找到其对角线总和的绝对差值。我为此目的编写了以下代码。
#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;
}
但它在打印数组后给出了分段错误。无法弄清楚原因是什么。
我试图从hackerRank解决这个problem。如果我注释掉调用了diagonal_diff()函数的行,那么代码运行正常。所以我认为错误在于diagonal_diff()函数。
答案
在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;
}
问题是qazxsw poi声明看起来像这样:
size
auto size = vector.size();
返回一个vector.size()
对象类型,这意味着没有负值。
再看看你的循环,看看size_t
声明:
i
因为auto i = size - 1
是size
类型,你的size_t
也将自动i
。现在,你的循环停止条件是:size_t
,这意味着在i >= 0
是true
的情况下总是i
。当size_t
等于0,并且你到达第三个循环的部分:i
,而不是获得--i
,它获得-1
的最高值。然后你要做:size_t
并获得例外。
要解决这个问题,您所要做的就是将sum_2 = vector[i][j] + sum_2;
声明更改为:i
。
注意:强烈建议不要使用int i = size - 1
作为名称,尤其是在代码中使用vector
时。 using namespace std;
是一个类名,它可能导致代码冲突..你可以使用vector
作为名称。
以上是关于在访问向量矢量的元素时的分段错误的主要内容,如果未能解决你的问题,请参考以下文章