【发布时间】:2021-08-09 09:00:07
【问题描述】:
我正在尝试使用vector 创建一个结构指针列表。我的结构包含一些字段,如
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#define MAX 100
struct Student {
char* name,
*phoneNum,
*address
};
我有一个实用函数可以帮助初始化结构指针
struct Student* newStudent() {
struct Student* pStudent = NULL;
pStudent = (struct Student*)malloc(sizeof(struct Student));
pStudent->name = (char*)malloc(MAX * sizeof(char));
pStudent->phoneNum = (char*)malloc(MAX * sizeof(char));
pStudent->address = (char*)malloc(MAX * sizeof(char));
return pStudent;
}
插入函数就像
void insert(vector<Student*> &listStudents, Student* pStudent) {
printf("name: "); scanf("%s\n" , pStudent->name);
printf("phone number: "); scanf("%s\n", pStudent->phoneNum);
printf("address: "); scanf("%s\n", pStudent->address);
listStudents.push_back(pStudent);
printf("inserted OK!\n");
printf("Size: %lu\n", listStudents.size());
}
及显示功能
void display(vector<Student*>& listStudents) {
printf("total students: %lu\n", listStudents.size());
for (int i = 0; i < listStudents.size(); i++) {
printf("Student %d\n", i+1);
printf("name: %s\n", listStudents[i]->name);
printf("phone number: %s\n", listStudents[i]->phoneNum);
printf("address %s\n", listStudents[i]->address);
}
}
这是我的主要功能
int main() {
Student* pStudent = newStudent();
vector<Student*> listStudents;
while(true) {
int op1;
printf("\n1. input\n2. output\n3. search\n4. erase\n5. end\n");
printf("option: ");
scanf("%d", &op1);
switch(op1) {
case 1:
insert(listStudents, pStudent);
break;
case 2:
display(listStudents);
break;
default:
printf("invalid option!\n");
break;
}
}
free(pStudent);
}
当我尝试在每个字段中插入一些信息时。这很好。但是当我展示它时 出去。结果重复。例如:
insert:
Student 1:
name: A
phone number: 010...
address: xyz
Student 2:
name: B
phone number: 011...
address: zyz
display 结果是
Student 1:
name: B
phone number: 011...
address: zyz
Student 2:
name: B
phone number: 011...
address: zyz
这有什么问题??
【问题讨论】:
-
insert只是将参数提供的学生对象指针推入向量中。您在每次迭代中传递 same 对象指针,并在此过程中更改其 content。结果,您的向量被 (a) 反复重复的相同指针填充,并且 (b) 指向的对象包含 last 读取的任何内容。为什么你在其中混搭 C 和 C++ 概念是一个更大的谜。 -
考虑一下,自从对
newStudent()的调用发生一次后,您的代码中创建了多少Student对象。 -
如果您使用 C++ 作为向量,为什么不能对
Student结构使用正确的 C++。也就是说,一个构造函数,new 代替 malloc,或者更好的是,只使用std::string而不是char*。更不用说cout而不是printf。您将节省许多代码行... -
那有什么问题?? 你把 c++ 和 c 混合起来弄得一团糟。为什么....?