C语言计算两数和与绝对差程序输出错误原因求解
错误原因
- 核心错误是
update函数中计算绝对差时,直接对*指针变量a、b*做减法,而非对它们指向的整数值做运算:
C语言中两个同类型指针相减,得到的是两个指针地址的偏移量(单位为对应类型的字节数),和指针指向存储的整数值完全无关。你遇到的输入(4,5)输出正确纯粹是巧合:此时栈上两个int变量a、b的地址偏移刚好是1,和两个数的绝对差一致,其他输入就会出现不符合预期的结果。 - 额外隐藏问题:你在计算绝对差前已经修改了
*a的值为两数之和,就算你把指针减法改成*a - *b,拿到的也是「两数之和减去原来的b」,不是原来两个数的差,结果依然错误。
修复后的代码
#include <stdio.h> #include <stdlib.h> void update(int *a,int *b) { // 先暂存原始值,避免修改后无法读取初始数据 int old_a = *a; int old_b = *b; *a = old_a + old_b; *b = abs(old_a - old_b); } int main() { int a, b; int *pa = &a, *pb = &b; scanf("%d %d", &a, &b); update(pa, pb); printf("%d\n%d", a, b); return 0; }
内容的提问来源于stack exchange,提问作者user16686753
相关产品推荐
相关产品推荐

