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

C++传入vector指针作参数时访问元素报错问题求解

错误原因

你传入的参数L是std::vector<int>*类型的指针,直接写L[i]时,编译器会将其解析为「从指针L的起始地址向后偏移i个std::vector<int>长度的位置,取该位置的vector对象」,并不是访问传入的那个vector内部的第i个元素,自然会触发类型不匹配的报错。
除此之外你的代码还存在3处逻辑错误:

  • 外层循环条件写反:while(isSorted(*L))是列表已经有序时才进入循环,完全不符合冒泡排序的执行逻辑
  • 元素比较逻辑错误:if(i<L[i])是拿下标i和元素值比,冒泡排序需要比较相邻两个元素的大小决定是否交换
  • 缺少下标i的自增逻辑,原有写法会导致i无法正常遍历,直接进入死循环
修复方案
  • 指针访问vector元素时,必须先对指针解引用拿到vector实例,再使用下标访问,写法为(*L)[下标],外层括号不能省略(下标运算符优先级高于解引用运算符,不加括号会被解析为*(L[下标]),还是错误写法)
  • 补全冒泡排序的正常逻辑:增加有序标记、修正循环条件、修正相邻元素比较规则、补全下标遍历逻辑、处理空指针边界情况
修复后代码

保留传指针写法的可运行版本:

void bubbleSort(std::vector<int> *L) {
    // 空指针直接返回,避免崩溃
    if (!L) return;
    int temp;
    bool isSorted = false;
    while (!isSorted) {
        isSorted = true;
        // 遍历到倒数第二个元素即可,要预留i+1的位置
        for (unsigned int i = 0; i < L->size() - 1; ++i) {
            // 相邻元素逆序则交换
            if ((*L)[i] > (*L)[i+1]) {
                temp = (*L)[i+1];
                (*L)[i+1] = (*L)[i];
                (*L)[i] = temp;
                isSorted = false; // 发生交换说明还没排好序
            }
        }
    }
}

更推荐的写法是直接传vector的引用,从根源上避免指针解引用的错误,代码也更简洁:

void bubbleSort(std::vector<int>& L) {
    int temp;
    bool isSorted = false;
    while (!isSorted) {
        isSorted = true;
        for (unsigned int i = 0; i < L.size() - 1; ++i) {
            if (L[i] > L[i+1]) {
                temp = L[i+1];
                L[i+1] = L[i];
                L[i] = temp;
                isSorted = false;
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:09:30