是什么导致我的代码出现SIGSEGV错误?

时间:2020-04-21 12:29:45

标签: c++ c++14

我既不使用指针也不使用释放的内存,但是我不明白是什么导致sigsegv错误。 对于某些测试用例,该算法可以正常工作,而对于其他测试用例,则显示SIGSEGV。

#include<iostream>
using namespace std;

int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  int n,m;
  cin>>n>>m;
  int arr[n],arrh[m];

  for(int i=0;i<n;i++)
  {
    cin>>arr[i];
  }
  for(int i=0;i<m;i++)
  {
    cin>>arrh[i];
  }

  int arrcc[m][n]={0};                    //Precomputation Cumulative
  int val;
  for(int j=0;j<m;j++)
  { 
    val=0;
    for(int i=0;i<n;i++)
    {
      if(arr[i]==(j+1))
      {
        val++;
      }
      arrcc[j][i]=val;
    }
  }

  int q,l,r;
  cin>>q;
  int k;
  int arrc[m];
  while(q--)
  { 
    k=0;
    for(int i=0;i<m;i++)              
    {
      arrc[i]=0;
    }

    cin>>l>>r;

    // for(int j=0;j<m;j++)                      //Time limit exceed need precomputation  
    // {
    //  for(int i=(l-1);i<r;i++)
    //  { 
    //    if(arr[i]==(j+1))
    //    { 
    //      arrc[j]++;
    //    }
    //  }
    // }

    for(int j=0;j<m;j++)              //Calculating from cumulative
    {
      if(l!=1)
        arrc[j]=(arrcc[j][r-1]-arrcc[j][l-2]);
      else
        arrc[j]=(arrcc[j][r-1]-0);
    }

    for(int i=0;i<m;i++)
    {
      if(arrc[i]!=0)
      {
        if(arrc[i]!=arrh[i])
        {
          cout<<"0"<<"\n";
          k++;
          break;
        }
      }
    }
    if(k==0)
    {
      cout<<"1"<<"\n";
    }
  }
}

链接到问题-
https://drive.google.com/open?id=1sYEbtdFTT9ZE67y4Wygvv_AKJWGWgXiI https://www.hackerearth.com/challenges/competitive/april-circuits-20/algorithm/happy-segments-e290faa6/

1 个答案:

答案 0 :(得分:4)

cin>>n>>m;
int arr[n],arrh[m];

首先,该程序是C ++格式不正确的。自动数组的大小必须是编译时间常数,而n和m不是。

第二,如果您有意使用扩展的C ++语言:通常严格限制自动存储中对象的存储。默认情况下,执行堆栈的大小约为1-8兆字节。对于较大的n或m,这些数组可能会使堆栈溢出,如果幸运的话,将导致程序崩溃。

如果需要运行时大小的数组,请使用动态存储。最简单的解决方案是使用std::vector。这样就消除了数组溢出堆栈的机会,并使程序在数组大小方面结构良好的C ++。