kyrieirving21110 2025-07-12 11:22 采纳率: 75%
浏览 8
已结题

vs已引发异常 编译运行没问题但是回车之后就运行不了了

vs已引发异常
编译运行没问题但是回车之后就运行不了了
求解答一下

img

#include "StudentSystemManager.h"

int main() {
    Node* head = malloc(sizeof(Node));
    head->next = NULL;
    while (1) {
        welcome();//调用函数

        char c = _getch();
        switch (c) {
        case '1':  //录入学生信息
            inputStudent(head);
            break;
        case '2':  //打印学生信息
            break;
        case '3':  //统计学生人数
            break;
        case '4':  //查找学生信息
            break;
        case '5':  //修改学生信息
            break;
        case '6':  //删除学生信息
            break;
        case '7':  //按成绩排序
            break;
        case '8':  //退出系统
            break;
        default:
            break;

            
        }

    }


    return 0;
}
void welcome() {
    printf("*********************************\n");
    printf("*\t学生成绩管理系统\t*\n");
    printf("*********************************\n");
    printf("*\t请选择功能列表\t\t*\n");
    printf("*********************************\n");
    printf("*\t1.录入学生信息\t\t*\n");
    printf("*\t2.打印学生信息\t\t*\n");
    printf("*\t3.统计学生人数\t\t*\n");
    printf("*\t4.查找学生信息\t\t*\n");
    printf("*\t5.修改学生信息\t\t*\n");
    printf("*\t6.删除学生信息\t\t*\n");
    printf("*\t7.按成绩排序\t\t*\n");
    printf("*\t8.退出系统\t\t*\n");
    printf("*********************************\n");
}
void inputStudent(Node*head) {
    Node* fresh = malloc(sizeof(Node));
    fresh->next = NULL;
    printf("请输入学生的学号、姓名、成绩: ");
    scanf_s("%d%s%d", &fresh->stu.stuNum, fresh->stu.name, &fresh->stu.score);
    Node* move = head;
    while (move->next != NULL) {
        move = move->next;

    }
    
    move->next = fresh;
    
    system("pause");
    system("cls");

}

```c
#include <stdio.h>
#include <stdlib.h>
typedef    struct _Student {
    int stuNum;
    char name[20];
    int score;
}Student;
typedef struct _Node {
    Student stu;
    struct _Node* next;
}Node;
void welcome();//声明函数
void inputStudent(Node* head);


```

  • 写回答

6条回答 默认 最新

  • 一杯年华@编程空间 2025-07-12 11:32
    关注

    一杯年华@编程空间帮您解答,本答案结合 ChatGPT4.0和DeepSeek整理
    我曾经遇到过类似的问题,当时也是编译能通过,但运行到输入环节就出异常,后来排查发现主要是内存操作和输入函数使用不规范导致的。结合你的代码和报错信息,我来分析下问题并给出解决方案:

    问题分析

    从报错信息“写入位置发生访问冲突”和代码来看,核心问题出在内存操作不当输入函数使用错误

    1. 内存分配与初始化问题:虽然你用了mallochead分配内存,但可能未对其内部成员(比如next指针)进行正确初始化,导致后续链表操作时访问到非法内存。
    2. scanf_s函数使用错误scanf_s读取字符串时,必须指定缓冲区大小(即name数组的长度),否则可能因输入长度超过数组容量导致内存越界,这是引发访问冲突的常见原因。
    3. 输入逻辑阻塞:回车后程序卡住,可能是_getch()scanf_s的输入缓冲未正确处理,导致输入流混乱,程序无法继续响应。

    解决方案

    方案一:规范scanf_s的使用

    • 具体操作:在读取字符串时,给scanf_s添加缓冲区大小参数。例如读取姓名时,应写成scanf_s("%d%s%d", &fresh->stu.stuNum, fresh->stu.name, 20, &fresh->stu.score)(其中20name数组的长度)。
    • 原理scanf_s是VS提供的安全函数,要求显式指定字符串缓冲区的最大长度,防止输入过长导致内存溢出。

    方案二:完善内存初始化与检查

    • 具体操作
      1. malloc分配的内存进行初始化(如head->next = NULL),避免使用未初始化的指针。
      2. 每次调用malloc后,检查返回值是否为NULL(防止内存分配失败),例如:
        Node* head = (Node*)malloc(sizeof(Node));
        if (head == NULL) {
            printf("内存分配失败\n");
            return 1;
        }
        head->next = NULL; // 显式初始化
        
    • 原理:未初始化的指针可能指向随机内存地址,后续操作时会引发不可预知的异常(如访问冲突)。

    最优方案:方案一+方案二结合

    为什么是最优

    • 方案一直接解决了scanf_s的使用错误(这是导致“回车后崩溃”的直接原因),从输入源头避免内存越界。
    • 方案二解决了内存管理的潜在风险,确保链表操作的安全性,减少隐藏bug。
    • 两者结合能同时覆盖“输入函数不规范”和“内存操作不当”两个核心问题,彻底解决访问冲突和程序阻塞的问题。

    按照以上方案修改后,程序的稳定性会显著提升。如果还有其他问题,欢迎继续留言。请采纳我的解答,谢谢!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 7月20日
  • 已采纳回答 7月12日
  • 创建了问题 7月12日