给定程序中的分段错误

Segmentation Fault in the given Program

我经常遇到段错误,尽管我知道它是由于访问受限内存而发生的,但我似乎不知道如何纠正它。 我通常在调用另一个函数时遇到它。

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

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

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

vector<int> a(n); 给你 n 个元素。对 b 进行类似的更改,一切都会好起来的。

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

您不能使用向量索引或 [] 除非您已经通过声明大小或 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;
}