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

求问:实现整数加减乘运算的C代码出现Segmentation Fault错误的原因

段错误原因排查与修正

核心错误点

  • 函数返回值滥用导致非法内存访问:
    math函数声明返回int,但整个函数里没有任何return语句,不管是a>b、b>a还是a==b的情况,函数最终都会返回一个不确定的垃圾值。而你在main里写了printf(math(n1, n2))——printf的第一个参数必须是格式字符串的指针,你把这个垃圾int值当成指针用,程序会去访问根本不存在的内存地址,直接触发Segmentation Fault。
  • 冗余且错误的printf调用:
    math函数内部已经用printf输出了运算结果,main里再套一层printf完全是画蛇添足,而且是错误的用法。
  • 逻辑分支不全:
    当输入的两个整数相等时,math函数里的if和else if都不触发,既没有输出,也没有返回值,属于明显的逻辑漏洞。

修正后的代码

#include <stdio.h>
#pragma warning(disable:4996)

// 改成无返回值类型,因为函数只负责输出结果
void math(int a, int b) {
    if (a > b) {
        printf("%d %d %d\n", a + b, a - b, a * b);
    } else if (b > a) {
        printf("%d %d %d\n", b + a, b - a, b * a);
    } else {
        // 补上两个数相等的情况
        printf("%d %d %d\n", a + b, a - b, a * b);
    }
}

int main(void) {
    int n1, n2;
    scanf("%d %d", &n1, &n2);
    // 直接调用函数就行,不用包printf
    math(n1, n2);
    return 0;
}

额外实现思路

如果不想让函数直接输出,而是返回计算结果给主函数处理,可以用指针参数传递结果,写法如下:

#include <stdio.h>
#pragma warning(disable:4996)

void math(int a, int b, int *add, int *sub, int *mul) {
    *add = a + b;
    *sub = a > b ? a - b : b - a;
    *mul = a * b;
}

int main(void) {
    int n1, n2, add, sub, mul;
    scanf("%d %d", &n1, &n2);
    math(n1, n2, &add, &sub, &mul);
    printf("%d %d %d\n", add, sub, mul);
    return 0;
}

内容的提问来源于stack exchange,提问作者김동현

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:41:03