You need to enable JavaScript to run this app. C++类对象指针数组传参:AddStudent始终写入索引0异常问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.12 11:36:03