为什么C++实现的sortArray数组排序方法仅能排序前两个元素?
C++冒泡排序仅输出前两个元素的问题原因
核心问题根因
- C++中原生数组作为函数参数传递时会自动退化为指针,函数内部无法获取原数组的完整长度信息。你代码中
sortArray函数内执行sizeof(numbers),计算的是指针变量的内存大小,而非整个数组的字节大小。 - 常见64位环境下指针大小为8字节,int类型大小为4字节,因此
sizeof(numbers) / sizeof(int)的计算结果为2,导致两层排序循环都只执行2次,最终遍历输出也只输出前2个元素,和你看到的运行结果一致。 - Java中的数组是引用类型对象,本身存储了长度属性,传递过程中不会丢失长度信息,因此相同逻辑可以正常运行。
修复方案
两种常用修复方式可选:
- 额外传递数组长度参数
在调用sortArray前先在数组未退化的上下文(比如main函数内)计算好数组长度,作为参数传入函数,函数内所有用到数组长度的位置都使用该参数,修改后代码示例如下:
// 新增length参数接收数组长度 static void sortArray(int numbers[], int length) { // 所有用到数组长度的位置都替换为传入的length参数 for (int i = 0; i < length; i++) { for (int j = 0; j < length - 1; j++) { if( numbers[j] > numbers[j + 1]){ int temp = numbers[j]; numbers[j] = numbers[j + 1]; numbers[j + 1] = temp; } } } for (int i = 0; i < length; i++) { cout << numbers[i] << " "; } } int main() { int numbers[] = {4,2,1,3}; // 在main中计算数组长度是正确的,此时numbers还没有退化为指针 int len = sizeof(numbers)/sizeof(int); cout << "Before sorting:" << endl; for (int i = 0; i < len; i++) { cout << numbers[i] << " "; } cout << "\nAfter sorting:\n"; // 调用时传入长度 sortArray(numbers, len); cout << endl; return 0; }
- 使用
std::vector等STL容器替代原生数组,容器内置size()方法可直接获取元素个数,不存在参数退化丢失长度的问题。
内容的提问来源于stack exchange,提问作者who_am_i
相关产品推荐
相关产品推荐

