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
相关产品推荐
相关产品推荐

