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

运行C++计数排序代码每次都出现segmentation fault错误是什么原因?

错误原因
  • max变量未初始化:声明int max;后没有赋予初始值,其初始值为内存中的随机垃圾值。如果数组元素全部小于该随机值,最终max会保留垃圾值,后续创建count[max+1]时会申请超出预期的超大内存,直接触发栈溢出导致段错误。
  • count数组初始化不完整:初始化count数组时仅从下标1开始赋值为0,count[0]保留随机垃圾值,后续计算前缀和执行count[i] += count[i-1]时,i=1会读取错误的count[0]值,导致count数组整体结果异常,后续访问output数组时索引越界触发段错误。
  • 语法错误:代码中存在多余的} // namespace cs19闭合标记,没有对应的命名空间声明,会导致编译失败。
  • 非标准变长数组使用:C++标准不支持用变量作为数组长度定义栈上数组(即变长数组VLA),代码中int output[array_len]、int count[max + 1]、int arr[num]均属于非标准写法,编译器扩展支持的情况下也容易因为数组过大触发栈溢出。
修复方案
  1. 初始化max变量为数组首个元素,增加数组长度为0的边界判断
  2. 用C++标准容器std::vector替代变长数组,创建count数组时直接统一初始化为0,避免手动初始化遗漏
  3. 删除多余的命名空间闭合大括号
  4. main函数中改用标准固定长度数组写法

修复后可运行代码如下:

#include <iostream>
#include <vector>

void counting_sort(int *array, unsigned array_len) {
  // 边界判断:空数组直接返回
  if (array_len == 0) return;
  std::vector<int> output(array_len);
  // 初始化max为数组第一个元素
  int max = array[0];
  for (int i = 0; i < array_len; i++) {
    if (array[i] > max) {
      max = array[i];
    }
  }
  // 用vector创建count数组,所有元素初始化为0
  std::vector<int> count(max + 1, 0);
  for (int i = 0; i < array_len; i++) {
    count[array[i]]++;
  }
  for (int i = 1; i <= max; i++) {
    count[i] += count[i - 1];
  }
  for (int i = array_len - 1; i >= 0; i--) {
    output[count[array[i]] - 1] = array[i];
    count[array[i]]--;
  }
  for (int i = 0; i < array_len; i++) {
    array[i] = output[i];
  }
  std::cout << array[1];
}

int main() {
  int arr[] = {4, 2, 7};
  int num = sizeof(arr) / sizeof(arr[0]);
  counting_sort(arr, num);
  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:06:06