Почему p [1] .x распечатывается со значением мусора?
Можно ли инициализировать динамически распределенный массив для данного массива? Если да, то как?
#include <ioStream>
using namespace std;
struct point{
int x;
int y;
};
int N;
point *p = new point[N];
int main(){
cin>>N;
for(int i=0; i<N; i++){
cin>>p[i].x>>p[i].y;
}
for(int i=0; i<N; i++){
cout<<"("<<p[i].x<<", "<<p[i].y<<")"<<endl;
}
}
В этих двух строках вы определяете размер массива с переменной, инициализируемой нулями (N
).
int N;
point *p = new point[N];
Поэтому вы бы new
в массиве длины 0
, Это приведет к проблемам, как только вы cin>>N
потому что вы используете эту переменную для цикла и записи в массив, который будет записывать за пределами выделенного пространства.
Эти типы случаев действительно просят std::array
или же std::vector
,
Ваш код имеет неопределенное поведение, потому что переменная N не была инициализирована с количеством потенциальных элементов массива, когда она использовалась для выделения массива в куче
int N;
point *p = new point[N];
То есть как глобальная переменная со статической продолжительностью хранения, ей было присвоено 0 компилятором. Согласно стандарту C ++
Когда значение выражения равно нулю, функция распределения
призвал выделить массив без элементов.
Перепиши свой код хотя бы как
#include <ioStream>
using namespace std;
struct point{
int x;
int y;
};
int main(){
int N;
cin>>N;
point *p = new point[N];
for(int i=0; i<N; i++){
cin>>p[i].x>>p[i].y;
}
for(int i=0; i<N; i++){
cout<<"("<<p[i].x<<", "<<p[i].y<<")"<<endl;
}
}
Если вы знаете максимальное количество очков, лучше сделайте что-то вроде:
const int MAXN = 1000;
Point p[MAXN];
int N;
cin >> N;
// ...
Вы также можете вручную выделить место, но сначала вы должны прочитать N.
cin >> N;
Point *p = new Point[N];
// ...
Третий вариант — использовать контейнер (vector
для динамических массивов).
vector<Point> p;
cin >> N;
while(N--)
{ int x, y;
cin >> x >> y;
Point p_(x, y); // Assumes constructor exists
p.push_back(p_);
}