C++实现选择排序交换数组内容时出现段错误问题求助
段错误及代码问题原因梳理
- 核心段错误诱因:参数类型与传参逻辑完全不匹配
你定义的selection_sort第一个参数int* m[]本质是int**类型,代表存储int指针的数组;但你实际的sel_nums是指向动态申请的int数组首元素的指针,你传入的&sel_nums是指针变量sel_nums本身的内存地址,仅对应1个指针大小的合法存储空间。当你在函数中访问m[1]、m[2]等下标时,属于直接越界访问未申请的非法内存,直接触发段错误。 - 语法逻辑错误:外层for循环缺失花括号
你写的外层循环for (int i = 0; i < array_size; i++)后没有加{},循环体仅包含int min_ind = i;这一行代码,后续的内层循环、元素交换逻辑都只会在i=0时执行1次,即便参数修复也无法完成排序。 - 排序逻辑错误:比较的是指针地址而非元素值
你原代码中的比较逻辑m[min_ind] > m[j]是在比较两个指针的内存地址,而非指针指向的数组元素数值,即便参数和循环都修正,也无法得到正确的排序结果。
修复方案
1. 调整函数定义与传参逻辑
将排序函数的第一个参数改为接收普通int数组(本质退化为int指针):
// 两种写法等价,都是接收int数组首指针 void selection_sort(int m[], int array_size) // 或 void selection_sort(int* m, int array_size)
调用时直接传入数组首指针即可,不需要取地址:
selection_sort(sel_nums, x);
2. 修正排序函数内部逻辑
补全外层循环的花括号,调整比较、交换逻辑为直接操作数组元素:
void selection_sort(int* m, int array_size) { // 外层循环补全花括号包裹所有逻辑 for (int i = 0; i < array_size; i++) { int min_ind = i; for (int j = i+1; j < array_size; j++){ // 直接比较元素值而非指针地址 if (m[min_ind] > m[j]){ min_ind = j; } } // 直接交换元素值,不需要额外解引用 int temp = m[i]; m[i] = m[min_ind]; m[min_ind] = temp; } }
内容的提问来源于stack exchange,提问作者py_lyra
相关产品推荐
相关产品推荐

