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
相关产品推荐
相关产品推荐

