C语言学生信息管理程序运行等待退出超时问题排查
C语言学生管理程序超时问题排查
核心问题点
- 内存分配错误(最主要原因)
原代码的动态内存分配参数完全错误:- 首次分配时
malloc(sizeof(student *))申请的是指针类型的大小(通常4/8字节),远小于struct Student结构体的实际大小 - 扩容时
realloc(students, sizeof(countOfStudents + 1))申请的是int类型的大小(通常4字节),完全不符合(countOfStudents + 1) * sizeof(student)的预期
堆缓冲区溢出会触发未定义行为,可能出现程序卡住、死循环、崩溃等问题,直接导致测试超时。
- 首次分配时
- 输入逻辑匹配问题
混用scanf("%s")和fgets处理输入时,scanf("%s")仅读取到空白符就停止,剩余的空格、换行符会留在输入缓冲区,后续fgets和scanf("%i")读取时可能出现格式匹配失败,导致程序一直等待输入触发超时。 - 非法内存访问隐患
- 调用
printStudentInformation时传入countOfStudents -1,错误减少了实际学生总数,若学生数为0会传入负数作为长度,访问空指针数组会触发未定义行为 printStudentInformation中判断countOfStudents <=0后没有终止函数执行,仍会继续遍历数组、调用查找函数,空指针访问会导致程序卡住。
- 调用
- 缓冲区溢出隐患
结构体中name字段仅定义了15字节长度,若输入的名字超过14个字符,strcpy会溢出破坏内存结构。
关键修复点
- 修正内存分配逻辑:
// 首次分配 students = malloc(sizeof(student)); // 扩容 students = realloc(students, (countOfStudents + 1) * sizeof(student));
- 统一输入处理逻辑,避免缓冲区残留问题,调整输入读取顺序,判断到输入为
stop时直接退出,不需要再读取后续内容。 - 修正
printStudentInformation传参,直接传入countOfStudents,并在学生数为0时直接return避免后续非法访问。 - 限制字符串拷贝长度,用
strncpy替代strcpy避免缓冲区溢出。
内容的提问来源于stack exchange,提问作者Suleyman Selcuk
相关产品推荐
相关产品推荐

