运行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]均属于非标准写法,编译器扩展支持的情况下也容易因为数组过大触发栈溢出。
修复方案
- 初始化
max变量为数组首个元素,增加数组长度为0的边界判断 - 用C++标准容器
std::vector替代变长数组,创建count数组时直接统一初始化为0,避免手动初始化遗漏 - 删除多余的命名空间闭合大括号
- 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
相关产品推荐
相关产品推荐

