C++查找数组首现最早重复元素时N设为1e6+2无输出问题求解
问题根因
- 栈内存溢出:你定义的
int idx[N]是main函数内的局部变量,局部变量默认分配在程序栈空间,主流操作系统的栈空间默认上限仅为1MB~8MB。当N设为1e6+2时,该int数组占用内存约4MB,若运行环境栈上限低于该值就会触发栈溢出,程序直接崩溃退出,因此没有任何输出。N为1002时数组仅占约4KB内存,远低于栈上限,所以可以正常运行。 - 可变长度数组(VLA)不符合C++标准:C标准本身不支持用变量作为数组长度定义数组,该写法是C语言特性,仅属于部分C编译器的扩展支持,运行时内存分配逻辑不稳定。
修复方案
你可以选择任意一种方案解决问题:
- 将
idx数组移到main函数外定义为全局变量,全局变量默认分配在堆内存,没有栈大小限制,同时将数组长度改为常量,符合C++标准要求。 - 使用STL容器
vector<int> idx(N, -1)替代原生数组,vector底层自动在堆上分配内存,不需要手动管理空间。 - 如果数组元素的取值范围不固定、可能超过1e6,建议用
unordered_map<int, int>存储元素和首次下标的映射,不需要提前固定容量。
修复后示例代码
#include "bits/stdc++.h" using namespace std; const int MAX_VAL = 1e6 + 2; int idx[MAX_VAL]; // 全局数组,分配在堆内存 int main() { int n; cin >> n; vector<int> a(n); // 用vector替代可变长度数组 for(int i = 0; i < n; i++) { cin >> a[i]; } memset(idx, -1, sizeof(idx)); 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; } } cout << (minidx == INT_MAX ? -1 : minidx + 1) << endl; return 0; }
内容的提问来源于stack exchange,提问作者user15873758
相关产品推荐
相关产品推荐

