温布利小王子 2023-04-23 17: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条回答 默认 最新

  • Watch the clown 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日