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

CS50 C语言考试分数计算器数组赋值编译错误问题求助

问题原因
  • 函数未提前声明:C99标准要求调用函数前必须先声明函数原型,你代码里注释了get_scores的原型,也没有写average的原型,编译器第一次遇到这两个函数调用时会默认其返回值为int,和你后续实际定义的返回值int*、float冲突,进而触发隐式声明、类型冲突、格式不匹配等一系列关联报错。
  • 返回栈内存地址:get_scores里的scores是定义在函数内部的局部数组,存储在栈内存中,函数执行结束后对应的栈帧会被系统回收,这块内存的内容会变得不可控,返回这个局部数组的地址属于非法操作,后续访问该地址会引发未定义行为。
修复后的完整代码
#include <cs50.h>
#include <stdio.h>

const int total_exam = 3;  // 考试总数量常量

// 提前声明函数原型
void get_scores(int scores[]);
float average(int length, int array[]);

int main(void)
{
    // 在main中定义数组,内存生命周期覆盖整个程序运行周期
    int all_scores[total_exam];
    // 传入数组地址让get_scores填充内容
    get_scores(all_scores);

    printf("Your average score is %f\n", average(total_exam, all_scores));
}

// 接收数组地址,直接填充内容无需返回指针
void get_scores(int scores[])
{
    for (int i = 0; i < total_exam; i++)
    {
        scores[i] = get_int("What's your exam score?: ");
    }
}

// 计算平均分的函数保持逻辑不变
float average(int length, int array[])
{
    int sum = 0;
    for (int i = 0; i < length; i++)
    {
        sum += array[i];
    }
    return sum / (float) length;
}
核心修改说明
  • 新增两个函数的原型声明,符合C99的语法要求,消除所有隐式声明相关的报错
  • 取消get_scores的指针返回逻辑,改为在main函数中定义存储分数的数组,将数组地址传入get_scores填充内容,彻底避免返回栈内存地址的非法操作

内容的提问来源于stack exchange,提问作者berkayln

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:06:07