使用指针的C语言成绩评分程序——输入4个分数后触发段错误
排查C语言程序段错误(Segmentation Fault)的思路与修复方案
嘿,太懂你遇到段错误那种抓耳挠腮的感觉了!先别慌,段错误本质是程序非法访问了不属于它的内存,结合你输入4个分数就崩溃的场景,咱们从几个最常见的方向排查:
最可能的几个问题点
- 数组内存越界:比如你定义的分数数组大小小于4(比如
double scores[3];),但却往里面塞4个分数,直接踩了不该碰的内存,触发崩溃。 - 函数参数传递错误:给
Average函数传的N值不对(比如传了比实际数组大的数),或者scores指针是空的/指向了非法内存区域。 - 输入逻辑错误:用
scanf读取分数时,没正确传递变量的地址(比如写成scanf("%lf", scores[i])而不是&scores[i]),导致写入了错误的内存地址。 - 循环边界错误:
Average函数里的循环条件写错了(比如i <= N而不是i < N),导致多访问了一个数组元素。
给你一个可参考的正确实现示例
你可以对比自己的代码,看看哪里不一样:
#include <stdio.h> #define _CRT_SECURE_NO_WARNINGS // 计算平均分的函数,先做参数合法性校验 double Average(double *scores, int N) { if (N <= 0 || scores == NULL) { printf("参数错误!\n"); return 0.0; } double sum = 0.0; for (int i = 0; i < N; i++) { sum += scores[i]; } return sum / N; } // 根据分数获取字母等级 char getGrade(double score) { if (score >= 90) return 'A'; else if (score >= 80) return 'B'; else if (score >= 70) return 'C'; else if (score >= 60) return 'D'; else return 'F'; } int main() { const int STUDENT_NUM = 4; double scores[STUDENT_NUM]; // 定义刚好容纳4个分数的数组 // 输入分数,同时校验输入有效性 printf("请输入4个学生的成绩:\n"); for (int i = 0; i < STUDENT_NUM; i++) { printf("第%d个成绩:", i+1); if (scanf("%lf", &scores[i]) != 1) { printf("输入格式错误,请输入数字!\n"); return 1; } } // 计算并输出平均分 double classAvg = Average(scores, STUDENT_NUM); printf("\n班级平均分:%.2lf\n", classAvg); // 输出每个学生的等级 printf("学生成绩等级:\n"); for (int i = 0; i < STUDENT_NUM; i++) { printf("第%d位:%.2lf -> %c\n", i+1, scores[i], getGrade(scores[i])); } return 0; }
快速排查步骤
- 先检查你定义的分数数组大小,确保它能容纳至少4个元素;
- 看
Average函数里的循环,是不是用了i < N的条件; - 检查输入部分的
scanf,每个读取分数的语句都要加&取地址(数组元素的地址是&scores[i]); - 如果用了动态内存分配(比如
malloc),要确认分配的大小是N * sizeof(double),并且检查malloc的返回值不是NULL。
按照这个思路排查,应该能很快找到问题所在~
内容的提问来源于stack exchange,提问作者Unknown Shin
相关产品推荐
相关产品推荐

