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

向函数传递不兼容指针类型报错,求排查解决方法

问题分析与修复方案

你的代码存在三处关键错误,导致指针传参和计算逻辑异常,下面逐一说明并给出修复后的完整代码:

错误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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:35:24