You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:35