Динамически распределенные массивы и HEAP повреждены - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь написать программу, которая принимает входные данные в виде динамического массива и сортирует их по убыванию, а затем отображает по убыванию.Тем не менее, я получаю сообщение об ошибке отладки, в котором говорится: «HEAP CORRUPTION DETECTED: после блока Normal (# 182) в 0x010CE3E8. CRT обнаружил, что приложение записало в память после завершения буфера кучи».

Итак, программа создаети работает успешно.Однако, когда я пытаюсь выйти из программы, это занимает очень много времени, и я получаю сообщение об ошибке.

void insert_Array(int Array1[], int array_size)
{
    for (int counter = 0; counter < array_size; ++counter)
    {
         cout << " Please enter the " << counter << " number : ";
         cin >> Array1[counter];
    }
    return;
}

void swap(int* a, int* b)
{
    int holder = *a;
    *a = *b;
    *b = holder;
}

void sort_Array(int Array1[], int array_size)
{
    int lowestNum_index;
    for (int counter1 = 0; counter1 < array_size; ++counter1)
    {
        for (int counter2 = counter1; counter2 < array_size; ++counter2)
        {
            if (Array1[counter2] < Array1[counter2 + 1])
                lowestNum_index = counter2;
            else
                lowestNum_index = counter2 + 1;
        }
        swap(Array1[counter1], Array1[lowestNum_index]);
    }
    return;
}

Основная функция

int* npointer = new int[nNumbers];
insert_Array(npointer, nNumbers);
sort_Array(npointer, nNumbers);
cout << " The number you desired is " << nNumbers << endl;

cout << " The numbers in the array from  high to low are ";
for (int i = 0; i < nNumbers; ++i)
{
    cout << *(npointer + nNumbers - i) << " ";
}

cout << endl;
delete [] npointer;

Когда я запускаю программу, успешно сортирует числачто я даю от самого высокого до самого низкого.

ОБНАРУЖЕНА КОРРУПЦИЯ КАРТЫ: после блока Normal (# 182) в 0x010CE3E8.CRT обнаружил, что приложение записало в память после завершения буфера кучи.

1 Ответ

0 голосов

Обычно при выполнении подобного вложенного цикла внутренний цикл запускается с внешнего цикла + 1. Таким образом, вы не получите таких значений, как этот Array1[counter2 + 1], что приводит к недопустимому доступу к памяти внеграницы массива на последней итерации цикла.

Даже если это исправлено, логика сортировки неверна.То, что вы пытаетесь сделать, называется сортировкой выбора, где вы сравниваете каждый элемент массива с остальными элементами в n ^ 2 временных сложностей.Вы должны получить lowestNum_index для каждой итерации внешнего цикла, а не для всего массива.Вот как я могу выполнить сортировку выбора.

void sort_Array(int Array[], int array_size)
{
  for (int i = 0; i < array_size; ++i)
  {
    int lowestIdx = i; // <-- always starts at i
    for (int j = i + 1; j < array_size; ++j)
      if (Array[j] < Array[i])
        lowestIdx = j;

    swap(&Array[lowestIdx], &Array[i]); // <--- note the & symbol to pass by reference
  }
}

Поскольку ваша функция подкачки принимает два указателя, использование Array[i] приведет к недопустимому доступу к памяти, так как оператор [] разыменовывает массив до значения в i, вы должны использовать оператор &, чтобы получить адрес для этого местоположения.т.е.

Array[i] = *(Array + i)
&Array[i] = Array + i // <--- essentially cancels the dereference operator

Редактировать: Инициализировать lowestIdx = i на каждом внешнем цикле

...