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

std::span版插入排序越界报错,C数组版正常求排查(VS2022)

解决std::span版插入排序的"std::span index out of range"错误

问题出在第二个for循环的条件顺序,以及std::span在Debug模式下的边界检查机制:

  • 你的循环条件写的是arr[j] > key && j >= 0,逻辑与运算符是短路求值,但这里先执行了arr[j] > key的判断,当j递减到-1时,会先访问arr[-1],触发std::span的越界检查(VS2022 Debug模式下默认启用),直接抛出错误。
  • C数组版本没有内置的边界检查,访问arr[-1]属于未定义行为,虽然没报错,但实际是不安全的,只是巧合没触发崩溃而已。

修正方法很简单,调整循环条件的顺序,先判断索引有效性:

template <typename Ty>
void insertion_sort(std::span<Ty> arr) {
    long long size = arr.size();
    // From the 2nd element to the nth element
    for (long long i = 1; i < size; ++i) {
        Ty key = arr[i];
        long long j = i - 1;
        // 先判断j >= 0,确保索引有效后再访问元素
        for (; j >= 0 && arr[j] > key; --j)
            arr[j + 1] = arr[j];
        // Place key into the right position.
        arr[j + 1] = key;
    }
}

这样修改后,当j变成-1时,j >= 0为假,短路求值会跳过arr[j] > key的判断,避免越界访问,同时也让C数组版本的代码变得安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:35:07