C语言指针传值失效导致程序提前终止 如何实现函数间多值传递
程序提前终止的核心原因
- 野指针解引用触发内存访问违规:代码中所有未初始化的指针(包括基础测试段的
float *R_a、完整程序GetRValues内部声明的float *Ptr_a,*Ptr_b,*Ptr_c),仅在栈上分配了存储地址的空间,未指向任何合法可读写的内存块,直接执行解引用赋值、scanf写入的操作,会向随机内存地址写入数据,必然触发段错误导致程序崩溃,这类运行时错误编译过程不会提示。 - 函数传参逻辑完全错位:
- 基础测试段中
GetRValues(prompt[70])传入的是prompt数组越界位置的单个字符值,和函数要求的字符数组首地址参数类型不匹配;main函数打印时将&R_a这类指针地址当作float值传入%f格式符,触发类型不匹配的未定义行为,哪怕程序不崩溃输出也全是乱码。 - 完整程序中
GetRValues内部声明的Ptr系列指针是函数局部栈变量,即便完成赋值,函数退出后栈空间立即回收,外部全局的Ptr_a/Ptr_b/Ptr_c根本无法获取函数内部计算出的电阻值。 - 大量打印语句混淆了值和地址:比如
printf("Please enter a value below %f\n", &Rmax)、printf("%f",&Ptr_a),将变量地址传入要求float类型参数的格式控制符,触发未定义行为。
- 基础测试段中
- 运算优先级遗漏括号:
- Star转Delta的正确公式是“三个电阻两两乘积之和除以对侧电阻”,现有代码
R_1=(Ptr_a*Ptr_b)+(Ptr_b*Ptr_c)+(Ptr_a*Ptr_c)/Ptr_c会先执行最后一项的除法,再做加法,计算结果完全错误。 - Delta转Star的公式同样存在漏写括号的优先级问题,输出值和实际理论值偏差极大。
- Star转Delta的正确公式是“三个电阻两两乘积之和除以对侧电阻”,现有代码
- 无效代码干扰逻辑:
GetRValues(prompt,Rmin,Rmax) ==0;仅做返回值和0的比较,没有任何实际逻辑作用;菜单输入环节没有清理输入缓冲区的残留换行符,会导致后续循环逻辑错乱。
C语言中跨函数传值的指针实现机制
C语言没有原生的C++式传引用语法,所谓的“传引用效果”完全靠指针传参实现:
- 需要跨函数修改的变量,主函数在调用时把变量的内存地址作为参数传给子函数,而不是把变量值本身传过去。
- 子函数拿到传入的地址后,通过解引用操作直接读写主函数栈上对应地址的内存,无需在子函数内部额外声明局部指针。
- 正确的签名参考:如果要让
GetRValues把读取到的三个电阻值传回主函数,函数应定义为int GetRValues(char *prompt, float Rmin, float Rmax, float *out_a, float *out_b, float *out_c),调用时传入GetRValues(prompt, Rmin, Rmax, &R_a, &R_b, &R_c),函数内部直接通过*out_a = 读取的输入值完成跨函数写值。
注意:所有指针在使用前必须明确指向已分配的合法内存块,严禁对未初始化的野指针做解引用操作。
内容的提问来源于stack exchange,提问作者josjammet
相关产品推荐
相关产品推荐

