动态分配的数组中的一个值始终打印垃圾值

时间:2014-10-06 16:14:46

标签: c++ arrays dynamic-memory-allocation garbage

为什么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;
    }
}

3 个答案:

答案 0 :(得分:2)

在这两行中,您要调整一个数组,其中包含一个初始化为零的变量(N)。

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

因此,您将new一个长度为0的数组。一旦你cin>>N,这会导致问题,因为你使用该变量来循环并写入数组,这将在分配的空间之外写入。

这些类型的案例真的需要std::arraystd::vector

答案 1 :(得分: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 :(得分: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_);
}