动态分配数组中的某个值总是打印一个垃圾值

One of the values in a dynamically allocated array always prints a garbage value

本文关键字:一个 打印 数组 动态分配      更新时间:2023-10-16

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

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

这些类型的情况确实需要std::arraystd::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_);
}
相关文章: