如何让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; }
核心改动说明
- 把
int aos = amount();移到main函数的大括号内部,作为局部变量初始化,避开全局变量的编译限制。 - 给
average函数的声明和定义都加上int length参数,用来接收数组的实际长度。 - 调用
average时额外传入aos作为数组长度。 - 在
average内部用传入的length替代原来的aos,完成数组遍历和平均值计算。
内容的提问来源于stack exchange,提问作者Kaze
相关产品推荐
相关产品推荐

