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

为什么C++实现的sortArray数组排序方法仅能排序前两个元素?

C++冒泡排序仅输出前两个元素的问题原因

核心问题根因

  • C++中原生数组作为函数参数传递时会自动退化为指针,函数内部无法获取原数组的完整长度信息。你代码中sortArray函数内执行sizeof(numbers),计算的是指针变量的内存大小,而非整个数组的字节大小。
  • 常见64位环境下指针大小为8字节,int类型大小为4字节,因此sizeof(numbers) / sizeof(int)的计算结果为2,导致两层排序循环都只执行2次,最终遍历输出也只输出前2个元素,和你看到的运行结果一致。
  • Java中的数组是引用类型对象,本身存储了长度属性,传递过程中不会丢失长度信息,因此相同逻辑可以正常运行。

修复方案

两种常用修复方式可选:

  1. 额外传递数组长度参数
    在调用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;
}
  1. 使用std::vector等STL容器替代原生数组,容器内置size()方法可直接获取元素个数,不存在参数退化丢失长度的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:36:03