SIGSEGV 错误详细信息和删除步骤
SIGSEGV error details and removal steps
对于问题: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 .
这会导致分段错误。
相关文章:
- 析构函数删除错误的元素
- LinkedList removePosition 删除错误的元素
- 如何在为类创建 .h 和 .cpp 文件后删除错误?C++
- 使用C++类时出现巨大的删除错误
- C++解释此删除[]错误
- shared_ptr C++出现双重删除错误
- 如何删除错误:"." 标记之前的预期主表达式
- DoublyLinkedList删除错误
- 我使用构造函数(使用内存 Dinamic char *t = 新字符 [10] t = "test123456" ;))时遇到错误堆错误并在析构函数中删除 [] t;错误
- 分配字符串时出现 char* 新建和删除 [] 错误
- C++模板代码导致在显然未正确分配的对象上调用删除错误
- C++删除错误
- c++ STL删除错误
- 从二叉树中删除错误
- 矢量擦除函数删除错误的对象
- 二进制结构删除错误
- 如何从FLANNBASED匹配器在OPENCV中删除错误的匹配
- map删除错误的元素
- 使用 std::删除删除错误的字符
- c++ pair删除错误