给定程序中的分段错误

时间:2015-06-11 12:53:31

标签: c++ segmentation-fault

我经常遇到分段故障,即使我知道它是因为访问受限制的内存而发生的,我似乎也不知道如何纠正它。 当我打电话给另一个功能时,我经常遇到它。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
long int xyz(int n)
{
  vector<int> a;
  vector<int> b;


  for(int i=0;i<n;i++)
  {
      cin>>a[i];
  }
  for(int i=0;i<n;i++)
  {
     cin>>b[i];
  }
long int sum=0;

  for(int i=0;i<n;i++)
  {
   for(int j=i+1;j<n;j++)
    {
       sum=sum+((a[j]-a[i])*max(b[i],b[j]));
    }
  }


 return sum;

}


int main() 
{
  int n;
  long int final;
  cin>>n;
  for(int i=0;i<n;i++)
  {   int n;
      cin>>n;
      final=xyz(n);
      cout<<final<<endl;

   }

   return 0;
}

2 个答案:

答案 0 :(得分:5)

在这种特殊情况下,您没有 您的两个向量ab

默认情况下,它们的大小为零。

vector<int> a(n);为您提供了n个元素。对b进行类似的更改,一切都应该很好。

使用[]访问其范围之外的向量元素的行为未定义。

答案 1 :(得分:0)

您无法使用向量索引或[],除非您已通过声明大小或vec.push_back()方法初始化该索引!

请参阅这两段代码以获得澄清

此代码不会运行(分段错误):

int main()
{
 vector<int> a; //not initialized so cant be indexed directly
 cin>>a[0];
 cout<<a[0];
 return 0;
}

这部分没有问题:

int main()
{
 vector<int> a(5); //size initialized upto 5, so if indexed at a point greater than 4 it will be error
 cin>>a[0];
 cout<<a[0];
 return 0;
}

注意:如果您使用vec.at()运算符,则可以看到正在打印的新类型错误,该错误可能意味着相同!

试试这个错误的代码:

int main()
{
 vector<int> a;
 cin>>a.at(0);
 cout<<a.at(0);
 return 0;
}