в рамках моего исследования мы изучаем использование «кучи», и перед нами была поставлена задача написать короткую математическую программу с использованием указателей для ссылки на кучу и ее определения.
В качестве личного обучения я попытался воспроизвести это с помощью массива, создав его и используя бинарный поиск. Но это просто не сработает.
Вот мой код:
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
//creating pointers
int* ii = new int;
int* top = new int;
int* bottom = new int;
int* uArray = new int[12];
int* uChoice = new int;
//assigning values in location of pointer
*ii = 5;
*top = 11;
*bottom = 0;
cout<<"Please input a value between 1 and 12 to find in the array: \t";
cin >> *uChoice;
for (int x = 0; x<12; x++) //adding values into the array
{
uArray[x] = x;
cout<<x;
Sleep(1000);//checking loop works
}while (uArray[*ii] != *uChoice)
{
if (uArray[*ii] > *uChoice)
{
*bottom = *ii;
*ii = (*top + *bottom)/2;
}
else
{
*top = *ii;
*ii = (*top + *bottom) /2;
}
if (*uChoice == *ii)
{
break;
}}
//clearing pointers.
delete ii;
delete top;
delete bottom;
delete uArray;
ii = 0;
top = 0;
bottom = 0;
uArray = 0;
cout<<uChoice<<" Found at position: \t"<< *ii;
Sleep(10000);
return 0;
}
Спасибо заранее.
[Edit:] Ошибка происходит в цикле while. Что-то происходит, что означает, что он неправильно ищет массив. Извините, я не уточнил это.Ключевое слово delete освобождает память, на которую указывает указатель. Поэтому вам не следует пытаться использовать указатель снова после этого.
Кроме того, когда указатель на массив, вы должны использовать синтаксис delete [] uArray, иначе память не будет освобождена должным образом.
Не уверен, что это та часть, которая «не сработает», поскольку вы не были более конкретны.
Технически, Стандарт не определяет «кучу», но насколько это делают реализации, new
создает элементы на FreeStore а не куча. malloc()
создает элементы на отвал.
Хорошо для чтения:
ПОЛУЧИЛ № 9: Управление памятью — Часть I
У вас есть Неопределенное поведение скрываясь, когда вы сделали:
int* uArray = new int[12];
delete uArray;
Тебе нужно:
delete []uArray;
Причина, по которой цикл while не находит правильный элемент в массиве, не связана с использованием указателей. Я мог бы просто дать вам ответ напрямую, но для вас будет более полезно найти его самостоятельно (прежде чем вы посмотрите на спойлер ниже).
Я предлагаю вам попробовать запустить код в отладчике. Если вы раньше не использовали отладчик, я настоятельно рекомендую вам попробовать. Установите точку останова в начале цикла while. Возможно, вам будет полезно записать на листе бумаги содержимое массива uArray [] для справки. Затем пошагово проходите цикл while по одной строке за раз, обращая особое внимание на оператор if — входит ли он в предложение if или предложение else и, как следствие, перемещается ли он * вверх или * вниз. Посмотрите, имеет ли смысл то, что происходит, учитывая значение * uChoice по сравнению с uArray [* ii].
Это тривиальная ошибка, и вы поймете себя, как только заметите ее. Но более полезный урок заключается в том, как отлаживать ваш код.
(Если у вас нет отладчика, вы можете достичь того же эффекта, вставив несколько операторов cout в цикл while, чтобы вывести значения ключевых переменных.)
Вот ответ (наведите курсор мыши, чтобы увидеть его):
Оператор больше чем должен быть меньше, чем в тесте, сравнивающем uArray [* ii] и * uChoice. Если искомое число меньше значения в массиве, вы знаете, что оно находится в нижней половине, поэтому вы хотите переместить низходящий, не снизу вверх.