Вы фактически никогда не выделяете место для переменной array
- вы только объявляете ее и присваиваете ей значение nullptr
. Таким образом, когда вы позже попытаетесь выполнить array[i]=p;
, вы пытаетесь разыменовать нулевой указатель, что вызывает вашу ошибку EXC_BAD_ACCESS
.
Чтобы исправить это, вам нужно выделить массив, как только вы узнаете, какой размер это (то есть, сколько сторон у вашего многоугольника). Вы должны сделать это так же, как вы распределяете массив distance
:
cin>>numberSide;
float* distance=new float[numberSide];
Point* array = new Point[numberSide]; // And you should delete the earlier "Point* array = nullptr;` line
Конечно, вам также необходимо освободить память, когда вы закончили с ней:
delete [] distance;
delete [] array;
return 0;
Однако, поскольку вы используете C ++, лучший способ far , чем использование необработанных указателей и оператора new
, заключается в использовании контейнера std::vector
стандартной библиотеки шаблонов , который занимает заботиться обо всех операциях распределения и освобождения внутри. Вот соответствующие строки 'замены':
#include <vector> // This header defines the `std::vector` container
//...
cin>>numberSide;
std::vector<float> distance(numberSide);
std::vector<Point> array(numberSide);
Тогда вам не нужны строки delete[]
, поскольку память векторов будет автоматически освобождена, когда векторы go выйдут из области видимости. , Кроме того, вам не нужно действительно изменять любой другой код, поскольку класс std::vector
имеет оператор []
, который работает так, как вы этого хотите.