C语言学生管理程序打印学生信息出现乱码问题求助
问题分析与修复方案
核心问题
- 局部数组生命周期失效:选项1中定义的
come是栈上的局部数组,执行完if(x==1)代码块后,该数组内存会被系统回收,数据不再有效。 - 动态内存未实际使用:你用
malloc分配了info指针数组,但没有把输入的学生数据存入这块内存,等于白分配。 - 选项7的无效初始化:选项7里重新定义了全新的
come数组,和之前输入的数据完全无关,里面都是随机垃圾值,自然输出乱码。
修复后的代码
#include <stdio.h> #include <stdlib.h> typedef struct student{ int id; char name[50]; char surname[50]; int semester; float grade; }student; int main() { int x, std, i; x = 0; student** info = NULL; // 初始化为NULL,避免野指针 while (x != 8) { printf("1. Initialize student list\n2. Add a student record\n3. Delete a student record\n4. Display a student record by student surname\n5. Display students passed\n6. Display students failed\n7. Display all student records\n8. Exit"); printf("\nYour choice: "); scanf("%d", &x); if (x == 1) { // 若之前已初始化,先释放旧内存 if (info != NULL) { for (i = 0; i < std; i++) { free(info[i]); } free(info); info = NULL; } printf("How many new students? "); scanf("%d", &std); // 分配指针数组内存 info = (student**)malloc(std * sizeof(student*)); for(i = 0; i < std; i++){ // 为每个学生单独分配堆内存 info[i] = (student*)malloc(sizeof(student)); printf("Enter detail of student #%d\n", (i + 1)); info[i]->id = i + 1; printf("Enter first name: "); scanf("%s", info[i]->name); printf("Enter last name: "); scanf("%s", info[i]->surname); printf("Enter semester: "); scanf("%d", &info[i]->semester); printf("Enter grade: "); scanf("%f", &info[i]->grade); } } else if (x == 7) { // 先判断是否已初始化学生数据 if (info == NULL) { printf("Please initialize student list first!\n"); continue; } for(i = 0; i < std; i++){ printf("ID: %d, Name: %s, Surname: %s, Semester: %d, Grade: %.2f\n", info[i]->id, info[i]->name, info[i]->surname, info[i]->semester, info[i]->grade); } } // 其他选项可继续补充实现 } // 程序退出前释放所有动态内存,避免泄漏 if (info != NULL) { for (i = 0; i < std; i++) { free(info[i]); } free(info); } return 0; }
关键修复说明
- 改用堆内存存储数据:每个学生信息通过
malloc分配堆内存,数据不会随代码块结束销毁。 - 复用全局指针数组:所有操作基于
info指针数组,保证数据一致性。 - 添加内存管理逻辑:重新初始化前释放旧内存,程序退出时清理所有动态内存。
- 增加合法性判断:选项7中先检查是否已初始化,避免访问空指针。
内容的提问来源于stack exchange,提问作者Alchazov
相关产品推荐
相关产品推荐

