CS50第二周Hours练习:输入周数超5触发Segmentation Fault
问题分析与解决
核心问题
- 数组初始化顺序错误:你先声明了
int score[N];,但此时全局变量N的值是0,相当于创建了一个长度为0的空数组。后续输入N的数值后,往这个数组里写入元素的操作本质是在访问数组边界外的内存,当N超过栈上分配的小空间(比如5)时,就触发了Segmentation Fault(内存越界访问)。 average函数未完成:你的average函数只有循环开头,没有累加逻辑和返回语句,会导致编译或运行异常。- 全局变量
N的不合理使用:依赖全局变量传递数组长度,代码耦合性高,容易引发逻辑错误。
修复步骤
- 调整数组声明顺序:先获取用户输入的周数N,再创建对应长度的数组。CS50环境支持C99的变长数组,直接在main函数里获取N后声明即可。
- 替换全局变量为函数参数:把N作为参数传给
total和average函数,避免全局变量带来的问题。 - 补全
average函数逻辑:完成累加计算,将总和转换为浮点型后除以N,返回平均值。 - 修正周数显示:
get_int的格式化参数里,用i+1代替hours,让周数从1开始显示(更符合用户习惯)。
修正后的完整代码
#include <cs50.h> #include <stdio.h> int total(int array[], int n); float average(int array[], int n); int main(void) { // 先获取周数 int N = get_int("Number of weeks taking CS50: "); // 根据周数创建数组 int score[N]; for (int i = 0; i < N; i++) { score[i] = get_int("Week %i hours: ", i + 1); } char result; do { result = get_char("Enter T for total hours, A for average: "); } while (result != 'T' && result != 'A'); if (result == 'T') { printf("%i hours\n", total(score, N)); } else if (result == 'A') { printf("%.2f hours\n", average(score, N)); } } int total(int array[], int n) { int sum = 0; for (int j = 0; j < n; j++) { sum += array[j]; } return sum; } float average(int array[], int n) { int sum = 0; for (int a = 0; a < n; a++) { sum += array[a]; } // 转换为浮点型计算平均值 return (float)sum / n; }
内容的提问来源于stack exchange,提问作者Prince Justine Samson
相关产品推荐
相关产品推荐

