C/C++结构体动态数组传参实现及代码报错求助
代码问题排查与修正
核心错误点
- 语法错误:
struct Employee结构体定义的结束大括号后缺少分号,会直接阻断编译流程。 - 成员定义不合理:
Name成员被定义为单个char类型,无法存储常规人名长度的字符串,应修改为定长字符数组(如char Name[50])。 - 输入缓冲区错位:连续调用
scanf时,前一次输入残留的换行符会被后续读取单字符的scanf("%c")直接捕获,导致所有输入值错位,无法正确读取员工信息。 - 动态内存使用不规范:
malloc申请的内存未做空指针校验,若申请失败直接访问数组元素会触发段错误;程序退出前未释放动态申请的内存,存在内存泄漏。
修正后可运行代码
#include <stdio.h> #include <stdlib.h> #define NAME_LEN 50 struct Employee { int Id; char Name[NAME_LEN]; int Degree; int Age; }; void inputFun(struct Employee * EmpArr, int empNum); void printFun(struct Employee * EmpArr, int empNum); int main() { int empNum; printf("Hello, Specify the Number of Employees Please\n"); scanf("%d", &empNum); struct Employee * MyEmpArr = (struct Employee *)malloc(empNum * sizeof(struct Employee)); if (MyEmpArr == NULL) { printf("Memory allocation failed!\n"); return 1; } inputFun(MyEmpArr, empNum); printf("\n"); printFun(MyEmpArr, empNum); free(MyEmpArr); return 0; } void inputFun(struct Employee * EmpArr, int empNum){ for(int i = 0; i < empNum; i++ ){ printf("\nEnter details of Employee %d\n\n", i+1); printf("Id: "); scanf("%d", &EmpArr[i].Id); // 清理输入缓冲区残留的换行符 while(getchar() != '\n'); printf("Name: "); scanf("%s", EmpArr[i].Name); printf("Degree: "); scanf("%d", &EmpArr[i].Degree); printf("Age: "); scanf("%d", &EmpArr[i].Age); while(getchar() != '\n'); } } void printFun(struct Employee * EmpArr, int empNum){ printf("Employee details are: \n"); for(int i = 0; i < empNum; i++ ) printf("%d\t%s\t%d\t%d\n", EmpArr[i].Id, EmpArr[i].Name, EmpArr[i].Degree, EmpArr[i].Age); }
代码说明:通过缓冲区清理逻辑解决连续
scanf的输入错位问题,用字符串读取逻辑适配姓名成员的定义,补充内存校验与释放逻辑,完全匹配作业要求的“动态结构体数组+输入/打印双函数”的实现框架。
内容的提问来源于stack exchange,提问作者Shahd yousef
相关产品推荐
相关产品推荐

