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
相关产品推荐
相关产品推荐

