【问题标题】:Segmentation Fault in the given Program给定程序中的分段错误
【发布时间】:2015-06-11 12:53:31
【问题描述】:

我经常遇到分段错误,即使我知道它是因为访问受限内存而发生的,但我似乎不知道如何纠正它。 当我调用另一个函数时,我通常会遇到它。

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

【问题讨论】:

  • main 函数中,使用两个具有相同名称、类型和使用方式的变量,但范围不同,这将是一个很大的混淆源。

标签: c++ segmentation-fault


【解决方案1】:

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

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

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

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

【讨论】:

  • 您也可以将您的数字推回向量中
  • @Elried 如果事先不知道大小,使用push_back(或emplace_back)会很好。否则,分配正确大小的向量然后使用普通数组索引会更有效。
  • @JoachimPileborg 我同意这一点。在这个特定的设置中,使用[]at 更好。我只是想指出存在替代方案。
【解决方案2】:

除非您已经通过声明大小或通过vec.push_back() 方法初始化了该索引,否则您不能使用vector 或[] 的索引!

参考这两段代码说明

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多