求问:实现整数加减乘运算的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,提问作者김동현
相关产品推荐
相关产品推荐

