SIGSEGV错误详细信息和删除步骤

时间:2014-02-26 13:53:39

标签: c++ arrays sigsegv

问题:http://www.codechef.com/FEB14/problems/TWODOGS

我写了以下程序,但在内联判断codechef我得到sigsegv错误。我想知道哪个指令在我的程序中创建了这个错误,以便我尝试删除它。 这是代码:

#include<iostream>
using namespace std;
int main()
{
    int n,k;
    cin>>n>>k;
    int a[n];
    for(int i=0;i<n;i++)
        cin>>a[i];
    int arr[n+1];
    for(int i=1;i<n+1;i++)
        arr[i]=n+1;
    for(int i=0;i<n;i++)
    {
        int p=min(i+1,n-i);
        arr[a[i]]=min(arr[a[i]],p);
    }
    int time=n+1;
    for(int i=0;i<n;i++)
    {
        int p=a[i];
        if(p!=k-p&&p<k)
            time=min(time,max(arr[p],arr[k-p]));
    }
    if(time==n+1)
        cout<<"-1";
    else
        cout<<time;
}

3 个答案:

答案 0 :(得分:4)

给出样本输入2:

Sample Input 2:
5 5
2 4 9 2 5

你不能这样做

arr[a[i]]=min(arr[a[i]],p);

因为当i == 2时,arr[a[i]]将被评估为arr[9],这是不受约束的,并且结果修改了您不拥有的内存,即未定义的行为。这是你的程序失败的地方。

答案 1 :(得分:0)

如果您的标识符更有意义,那么您将会更轻松。那说:

cin>>a[i];
....
arr[a[i]]=min(arr[a[i]],p);

您正在通过用户输入索引arr []。如果您遇到段错误,最好在假设无效的情况下为这些情况设置断言,例如:

assert(a[i] < n-1);

下一步:

time=min(time,max(arr[p],arr[k-p]));

再次,根据用户输入索引数组。添加另一个断言来测试arr [p]和arr [k-p]是否有效。

最后,对于这一行:

if(p!=k-p&&p<k)

你的意思是:

if(p!=k-p&&p<n)

a基于n而不是k来分配。

答案 2 :(得分:0)

如果你仔细阅读了这个问题,

   the element in a[i] <= 10 ^ 6 .

您声明了一个大小为n + 1的数组arr。

   Constraint on n :    n <= 500000 

此外,您正在尝试访问可能超出数组arr限制的arr [a [i]]。

     a[i] may be greater than  5 * 10^5 .

这导致分段错误错误。

相关问题