2014-10-06 9 views
0

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

@Cyber, который заслуживает того, чтобы его повысили до ответа. –

ответ

2

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

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

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

Эти типы корпусов действительно требуют std::array или std::vector.

+1

'N' _is_ с нулевой инициализацией перед' main'. Это потому, что у него есть «статическая продолжительность хранения» в силу глобального. –

2

Ваш код имеет неопределенное поведение, поскольку переменная N не была инициализирована с числом потенциальных элементов массива, когда он был использован для выделения массива в куче

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

То есть как глобальная переменная с статической продолжительности хранения ему был присвоен 0 компилятором. В соответствии со стандартом С ++

Когда значение выражения равно нулю, то функция распределения является называется выделить массив без элементов.

Перепишите код по крайней мере, как

#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; 
    } 
} 
1

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

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_); 
} 
+0

Третий вариант для меня не новый. p.push_back() весьма полезен, я могу использовать его и в других программах. Спасибо .. – Moriarity

+0

Добро пожаловать, вы можете использовать ссылку, чтобы узнать эти вещи. Google cppreference. Вы также можете проголосовать за мой ответ, если это поможет :) – saadtaame

 Смежные вопросы

  • Нет связанных вопросов^_^