在单独的函数中传递动态数组以接收输入

时间:2019-07-15 10:22:01

标签: c++ arrays structure

我想将动态数组传递给函数并接收用户输入。目前,我正在使用以下代码:

 #include <iostream>
 using namespace std;
 struct make
 {
     int part;
     int graph;
     int like;
 };

 int z;
 int *p = new int [z]; 

 void inpart( make x[],int *fig)
 {
     cout << "Input part\n";
     cin >> x[*fig].part;
 }

 void ingraph(make x[],int *tig)
 {
     cout << "Input graph\n";
     cin >> x[*tig].graph;
 }

 void inlike(make x[],int *gig)
 {
     cout << "Input like\n";
     cin >> x[*gig].like;
 }

 int main()
 {
     cout << "Input array count\n";
     cin >> z;

     make p[z];   
     for (int i=0; i < z; i++)
     {
         inpart(p,&z);
         ingraph(p,&z);
         inlike(p,&z);
     }
     for (int i=0; i < z; i++)
     {
         cout << "the result is\n";
         cout << p[z].part << ", ";
         cout << p[z].graph << ", ";
         cout << p[z].like << "\n";
     }
 }

我对所有结构对象的输入1,1,1应该输出1,1,1。但是,我收到的答案是1,0,2。为什么?

1 个答案:

答案 0 :(得分:0)

首先,您不应该尝试在运行时初始化静态内置数组: 您的实现在这里是错误的:

cout<< "Input array count\n";
cin>>z;//initialized in run-time
make p[z]; // wrong, need to be allocated with new
make* example = new make[z]; // Ok!

其次,您试图读取和写入所创建数组的边界。这是不确定的行为。当您创建大小为N的数组时,将分配大块内存,您可以通过索引对其进行访问。在您的情况下,从0到z或[0,z),不包括z。总结起来,您的周期应如下所示:

for (int i = 0; i < z; i++) {
  inpart(p,&i);
  ingraph(p,&i);
  inlike(p,&i);
}

实际上,您在代码中犯了很多错误,但是我觉得您以后继续学习时会明白这一点。