ProjectName.exe вызвал точку останова - PullRequest
0 голосов
/ 23 октября 2019

при запуске программы она работает правильно, но всегда выдает эту ошибку. он говорит, что ошибка исходит из строки:

int* temp = new int[length];

Я не знаю, почему это происходит. программа возвращает массив в отсортированном порядке возрастания, но затем выбрасывает точку останова.

void mergeSort(int *a, int low, int high)
{
    if (low == high)
        return;
    int q = (low + high) / 2;
    mergeSort(a, low, q);
    mergeSort(a, q + 1, high);
    merge(a, low, q, high);
}

void merge(int *a, int low, int q, int high)
{
    const int length = high - low + 1;
    int* temp = new int[length];
    int i = low;
    int k = low;
    int j = q + 1;

    while (i <= q && j <= high)
    {
        if (a[i] <= a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }
    while (i <= q)
        temp[k++] = a[i++];
    while (j <= high)
        temp[k++] = a[j++];
    for (i = low; i <= high; i++)
        a[i] = temp[i];
}

1 Ответ

0 голосов
/ 23 октября 2019

Я думаю, что это нарушение прав доступа к памяти temp

    int k = low;

В void merge k переменная равна temp индекс массива. Если mergeSort(a, q + 1, high) вызывает, чем merge low аргумент q + 1 и k выходит за пределы диапазона 0 ~ длины.

Если k находится вне диапазона 0 ~ длины. temp[k] происходит нарушение доступа.
Я также предлагаю добавить delete[] temp в merge функцию.
Это мой код

int _a[] = { 5, 1, 3, 4, 2 }; // Test array!

void merge(int *a, int low, int q, int high)
{
    const int length = high - low + 1;
    int* temp = new int[length];
    int i = low;
    int k = 0;   // I fixed it(low -> 0)
    int j = q + 1;

    while (i <= q && j <= high)
    {
        if (a[i] <= a[j])
            temp[k++] = a[i++];
        else
            temp[k++] = a[j++];
    }
    while (i <= q)
        temp[k++] = a[i++];
    while (j <= high)
        temp[k++] = a[j++];
    for (i = low; i <= high; i++)
        a[i] = temp[i];

    delete[] temp; // Add Delete
}

int main()
{
    mergeSort(_a, 0, 5);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...