向函数传递不兼容指针类型报错,求排查解决方法
问题分析与修复方案
你的代码存在三处关键错误,导致指针传参和计算逻辑异常,下面逐一说明并给出修复后的完整代码:
错误1:指针未绑定有效内存且传参类型不匹配
在main函数中,你声明的long * whole_part和double * fraction_part是未指向有效内存的野指针,且调用chop时传递的&whole_part、&fraction_part是指针的地址(类型为long**、double**),与chop函数要求的long*、double*参数类型完全不匹配,会引发编译错误和运行时崩溃。
正确做法是声明普通变量,传递变量的地址给函数:
long whole_part; double fraction_part; chop(d, &whole_part, &fraction_part);
错误2:printf格式符使用错误
你用%ln输出long类型变量是错误的,正确格式符应为%ld。
错误3:chop函数计算逻辑错误
d - (double)whole_part这行代码中,whole_part是指针,直接转double会把指针的内存地址转为数值,而非整数部分的值。正确写法是先解引用指针拿到整数部分,再转double计算:
*fraction_part = d - (double)*whole_part;
修复后的完整代码
#include <math.h> #include <stdio.h> #include <limits.h> void chop(double, long *, double *); int main(void) { double d; long whole_part; double fraction_part; printf("enter a double "); scanf("%lf", &d); chop(d, &whole_part, &fraction_part); printf("%.10lf chopped is %ld and %.10lf\n", d, whole_part, fraction_part); return 0; } void chop(double d, long *whole_part, double *fraction_part) { *whole_part = (long)d; *fraction_part = d - (double)*whole_part; }
额外说明:将double转整数部分时,用(long)强制转换比(int)更稳妥,可避免数值超出int范围时的溢出问题。
内容的提问来源于stack exchange,提问作者Akiyuu
相关产品推荐
相关产品推荐

