问题描述
我刚刚开始使用C ++进行编码,并且正在使用代码块。我的构建日志给了我0错误和0警告,但是我不知道为什么当我运行它时,在终端上没有任何结果。 终端窗口结果:
返回的过程-1073741571(0xC00000FD)执行时间:1.252 s 按任意键继续。
我的代码:
#include <iostream>
#include<math.h>
using namespace std;
int main() {
int n;
cin>>n;
int a[n];
for(int i = 0; i <n ; i++){
cin>>a[i];
}
const int N = pow(10,6);
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[a[i]] != -1){
minidx = min(minidx,idx[a[i]]);
}
else{
idx[a[i]] = i;
}
}
if (minidx == INT_MAX){
cout<<"-1"<<endl;
}
else{
cout<<minidx+1<<endl;
}
return 0;
}
请帮助我找到代码中的错误。
解决方法
此:
int n;
std::cin >> n;
int a [n];
for (int i = 0; i < n ; i++) {
std::cin >> a [i];
}
是不好的做法。不要使用在编译时不知道其大小的VLA。相反,如果我正确地猜到这是一个竞争编程问题,您可能会知道问题中所述的最大大小。因此,请改用这种方式:
int n;
std::cin >> n;
constexpr int max_size = 1000000;
int a [max_size];
for (int i = 0; i < n; i++) {
std::cin >> a [i];
}
但是,即使以这种方式执行操作也会使您的程序崩溃。这完全是由于在函数中声明一个具有该大小的数组时堆栈溢出。但是,对于较小的尺寸,这是可以的。只是不要像使用VLA那样使用VLA。
一种解决方案是使用std::vector
之类的标准容器,因为分配是在堆上进行的。请注意,使用std::array
也会崩溃,因为分配不在堆上。
另一种解决方案是使数组a
为全局数组。这样,您可以将大小增加到1e6
以上。不过,不建议这样做。
在上面的代码中,无论数组n
的大小a
是多少(即使它适合堆栈的大小都很小),当声明数组idx [1000000]
。原因是相同的,堆栈溢出。
另外,请发布缩进代码并使用良好的缩进做法。