使用malloc与命令行接口实现计算器时main函数打印结果为乱码问题
问题根因
- 核心问题为结构体值传递:你定义的
SI函数参数为Calc c,属于值传递,调用SI(*pCalc)时会完整拷贝原结构体生成临时副本,SI函数内部对c.result的赋值只会修改副本的值,完全不会影响main函数中pCalc指向的原结构体,原结构体的result始终是未初始化的垃圾值。 - 代码存在隐藏语法错误:
malloc处的强制类型转换写为(pCalc *),pCalc是变量名而非类型,正确写法应为(Calc *),否则部分编译器会直接报错。
修复方案
推荐采用传指针的方案,内存开销更低,修改如下:
- 调整
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; } }
- 修改
main中SI函数的调用方式,直接传入结构体指针:
// 原来的 SI(*pCalc); 替换为 SI(pCalc);
修改后main中打印pCalc->result就会输出正确的计算结果。
额外优化建议
- 把结构体定义中的
uint8_t *ope改为char *ope,和strcmp的入参类型匹配,避免不必要的类型转换和编译警告。 - 增加
argc参数校验,判断用户传入的参数数量是否符合要求,避免参数不足时程序崩溃。 malloc分配内存后增加空指针判断,避免内存分配失败引发野指针问题。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

