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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:49:10