通过函数C++创建结构数组



我想创建一个函数来创建一个结构数组。我所做的是:

struct Student {
char studentNames[128]; 
unsigned int FN; 
short selectiveDisciplinesList[10]; 
unsigned short countOfSelectiveDisciplines; 
bool hasTakenExams;
};

void fillInStudentInfo(Student &student) {...}
Student createStudentsArray() {
unsigned int countOfStudents;
std::cout << "Enter the number of students You are going to write down: " << std::endl;
std::cin >> countOfStudents;
Student studentsArray[countOfStudents];
for (int i = 0; i < countOfStudents; ++i) {
fillInStudentInfo(studentsArray[i]);
}
return *studentsArray;
}

然而,当在main()中时,我分配:

Student studentArray = createStudentsArray();

我无法访问每个不同结构的成员(例如studentArray[i].something(。

这个问题是从哪里来的?

如果我这样做:

Student * createStudentsArray() {
...
return studentsArray;
}

带有

Student * studentArray = createStudentsArray();

我的IDE警告我:

与返回的本地变量关联的堆栈内存的地址

但我似乎能够访问每个结构的成员。这是件坏事吗?

你真的不能用这种方式做你想做的事情:

Student createStudentsArray() {
...
Student studentsArray[countOfStudents];
...
return *studentsArray;
}

首先,这是使用一个可变长度数组,严格地说,这是无效的C++。例如,我的编译器不允许这样做

其次,它只返回一个Student。即使它全部返回,效率也很低,因为它必须全部复制,但它没有。

你试过这个:

Student *createStudentsArray() {
...
Student studentsArray[countOfStudents];
...
return studentsArray;
}

情况更糟。一旦函数结束,分配给该数组的内存就会被释放。这就是编译器警告你的。事情似乎在之后发生了,但很快就会发生非常糟糕的事情。

大多数有经验的C++开发人员都会这样做:

std::vector<Student> createStudentsArray() {
...
std::vector<Student> students(countOfStudents);
...
return students;
}

如果你";不允许使用矢量";(StackOverflow一直看到这一点(,然后执行:

Student *createStudentsArray() {
...
Student *studentsArray = new Student[countOfStudents];
...
return studentsArray;
}

但一旦你用完了这个数组,你就必须delete[]

脚注-如果你真的感兴趣,可以提供更多信息。

事实上,经验丰富的开发人员会这样做:

std::vector<std::shared_ptr<Student>> createStudentsArray() {
...
std::vector<std::shared_ptr<Student> students(countOfStudents);
for (int......)
{
students.push_back(std::make_shared<Student>());
...
}
return students;
}

现在,vector包含一堆智能指针,而不是实际的对象,这是制作较大对象的数组(或其他容器(的最有效方法。std::vectorstd::shared_ptr将自动为您清理所有内存。

最新更新