在访问向量矢量的元素时的分段错误

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 >= 0true的情况下总是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作为名称。

以上是关于在访问向量矢量的元素时的分段错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 程序结束时的 thread_local 向量分段错误

对向量使用 Push Back 功能时的分段错误

分段错误:从二维向量中随机删除元素

使用以向量为输入的递归方法时的分段错误

在 C++ 中使用向量时出现分段错误?

离开循环时的矢量数据丢失