You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++查找数组首现最早重复元素时N设为1e6+2无输出问题求解

问题根因
  • 栈内存溢出:你定义的int idx[N]是main函数内的局部变量,局部变量默认分配在程序栈空间,主流操作系统的栈空间默认上限仅为1MB~8MB。当N设为1e6+2时,该int数组占用内存约4MB,若运行环境栈上限低于该值就会触发栈溢出,程序直接崩溃退出,因此没有任何输出。N为1002时数组仅占约4KB内存,远低于栈上限,所以可以正常运行。
  • 可变长度数组(VLA)不符合C++标准:C标准本身不支持用变量作为数组长度定义数组,该写法是C语言特性,仅属于部分C编译器的扩展支持,运行时内存分配逻辑不稳定。
修复方案

你可以选择任意一种方案解决问题:

  1. 将idx数组移到main函数外定义为全局变量,全局变量默认分配在堆内存,没有栈大小限制,同时将数组长度改为常量,符合C++标准要求。
  2. 使用STL容器vector<int> idx(N, -1)替代原生数组,vector底层自动在堆上分配内存,不需要手动管理空间。
  3. 如果数组元素的取值范围不固定、可能超过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 15:27:03