运行时错误(SIGSEGV)

时间:2009-09-26 14:59:34

标签: c++ segmentation-fault

#include<iostream>
#include<string>
using namespace std;
int main()
{
   char arr[1000][80];
   char output[1000][80];
   int n,i,j;
   int num[1000];
   cin>>n;
   for(i=0;i<n;i++)
   {
    cin>>num[i];
      cin>>arr[i];
   }
   for(i=0;i<n;i++)
   {
      for(j=(num[i]-1);j<(strlen(arr[i])-1);j++)
      {
        arr[i][j]=arr[i][j+1];
      }
      arr[i][j]='\0';
      cout<<"\n"<<(i+1)<<" "<<arr[i];
   }
  return 0;
}

这是在Spoj上传时出现上述错误的代码。相同的代码在Borland C ++上运行良好。

3 个答案:

答案 0 :(得分:2)

根据您传入此计划的输入,变量n可能超过1000,cin>>arr[i]可能会读取超过80个字符,如果num[i] <= 0 || num[i] >= 80则您将过去索引你的一个字符串的开头或结尾。存在所有这些问题是因为此代码使用固定大小的数组,并且不执行任何边界检查。

答案 1 :(得分:0)

乍一看,我没有什么本质上的错误。但是,在提供代码无法处理的输入时,肯定非常有可能出现段错误。

例如,没有什么可以防止在输入arr之外写作。

是否有针对此失败的特定输入?

答案 2 :(得分:0)

变量n的值可以大于数组边界。这就是为什么你的代码可以给出数组索引超出范围的异常,以及为什么它会给出运行时错误(SIGSEGV)。