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

C++实现的计数排序运行报0xC0000005错误是什么原因?

错误原因及修复方案

错误码0xC0000005在Windows平台下代表内存访问越界,你的问题出在计数排序的最终回填阶段代码逻辑错误:

  • 第一处错误(直接触发崩溃的原因):第三层循环中你错误使用了input[i]作为数组下标。循环变量i的取值范围是0~max,你的测试用例中max为9,但input数组的长度仅为8,合法下标只有0~7,当i≥8时访问input[i]属于越界访问,直接触发段错误。
  • 第二处错误(排序逻辑错误):计数排序回填阶段要放入输出数组的是当前计数对应的数值i,不是counter[input[i]],你这里的取值完全不符合计数排序的逻辑,就算不崩溃也拿不到正确排序结果。
  • 第三处问题(功能无效):你排序后的结果存在output局部变量里,没有赋值回输入的input引用,函数执行完原数组不会有任何变化,等于排序逻辑没有生效。

修复后的完整代码

#include <bits/stdc++.h>
using namespace std;

void countSort(vector<int>& input)
{
    // 增加空数组判断避免未定义行为
    if (input.empty()) return;
    int max = *max_element(input.begin(), input.end());
    // 计数器初始化可以直接写在构造函数中,不需要单独循环赋值
    vector<int> counter(max + 1, 0);
    vector<int> output;
    // 提前分配输出空间优化性能
    output.reserve(input.size());

    for(int num : input)
    {
        counter[num]++;
    }

    for(int i = 0; i < max + 1; ++i)
    {
        while(counter[i] > 0)
        {
            // 回填当前计数对应的数值i
            output.push_back(i);
            counter[i]--;
        }
    }
    // 把排序结果赋值回原数组
    input.swap(output);
}

int main()
{
    vector<int> array = {9, 8, 9, 1, 5, 7, 1, 2};
    countSort(array);
    // 可放开下方注释验证排序结果
    // for(int num : array) {
    //     cout << num << " ";
    // }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:00:01