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



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

写了以下程序,但在内联判断代码厨师上,我收到 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;
}

给定示例输入 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],这是越界的,结果是修改你不拥有的内存,即未定义的行为。这是您的程序失败的地方。

如果您的标识符更有意义,您将度过更轻松的时间。 可是:

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 分配的。

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

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

您已声明大小为 n+1 的数组 arr。

   Constraint on n :    n <= 500000 

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

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

这会导致分段错误。

相关内容

  • 没有找到相关文章

最新更新