You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中动态分配内存与结构体数组的访问及数据输入问题

动态分配自定义结构体数组并录入数据的实现方案

你的核心需求是动态分配carInfo结构体类型的数组,遍历每个元素并录入成员数据,但当前代码存在几个关键问题:

  • 错误使用int类型动态数组,而非目标的carInfo结构体数组
  • dataInput函数参数类型不匹配,且内部未实现数据录入逻辑
  • 缺少动态内存释放操作,会引发内存泄漏

以下是修正后的完整实现代码,并附带关键步骤的解释:

修正后的代码

#include <iostream>
#include <string>

using namespace std;

// 自定义车辆信息结构体
struct carInfo
{
    string makeAndModel = "NONE";
    int modelYear = 0;
    double mileage = 0; // 统一变量名小写风格,符合C++编码惯例
};

// 函数原型
void displayTitle();
void dataInput(int, carInfo[]);
void displayCarData(int, const carInfo[]); // 新增:展示录入的数据

int main()
{
    int numOfCarsOwned = 0;
    carInfo* carArray = nullptr; // 改为carInfo类型指针,用于动态分配结构体数组

    displayTitle();

    // 获取用户拥有的车辆数量
    cout << "请输入你拥有的车辆数量: ";
    cin >> numOfCarsOwned;

    while (numOfCarsOwned <= 0)
    {
        cout << "错误 - 请输入正整数! \n";
        cout << "请输入你拥有的车辆数量: ";
        cin >> numOfCarsOwned;
    }

    // 动态分配carInfo类型的数组
    carArray = new carInfo[numOfCarsOwned]; 

    // 调用录入函数填充数据
    dataInput(numOfCarsOwned, carArray);

    // 展示录入的车辆数据(可选)
    cout << "\n你录入的车辆信息如下:\n";
    displayCarData(numOfCarsOwned, carArray);

    // 释放动态分配的内存,避免泄漏
    delete[] carArray;
    carArray = nullptr; // 将指针置空,防止野指针

    system("pause");
    return 0;
}

// 显示标题函数
void displayTitle()
{
    cout << "===== 车辆信息录入系统 =====\n";
}

// 数据录入函数
void dataInput(int numOfCarsOwned, carInfo carArray[])
{
    for (int count = 0; count < numOfCarsOwned; count++)
    {
        cout << "\n请录入第" << count + 1 << "辆车的信息:\n";
        
        // 清除输入缓冲区的换行符,避免影响后续getline读取
        cin.ignore();
        cout << "品牌及型号: ";
        getline(cin, carArray[count].makeAndModel);

        cout << "生产年份: ";
        cin >> carArray[count].modelYear;

        cout << "行驶里程: ";
        cin >> carArray[count].mileage;
    }
}

// 展示车辆数据函数
void displayCarData(int numOfCarsOwned, const carInfo carArray[])
{
    for (int count = 0; count < numOfCarsOwned; count++)
    {
        cout << "\n第" << count + 1 << "辆车:\n";
        cout << "品牌及型号: " << carArray[count].makeAndModel << endl;
        cout << "生产年份: " << carArray[count].modelYear << endl;
        cout << "行驶里程: " << carArray[count].mileage << "公里\n";
    }
}

关键修正点说明

  • 动态数组类型修正:将原代码中的int*改为carInfo*,确保数组存储的是自定义结构体对象,而非整数。
  • 函数参数匹配:dataInput函数的第二个参数改为carInfo[],保证能接收结构体数组。
  • 数据录入逻辑实现:在循环中通过carArray[count].成员名的方式访问每个结构体元素的成员,使用cin/getline完成数据录入。注意用cin.ignore()清除输入缓冲区的换行符,避免getline读取到空内容。
  • 内存释放:使用delete[]释放动态分配的数组,防止内存泄漏,并将指针置空避免野指针。
  • 代码优化:移除重复的头文件,统一变量命名风格,新增数据展示函数验证录入结果。

内容的提问来源于stack exchange,提问作者ManyakaCodes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:54:26