You need to enable JavaScript to run this app. C语言工厂员工管理程序无法正确设置结构体导致输出异常的修复
优惠活动
大模型
产品
解决方案
定价
更多

C语言工厂员工管理程序无法正确设置结构体导致输出异常的修复

工厂员工规划C程序修复指南

核心问题根因

  • InitFactory函数声明返回Worker*类型,但实现中未返回分配好的堆内存地址,导致main函数获取的pFactory为随机野指针,后续访问结构体成员全部输出无效野值。
  • PrintFactory循环逻辑错误:固定传入数组第0个元素的指针,无论输入多少员工,始终重复打印第0条数据。
  • 格式符与变量类型完全不匹配:
    • Worker.ID定义为long类型,错误使用%d读写
    • Worker.salary定义为double类型,错误使用%d读写
  • 工作天输入逻辑缺失:仅给每个员工输入1条工作记录,未按照workdays字段的数值循环输入对应数量的工作天数据。
  • 薪资计算逻辑为空:CalculateSalary函数未实现计算,且InputWorker中冗余要求用户手动输入薪资。

修复操作

  1. 补全InitFactory返回值:在函数循环结束后添加return Pfactory;
  2. 修正PrintFactory遍历逻辑:循环内传入pWorker[i]而非固定的*pWorker
  3. 统一修正所有格式符:
  • 读写long类型的ID使用%ld
  • salary输入使用%lf,输出使用%.2f保留两位小数
  1. 调整InputWorker流程:移除手动输入薪资的步骤,根据用户输入的workdays数量,循环调用InputWorkDay录入对应天数的工作数据
  2. 补全CalculateSalary逻辑:遍历每个员工的所有工作天,累加时薪 * 当日工作时长得到总月薪
  3. 补充内存释放逻辑:程序退出前先循环释放每个员工的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.09 04:36:08