Одно из значений в динамически размещаемом массиве всегда печатает значение мусора

Почему 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;
}
}

0

Решение

В этих двух строках вы определяете размер массива с переменной, инициализируемой нулями (N).

int N;
point *p = new point[N];

Поэтому вы бы newв массиве длины 0, Это приведет к проблемам, как только вы cin>>N потому что вы используете эту переменную для цикла и записи в массив, который будет записывать за пределами выделенного пространства.

Эти типы случаев действительно просят std::array или же std::vector,

2

Другие решения

Ваш код имеет неопределенное поведение, потому что переменная 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;
}
}
2

Если вы знаете максимальное количество очков, лучше сделайте что-то вроде:

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_);
}
1
По вопросам рекламы [email protected]