访问向量向量元素时的分割错误

时间:2018-09-03 15:46:21

标签: 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>> 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。如果我注释掉调用对角线diff()函数的行,则代码可以正常运行。因此,我认为错误在于对角线diff()函数。

1 个答案:

答案 0 :(得分:0)

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;   
}

问题在于size的声明看起来像这样:

auto size = vector.size();

vector.size()返回一个size_t对象类型,这意味着没有负值。

再次查看循环,然后查看i声明:

auto i  = size - 1

由于sizesize_t类型,因此您的i也将自动size_t。现在,循环的停止条件为:i >= 0,这意味着在truei的情况下始终为size_t。当i等于0,并且您到达第三循环的部分:--i时,它得到的最大值是-1,而不是得到size_t。然后,您正打算去做:sum_2 = vector[i][j] + sum_2;并得到一个例外。

要解决此问题,您要做的就是将i声明更改为:int i = size - 1

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