在C语言中能否实现数组连续追加学生记录?
需求可行性分析与实现方案
你的需求完全可行,核心问题是原代码的学生数组是局部变量,每次调用Add_Student时创建的数组会在函数执行结束后被销毁,导致之前的数据无法保留。要实现累计存储,需要改用动态内存分配来管理学生数据,同时跟踪当前已存储的学生总数。
修改思路
- 定义全局变量(或通过指针传递)保存动态分配的学生数组指针,以及当前已有的学生数量。
- 每次添加学生时,用
realloc扩展数组内存空间,将新数据追加到已有数据之后。 - 程序退出前释放已分配的内存,避免内存泄漏。
修改后的示例代码
#include <stdio.h> #include <string.h> #include <stdlib.h> // 引入动态内存分配相关头文件 typedef struct { int dd; int mm; int yy; }DATE; typedef struct { char name[20]; int ID; DATE DOB; char course[20]; int yrlvl; }Student; // 全局变量:保存学生数组指针和当前已存储的学生数量 Student *students = NULL; int current_count = 0; void Main_Actions(); void Add_Student(); int main() { Main_Actions(); // 程序退出前释放动态分配的内存 if(students != NULL) free(students); return 0; } void Main_Actions() { char *arr_Actions[] = {"default","Add Student","Edit Student Information","View all Records","Search Student","Exit","\0"}; int choice_Actions; int loop_Actions; printf("\n ========= Actions =========\n"); for(loop_Actions = 1; loop_Actions < 6; loop_Actions++) { printf("[%d]\t",loop_Actions); printf(arr_Actions[loop_Actions]); printf("\n"); } printf("=============================="); printf("\n Choice: "); scanf("%d",&choice_Actions); switch(choice_Actions) { case 1: Add_Student(); break; case 5: // 处理退出逻辑 printf("Exiting program..."); return; default: printf("\n Invalid input!"); Main_Actions(); // 输入错误后返回菜单 break; } } void Add_Student() { int add_count; printf("\n Enter the number of students to add: "); scanf("%d",&add_count); system("cls"); // 扩展内存:原有学生数量 + 新增数量 Student *temp = realloc(students, sizeof(Student) * (current_count + add_count)); if(temp == NULL) // 检查内存分配是否成功 { printf("Memory allocation failed!\n"); Main_Actions(); return; } students = temp; // 更新数组指针 // 录入新学生数据,从当前已有学生的末尾开始 for(int i = current_count; i < current_count + add_count; i++) { printf("================================\n"); printf("=========== STUDENT [%d]=========\n", i + 1); printf("================================\n"); printf("\n Student ID Number: "); scanf("%d", &students[i].ID); printf("\n Student Name: "); scanf("%s", students[i].name); // 数组名本身是指针,无需加& printf("\n Student Course: "); scanf("%s", students[i].course); printf("\n Student Year Level: "); scanf("%d", &students[i].yrlvl); printf("\n Student Birthday: "); printf("\n Month: "); scanf("%d", &students[i].DOB.mm); printf("\n Day: "); scanf("%d", &students[i].DOB.dd); printf("\n Year: "); scanf("%d", &students[i].DOB.yy); system("cls"); } current_count += add_count; // 更新当前学生总数 // 打印所有已存储的学生数据 printf("All stored students:\n"); printf("ID\tName\tCourse\tYear Level\n"); for(int j = 0; j < current_count; j++ ) { printf("%d\t%s\t%s\t%d\n", students[j].ID, students[j].name, students[j].course, students[j].yrlvl); } Main_Actions(); }
关键改动说明
- 新增全局变量
students和current_count,实现跨函数的数据持久化。 - 使用
realloc动态扩展内存,确保原有数据不丢失,同时为新学生分配空间。 - 修复原代码中
scanf("%s",&students[i].name)的错误(数组名本身是指针,不需要取地址符&)。 - 增加内存分配失败的判断逻辑,避免程序崩溃。
- 完善退出选项的处理,避免无限递归调用。
内容的提问来源于stack exchange,提问作者JHO
相关产品推荐
相关产品推荐

