[英]Getting Segmentation Fault error in C++ code
#include<bits/stdc++.h>
using namespace std;
//FIRST REPEATING ELEMENT (APPROACH 2)
int main()
{
cout<<"running";
int n;
cin>>n;
int arr[n];
for(int i=1; i<=n; i++)
cin>>arr[i];
const int N = 1e5+2;
int idx[N];
for(int i=0;i<N;i++)
idx[i] = -1;
int minidx = INT_MAX;
for(int i=0;i<n;i++)
{
if(idx[arr[i]] != -1)
minidx = min(minidx, idx[arr[i]]);
else
idx[arr[i]] = i;
}
if(minidx == INT_MAX)
cout<<"-1"<<endl;
else
cout<<minidx + 1<<endl;
return 0;
}
我正在为“第一个重复元素”问题编写此代码,并尝试获取第一个重复元素的索引。 在调试时,我遇到了分段错误。 int main() { (在这一行)
这是什么意思,我该怎么做才能删除它。
const int N = 1e5+2;
int idx[N];
这听起来像是要在堆栈上分配的大数组(400kb!)。 尝试使用 malloc() 分配该大小的数组。 将其更改为类似
const int N = 1e5+2;
int* idx = (int*)malloc(N * sizeof(int));
您也应该对arr
执行相同的操作,尤其是当您使用较大的 n 值时。
该程序具有未定义的行为,因为您超出了数组的范围。 这是因为在您的for
循环条件中,您使用的是i<=n
而不是i<n
。
未定义的行为意味着任何事情1都可能发生,包括但不限于给出预期输出的程序。 但永远不要依赖(或基于)具有未定义行为的程序的输出。 该程序可能会崩溃。
所以你看到的输出(也许看到)是未定义行为的结果。 正如我所说,不要依赖具有 UB 的程序的输出。 该程序可能会崩溃。
因此,使程序正确的第一步是删除 UB。 只有这样,您才能开始推理程序的输出。
此外,在标准 C++ 中,数组的大小必须是编译时间常数。 这意味着您的程序中的以下内容不正确。
int n;
cin >> n;
int arr[n]; //not standard C++ since n is not a constant expression
1有关未定义行为的更技术上准确的定义,请参见此处提到:对程序的行为没有限制。
分段错误是由于使用了您不拥有的内存,或者换句话说是堆栈溢出。 很可能是因为您正在创建一个大小为 1e5+2 的数组并对其进行循环,初始化每个元素。 这不是找到元素重复的最佳方法。 而是使用带有键值对的映射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.