C语言工厂员工管理程序无法正确设置结构体导致输出异常的修复
工厂员工规划C程序修复指南
核心问题根因
InitFactory函数声明返回Worker*类型,但实现中未返回分配好的堆内存地址,导致main函数获取的pFactory为随机野指针,后续访问结构体成员全部输出无效野值。PrintFactory循环逻辑错误:固定传入数组第0个元素的指针,无论输入多少员工,始终重复打印第0条数据。- 格式符与变量类型完全不匹配:
Worker.ID定义为long类型,错误使用%d读写Worker.salary定义为double类型,错误使用%d读写
- 工作天输入逻辑缺失:仅给每个员工输入1条工作记录,未按照
workdays字段的数值循环输入对应数量的工作天数据。 - 薪资计算逻辑为空:
CalculateSalary函数未实现计算,且InputWorker中冗余要求用户手动输入薪资。
修复操作
- 补全
InitFactory返回值:在函数循环结束后添加return Pfactory; - 修正
PrintFactory遍历逻辑:循环内传入pWorker[i]而非固定的*pWorker - 统一修正所有格式符:
- 读写
long类型的ID使用%ld salary输入使用%lf,输出使用%.2f保留两位小数
- 调整
InputWorker流程:移除手动输入薪资的步骤,根据用户输入的workdays数量,循环调用InputWorkDay录入对应天数的工作数据 - 补全
CalculateSalary逻辑:遍历每个员工的所有工作天,累加时薪 * 当日工作时长得到总月薪 - 补充内存释放逻辑:程序退出前先循环释放每个员工的
wd动态数组,再释放pFactory数组,避免内存泄漏
修复后完整代码
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int DayNumber; //1-31 int WorkHours; // 1-12 } WorkDay; typedef struct { long ID; int HourlySal; int workdays; WorkDay* wd; double salary; } Worker; Worker* InitFactory(int* pSize); void PrintFactory(Worker* pWorker, int size); void CalculateSalary(Worker* pWorker, int size); void InputWorkDay(WorkDay* pWD); void PrintWorkDay(WorkDay wd); void InputWorker(Worker* pW); void PrintWorker(Worker w); void FreeFactory(Worker* pFactory, int size); int main() { Worker* pFactory = NULL; int size = 0; pFactory = InitFactory(&size); CalculateSalary(pFactory, size); PrintFactory(pFactory, size); FreeFactory(pFactory, size); return 0; } void InputWorkDay(WorkDay* pWD) { printf("input day number(1-31) and work hours(1-12):\n"); scanf("%d %d", &(pWD->DayNumber), &(pWD->WorkHours)); } void PrintWorkDay(WorkDay wd) { printf("work day: %d, work hours: %d\n", wd.DayNumber, wd.WorkHours); } void InputWorker(Worker* pW) { printf("input employee ID:\n"); scanf("%ld", &(pW->ID)); printf("input hourly salary:\n"); scanf("%d", &(pW->HourlySal)); printf("input total work days this month:\n"); scanf("%d", &(pW->workdays)); // 按实际工作天数循环录入每日数据 for (int i = 0; i < pW->workdays; i++) { printf("input data for work day %d:\n", i+1); InputWorkDay(&(pW->wd[i])); } } void PrintWorker(Worker w) { printf("=================\n"); printf("Employee ID: %ld\n", w.ID); printf("Hourly Salary: %d\n", w.HourlySal); printf("Total Work Days: %d\n", w.workdays); printf("Total Monthly Salary: %.2f\n", w.salary); for (int i = 0; i < w.workdays; i++) { PrintWorkDay(w.wd[i]); } } Worker* InitFactory(int* pSize) { int number_workers = 0; Worker* Pfactory = NULL; printf("input total number of factory workers:\n"); scanf("%d", &number_workers); *pSize = number_workers; Pfactory = (Worker*)malloc(*pSize * sizeof(Worker)); if (Pfactory == NULL) { printf("memory allocation failed\n"); exit(1); } for (int i = 0; i < *pSize; i++) { // 分配31天的工作天数组 Pfactory[i].wd = (WorkDay*)malloc(31 * sizeof(WorkDay)); printf("\ninput data for worker %d:\n", i+1); InputWorker(&Pfactory[i]); } // 补全返回值 return Pfactory; } void PrintFactory(Worker* pWorker, int size) { printf("\n===== Factory Worker List =====\n"); for (int i = 0; i < size; i++) { // 修正遍历逻辑,逐个打印 PrintWorker(pWorker[i]); } } void CalculateSalary(Worker* pWorker, int size) { for (int j = 0; j < size; ++j) { double total = 0; // 累加每个工作天的薪资 for (int day = 0; day < pWorker[j].workdays; day++) { total += pWorker[j].HourlySal * pWorker[j].wd[day].WorkHours; } pWorker[j].salary = total; } } // 补充内存释放函数 void FreeFactory(Worker* pFactory, int size) { for (int i = 0; i < size; i++) { free(pFactory[i].wd); pFactory[i].wd = NULL; } free(pFactory); pFactory = NULL; }
内容的提问来源于stack exchange,提问作者user11106839
相关产品推荐
相关产品推荐

