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

如何让C语言识别aos等于amount()?解决编译报错问题

问题修正方案

错误原因拆解

  • 「initializer element is not a compile-time constant」编译错误:你把int aos = amount();写在了main()函数的大括号外面,C语言里全局变量的初始化值必须是编译阶段就能确定的常量,而amount()是运行时才会执行的函数调用,没法在编译时算出结果,所以触发报错。
  • average函数无法访问aos:aos是main函数内部的局部变量,作用域只限于main里,其他函数不能直接读取。另外C语言中数组作为函数参数时会退化为指针,没法自动获取数组长度,必须手动把长度传给函数。

修正后的完整代码

#include <cs50.h>
#include <stdio.h>

int amount();
// 给average函数增加长度参数
float average(int array[], int length);

int main(void)
{
    // 把aos的定义移到main函数内部
    int aos = amount();
    
    // 声明变长数组(C99及以上标准支持)
    int scores[aos];
    for (int i = 0; i < aos; i++)
    {
        scores[i] = get_int("score: ");
    }
    // 调用average时传入数组长度
    printf("average: %f\n", average(scores, aos));
}

// 获取分数数量的逻辑保持不变
int amount()
{
    int amt;
    do
    {
        amt = get_int("how many scores: ");
    }
    while (amt < 0);
    return amt;
}

// 修改average实现,用传入的长度遍历数组
float average(int array[], int length)
{
    int sum = 0;
    for (int i = 0; i < length; i++)
    {
        sum += array[i];
    }
    return sum / (float) length;
}

核心改动说明

  1. 把int aos = amount();移到main函数的大括号内部,作为局部变量初始化,避开全局变量的编译限制。
  2. 给average函数的声明和定义都加上int length参数,用来接收数组的实际长度。
  3. 调用average时额外传入aos作为数组长度。
  4. 在average内部用传入的length替代原来的aos,完成数组遍历和平均值计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:05:10