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

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 09: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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    温布利小王子 2023-04-24 01:24

    这样就行了,内置类型没有初始化,确实没想到这点

    int* temp = new int[len]();
    
    

    回复
    2301_81513624 回复 温布利小王子 2024-03-04 10:57

    但是我这样改了以后,内存是初始化了,但还是缓冲区溢出啊,为什么啊

    回复
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月24日
  • 创建了问题 4月23日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部