为什么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 :(得分:2)
在这两行中,您要调整一个数组,其中包含一个初始化为零的变量(N
)。
int N;
point *p = new point[N];
因此,您将new
一个长度为0
的数组。一旦你cin>>N
,这会导致问题,因为你使用该变量来循环并写入数组,这将在分配的空间之外写入。
这些类型的案例真的需要std::array
或std::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_);
}