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

使用malloc与命令行接口实现计算器时main函数打印结果为乱码问题

问题根因
  • 核心问题为结构体值传递:你定义的SI函数参数为Calc c,属于值传递,调用SI(*pCalc)时会完整拷贝原结构体生成临时副本,SI函数内部对c.result的赋值只会修改副本的值,完全不会影响main函数中pCalc指向的原结构体,原结构体的result始终是未初始化的垃圾值。
  • 代码存在隐藏语法错误:malloc处的强制类型转换写为(pCalc *),pCalc是变量名而非类型,正确写法应为(Calc *),否则部分编译器会直接报错。
修复方案

推荐采用传指针的方案,内存开销更低,修改如下:

  1. 调整SI函数参数为结构体指针,删除SI内的打印逻辑,仅做计算赋值:
void SI(Calc *c) {
    if(strcmp((char*)c->ope,"add") == 0)
    {
        c->result = c->num1 + c->num2;
    }
    else if(strcmp((char*)c->ope,"sub") == 0)
    {
        c->result = c->num1 - c->num2;
    }
}
  1. 修改main中SI函数的调用方式,直接传入结构体指针:
// 原来的 SI(*pCalc); 替换为
SI(pCalc);

修改后main中打印pCalc->result就会输出正确的计算结果。

额外优化建议
  • 把结构体定义中的uint8_t *ope改为char *ope,和strcmp的入参类型匹配,避免不必要的类型转换和编译警告。
  • 增加argc参数校验,判断用户传入的参数数量是否符合要求,避免参数不足时程序崩溃。
  • malloc分配内存后增加空指针判断,避免内存分配失败引发野指针问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:06:05