温布利小王子 2023-04-23 17:08 采纳率: 100%
浏览 37
已结题

C++归并排序产生缓冲区溢出和未初始化内存的警告

写了一个简单的归并排序,产生了警告C6386写入 "temp" 时缓冲区溢出和警告C6001使用未初始化的内存“*temp”。

void merge(int* arr, const int& left, const int& mid, const int& right)
{
    int i = left;
    int j = mid + 1;
    const int len = (right - left) + 1;
    int* temp = new int[len];
    int k = 0;
    while (i <= mid && j <= right)
        temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
    while (i <= mid)
        temp[k++] = arr[i++];
    while (j <= right)
        temp[k++] = arr[j++];//缓冲区溢出?
    for (int i = 0; i < len; ++i)
        arr[left + i] = temp[i];//未初始化内存?
    delete[]temp;
}

void mergeSort(int* arr, const int& left, const int& right)
{
    if (left == right)
        return;
    int mid = (left + right) >> 1;
    mergeSort(arr, left, mid);
    mergeSort(arr, mid + 1, right);
    merge(arr, left, mid, right);
}

void MergeSort::sort(int* arr, const int& len)
{
    cout << "归并排序" << endl;
    mergeSort(arr, 0, len - 1);
}


找了半天没发现警告的原因,经过测试程序是能正常运行的。

  • 写回答

2条回答 默认 最新

  • 喝茶品人生 2023-04-23 17:29
    关注

    溢出问题单点调试下,你看看right>arr长度的情况,修改下第一个循环:

    void merge(int* arr, const int& left, const int& mid, const int& right)
    {
        int i = left;
        int j = mid + 1;
        const int len = (right - left) + 1;
        int* temp = new int[len];
        int k = 0;
       while (i <= mid && j <= right && k < len)
        temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];
        while (i <= mid)
            temp[k++] = arr[i++];
        while (j <= right)
            temp[k++] = arr[j++];//缓冲区溢出?
        for (int i = 0; i < len; ++i)
            arr[left + i] = temp[i];//未初始化内存?
        delete[]temp;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月2日
  • 已采纳回答 4月24日
  • 创建了问题 4月23日

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c