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

C语言赋值时出现段错误及双精度数最大值函数异常排查

分析你的代码问题及修复方案

你遇到的输出错误和段错误,是因为代码里存在几个关键的C语言基础问题,我来逐一拆解并修复:

1. 比较指针地址而非数值错误

你的max函数里写了if(x > y),这里比较的是指针变量x和y的内存地址,而不是它们指向的double数值大小。正确的应该是比较指针指向的内容:if(*x > *y)。

2. 函数返回值错误导致未定义行为

你的max函数声明返回double*,但函数体里没有任何return语句,这会触发未定义行为。另外,你定义的局部变量d在函数结束后会被销毁,就算返回&d也会得到一个悬空指针,后续访问必然触发段错误。

其实这个场景不需要返回指针,直接返回double类型的最大值更简单;如果一定要保留指针返回的设计,应该返回传入的两个指针中的一个(因为a和b是main函数里的变量,生命周期足够覆盖后续使用)。

3. scanf传参错误

scanf接收格式化输入时,对于基本类型必须传变量的地址,你写的scanf("%lf%lf",a,b);会直接把输入值写到a和b的数值对应的内存地址(这大概率是非法地址),这也是段错误的诱因之一,应该改成scanf("%lf%lf", &a, &b);。

4. printf打印指针而非数值错误

max返回的是double*指针,你用%lf直接打印指针是错误的,%lf是用来打印double类型数值的,需要解引用指针得到数值后再打印:*max(&a, &b)。


修正后的代码(两种方案)

方案一:返回double数值(更简洁直观)

#include <stdio.h>

double max(double x, double y) {
    return (x > y) ? x : y;
}

int main() {
    double a, b;
    printf("Input two #:");
    scanf("%lf%lf", &a, &b);
    printf("max = %lf\n", max(a, b));
    return 0;
}

方案二:保留指针返回设计(符合你最初的思路)

#include <stdio.h>

double *max(double *x, double *y) {
    // 比较指针指向的数值,返回对应指针
    return (*x > *y) ? x : y;
}

int main() {
    double a, b;
    printf("Input two #:");
    scanf("%lf%lf", &a, &b);
    // 解引用指针得到最大值
    printf("max = %lf\n", *max(&a, &b));
    return 0;
}

运行修正后的代码,输入10 9就能得到正确的输出max = 10.000000了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:53:43