C语言简单循环出现不明Segmentation Fault:两if正常三if崩溃求助
段错误排查:addStudent函数非法值校验引发的崩溃
问题现象
在addStudent函数中添加三个非法值校验的if语句后触发Segmentation Fault,仅保留其中两个时代码运行完全正常。
核心原因
addStudent函数声明返回int类型,但函数体内没有任何return语句。C语言中,无return的函数会返回栈上的随机垃圾值。main函数中执行currentstudents += addStudent(...)时,会把这个垃圾值加到currentstudents上,导致currentstudents变成超出数组范围的非法值(比如负数或大于capacity的数),后续访问classr数组时触发越界访问,引发段错误。
三个if语句都添加时,函数栈帧的变化刚好让返回的垃圾值触发了越界;仅保留两个时,垃圾值未导致非法索引,因此没立刻崩溃。
修复方案
给addStudent函数补充正确的return值:
- 成功添加学生时返回1,让currentstudents正确自增
- 班级已满无法添加时返回0,不改变currentstudents的值
修复后的addStudent函数代码:
int addStudent(gradebook_t classr[], int currentstudents, int capacity) { if(currentstudents != capacity) { printf("Enter a student name:"); scanf("%s", classr[currentstudents].name); printf("Enter a homework average:"); scanf("%lf", &classr[currentstudents].havg); if(classr[currentstudents].havg < 0 || classr[currentstudents].havg > 100) { classr[currentstudents].havg = 0; } printf("Enter a quiz average:"); scanf("%lf", &classr[currentstudents].qavg); if(classr[currentstudents].qavg < 0 || classr[currentstudents].qavg > 100) { classr[currentstudents].qavg = 0; } printf("Enter an exam average:"); scanf("%lf", &classr[currentstudents].eavg); if(classr[currentstudents].eavg < 0 || classr[currentstudents].eavg > 100) { classr[currentstudents].eavg = 0; } // 成功添加学生,返回1 return 1; } else { printf("The class is full...\n"); // 无法添加,返回0 return 0; } }
额外优化建议
- 处理
scanf的返回值,比如检查scanf("%lf", ...)是否成功读取到数值,避免输入非数字导致的变量未初始化问题 removeStudent函数中,如果存在多个同名学生,会多次执行classr[index] = classr[currentstudents-1],逻辑上存在问题,建议找到第一个匹配项后break,或者明确处理多匹配场景
内容的提问来源于stack exchange,提问作者PapaPumpkin
相关产品推荐
相关产品推荐

