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
相关产品推荐
相关产品推荐

