运行时错误(SIGSEGV)
问题描述:
#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++上运行良好。运行时错误(SIGSEGV)
答
根据您传递给该程序的输入,变量n
可能超过1000,cin>>arr[i]
可以阅读超过80个字符,如果num[i] <= 0 || num[i] >= 80
那么你将指数过去四弦的一个的开始或结束。所有这些问题都存在,因为此代码使用固定大小的数组,并且不执行任何边界检查。
答
变量n
的值可能大于数组边界。这就是为什么你的代码可以给出一个超出范围的数组索引异常,因此它为什么会给出运行时错误(SIGSEGV
)。
什么是“scoj”? – bk1e 2009-09-26 16:00:10
我认为这可能是一个拼写错误(http://www.spoj.pl/),在这种情况下发布挑战号码可能会很有用。仔细重读指令,例如他们说输入字符串的长度最多为80个字符。作为一个提示:我认为你可以在输入后处理和输出,不需要大数组。 – UncleBens 2009-09-26 16:29:20
我认为对于代表性的代码片断来说,使用断言不会超出数组范围是非常好的! – Narek 2009-09-26 19:05:24