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

Visual Studio环境下使用大尺寸静态数组生成无重复随机数运行时错误如何解决

问题根因

你遇到的不是内存溢出,是算法时间复杂度过高导致程序长时间无响应:

  • 两层循环暴力查重的时间复杂度为O(n²),当数组长度为500000时,总计算量超过2500亿次,普通消费级CPU无法在短时间内跑完,因此表现为控制台光标持续闪烁无输出。数组长度降到5000时总计算量仅2500万次,可以快速执行完成,因此运行正常。
  • 补充验证:你声明的是全局静态数组,500000个int仅占约2MB内存,完全不会触发内存溢出问题。

修复方案

推荐使用Fisher-Yates洗牌算法生成无重复随机序列,时间复杂度为O(n),50万条数据可以在毫秒级完成生成。

修复后代码

#define SIZE 500000
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int sort[SIZE];
int main()
{
    FILE* input = fopen("input.txt", "w");
    // 原代码判断逻辑错误:全局数组sort永远不为NULL,应该判断文件是否打开成功
    if (input == NULL) {
        perror("文件打开失败");
        return 1;
    }

    srand((unsigned)time(NULL));
    // 第一步:初始化1~SIZE的有序数组
    for (int i = 0; i < SIZE; i++) {
        sort[i] = i + 1;
    }
    // 第二步:Fisher-Yates随机洗牌
    for (int i = SIZE - 1; i > 0; i--) {
        int j = rand() % (i + 1);
        // 交换下标i和j的元素
        int temp = sort[i];
        sort[i] = sort[j];
        sort[j] = temp;
    }

    // 写入文件
    for (int i = 0; i < SIZE; i++) {
        fprintf(input, "%d ", sort[i]);
    }
    fclose(input);
    return 0;
}

原有代码的额外问题说明

  • 原代码的判断条件if (sort != NULL)完全无效,全局数组的内存地址在编译期就已确定,永远不可能为NULL,应该改为判断文件指针是否为NULL,避免文件打开失败时触发空指针访问崩溃。

内容的提问来源于stack exchange,提问作者chaeyeon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 17:24:03