C++类对象指针数组传参:AddStudent始终写入索引0异常问题
核心问题根因
AddStudent函数的索引赋值逻辑写反,导致所有新增数据始终被写入数组第0位,后一次操作会直接覆盖前一次的内容,最终只能看到最后一次添加的学生信息。
- 函数内的
id变量初始值为0,从现有逻辑看根本没有被正确更新的可能:- 遍历数组找空位、找匹配已存在学生的两个判断分支里,代码写的是
i = id——也就是把固定值0赋值给循环变量i,压根没有把当前遍历到的目标索引值存进id - 后续写入姓名、姓氏的操作,全部固定使用
pointer_array[id]也就是数组第0位的内存地址,根本不会写到其他位置
- 遍历数组找空位、找匹配已存在学生的两个判断分支里,代码写的是
其他连带存在的问题
- 没有满仓兜底:数组一共10个位置,全被占满的时候,遍历完也找不到空位,程序不会提示任何错误,还是会往第0位写数据,把原有学生的信息覆盖掉
- 头文件结构错误:
student.h里把#include <iostream>放在了头文件保护宏#ifndef STUDENT_H_的外面,头文件被多个源文件引入时,会触发重复定义的编译错误;而且头文件里直接用了std::string却没有显式引入<string>头文件,属于依赖间接引入,换个编译环境很容易报错 - 展示函数逻辑错误:
ShowAllStudents里多写的那个else if分支,要求“学生姓名不是none 且 遍历到最后一个元素”两个互斥条件同时成立,这个分支永远跑不起来,空位置的“无数据”提示完全失效 - 内存泄漏:
main里用new申请了10个Student对象的内存,程序退出前没有对应的delete操作释放,长期运行会堆积内存占用 - 代码冗余:所有
pointer_array[i]->Student::成员名的写法完全没必要,因为指针本来就指向Student类的对象,直接写pointer_array[i]->成员名就能正常访问
修正后的核心代码片段
AddStudent函数核心调整为正确记录目标写入索引:
void AddStudent(Student* pointer_array[], int n) { int inputIndex{}, id = -1; // 用-1标记未找到可写入目标的状态 std::string name{}, surname{}; std::cout << "Write IndexNr:"; std::cin >> inputIndex; // 第一步:查找是否存在同索引的已录入学生 for(int i = 0; i < n; i++){ if (inputIndex == pointer_array[i]->IndexNr) { id = i; // 将找到的匹配索引存入id break; } } // 未找到匹配的已存在学生时,查找第一个空位置 if (id == -1) { for(int i = 0; i < n; i++){ if (pointer_array[i]->name == "none") { id = i; // 将找到的空位索引存入id break; } } } // 兜底提示:数组已满无法写入 if (id == -1) { std::cout << "学生存储空间已满,无法新增" << std::endl; return; } // 按正确索引写入数据 pointer_array[id]->IndexNr = inputIndex; std::cout << "Student's name: "; std::cin >> name; pointer_array[id]->name = name; std::cout << "Student's surname "; std::cin >> surname; pointer_array[id]->surname = surname; }
student.h结构修正:
#ifndef STUDENT_H_ #define STUDENT_H_ #include <iostream> #include <string> // 显式引入string头文件,避免依赖间接导入 class Student { public: int IndexNr; std::string name; std::string surname; Student() { IndexNr = 0; name = "none"; surname = "none"; } }; #endif
main函数补充内存释放逻辑:
int main() { int n{10}; Student* pointer_array[10]; for (int i = 0; i < n; i++) pointer_array[i] = new Student; AddStudent(pointer_array, n); AddStudent(pointer_array, n); AddStudent(pointer_array, n); ShowAllStudents(pointer_array, n); // 遍历释放所有new申请的内存 for (int i = 0; i < n; i++) delete pointer_array[i]; return 0; }
内容的提问来源于stack exchange,提问作者GoldenRC
相关产品推荐
相关产品推荐

