存在内存访问异常,但我不确定我的代码中出了什么问题

There's a memory access exception but I'm not sure what's wrong in my code

本文关键字:代码 问题 什么 我的 不确定 访问 内存 异常 存在      更新时间:2023-10-16

我正在测试视觉工作室中的一些快速排序情况,但是我得到了错误,我不确定我的代码出了什么问题。

这是我的代码。

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;
void Swap(int *arr, int a, int b) {
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}
void BubbleSort(int *arr, int len) {
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                Swap(arr, j, j + 1);
            }
        }
    }
}
void QuickSort(int *arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int pivot = arr[left];
    int low = left;
    int high = right + 1;
    while (low <= high) {
        while (arr[++low] <= pivot && low <= right);
        while (arr[--high] >= pivot && high > left);
            if (low > high) {
                Swap(arr, left, high);
            }
            else {
                Swap(arr, low, high);
            }
    }
    QuickSort(arr, left, high - 1);
    QuickSort(arr, high + 1, right);
}


int main() {
    srand((unsigned)time(NULL));
    int *arr = new int[10000];
    for (int i = 0; i < 10000; i++) {
        arr[i] = rand() % 10000;
    }
    BubbleSort(arr, 10000);
    QuickSort(arr, 0, 9999);
    delete[] arr;
    return 0;
}

如果我分配的内存很小也没关系但是这段代码的情况在我的 QuickSort(( 函数中出现了错误。

pivot是最大的元素时,第一个内部while循环将运行,直到++low> right,导致数组越界访问。在访问arr[++low]之前,您必须检查low < right。同样的事情也适用于第二个循环。

此外,使用 std::swap 而不是滚动自己的,使用 std::size_t 作为数组索引,使用 C++ <random> 库而不是 C rand() 函数。并且不要做using namespace std.