C语言函数调用报错及返回局部变量警告求助(禁用动态内存)
解决你的C语言函数调用与局部变量返回问题
先理清楚你遇到的几个核心问题,逐个给你拆解和解决:
1. 函数调用的语法错误与类型不兼容问题
你写的调用代码:
adjusted_scores = *new_scores(scores,days_late,penalty);
这里有两个关键问题:
- 多余的
*:new_scores返回的是int*类型,你用*解引用后得到的是单个int值,而adjusted_scores是数组类型(int[50]),直接赋值就触发了「incompatible types」的报错。 - 数组不能直接用赋值语句接收指针:C语言中数组名是常量指针,不能通过
=把指针直接赋值给它,这也是类型不兼容的核心原因之一。
另外「called object 'new_scores' is not a function」的报错,大概率是你在代码某个局部作用域里定义了和函数同名的变量(比如局部数组new_scores),导致函数声明被同名变量遮蔽——这就是你说的「函数声明遮蔽全局声明」的本质,编译器把new_scores当成了变量而非函数。
2. 返回局部变量地址的严重风险
你的new_scores函数里定义的int new_scores[MAX_ASSIGNMENTS];是栈上的局部数组,函数执行完毕后栈帧会被销毁,这块内存会被系统回收。返回它的地址会触发「返回局部变量地址」的警告,程序运行时访问该地址会触发未定义行为(比如崩溃、读取垃圾值),这是必须优先修复的问题。
3. 符合限制的解决方案(不使用动态内存)
既然不能用malloc、memcpy等动态内存工具,我们换个思路:让调用者提前准备好目标数组,作为参数传递给函数,函数直接在传入的数组里计算结果,既避免了返回局部内存的问题,也绕开了数组不能直接赋值的限制。
修改后的new_scores函数:
void new_scores(int scores[], int days_late[], int penalty, int result[]) { // 注意:原代码里用sizeof(scores)计算数组长度是错误的! // 数组作为参数传递时会退化成指针,sizeof(scores)得到的是指针大小,不是数组总大小 int i; for(i=0;i<MAX_ASSIGNMENTS;i++){ result[i] = scores[i] - penalty * days_late[i]; // 可选:防止分数变成负数,做个边界处理 if(result[i] < 0) { result[i] = 0; } } }
对应的调用方式改成:
new_scores(scores, days_late, penalty, adjusted_scores); numeric_score = final_score(adjusted_scores, weights);
额外检查:彻底解决函数遮蔽问题
如果还是出现「called object is not a function」的错误,仔细排查代码:
- 有没有在局部作用域里定义
int new_scores;或int new_scores[MAX_ASSIGNMENTS];这类同名变量? - 函数定义如果在调用代码之后,有没有提前声明函数原型?比如在调用前加一行:
void new_scores(int[], int[], int, int[]);
内容的提问来源于stack exchange,提问作者Display name
相关产品推荐
相关产品推荐

