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);
}


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

溢出问题单点调试下,你看看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;
}


  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/718477
  • 以下回答由chatgpt基于相关博客总结生成:

    我可以为您解决这个问题。

    C++中的缓冲区溢出和未初始化内存的警告很常见。您应该始终避免出现这些警告,因为它们可能在程序中导致意料之外的行为。下面是一些解决方案:

    1. 缓冲区溢出 当您访问数组(例如k[i])时,您需要使用索引值确保不会超出数组的边界。使用索引之前,请始终检查该索引是否小于数组大小。例如,在以下归并算法中,您可以使用该方法:

    void mering(int a,int i,int b,int j) { int x=0,y=0,k=0,m; int temp[MAXSIZE]; while(x<i&&yb[y]?temp[k++]=b[y++]:temp[k++]=a[x++]; } while(x<i) temp[k++]=a[x++]; while(y<j) temp[k++]=b[y++]; for(m=0;m<(i+j);m++) { if(m>=MAXSIZE || k>=MAXSIZE) { cout << "错误:数组超出边界" << endl; return; } a[m]=temp[m]; } }

    1. 未初始化内存 当创建指向对象的指针时(例如bookdate *head),您需要使用new运算符分配可以保存该对象的内存。与此同时,新对象的属性也必须被初始化。例如,在以下示例中,您可以使用该方法:

    bookdate* head = new bookdate(); head->name = ""; head->writer = "";

    3.其他细节 如果您已经采取了上述步骤并且仍然看到警告,则应检查您的代码是否存在其他错误。您应该始终检查变量和指针是否被初始化并分配了足够的空间。还可以使用调试工具(例如gdb)来查找内存分配错误和缓冲区溢出等问题。

    希望我的解决方案可以帮助您解决这个问题。