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

CS50第二周Hours练习:输入周数超5触发Segmentation Fault

问题分析与解决

核心问题

  1. 数组初始化顺序错误:你先声明了int score[N];,但此时全局变量N的值是0,相当于创建了一个长度为0的空数组。后续输入N的数值后,往这个数组里写入元素的操作本质是在访问数组边界外的内存,当N超过栈上分配的小空间(比如5)时,就触发了Segmentation Fault(内存越界访问)。
  2. average函数未完成:你的average函数只有循环开头,没有累加逻辑和返回语句,会导致编译或运行异常。
  3. 全局变量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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:16:09