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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:43:16