C语言swapNum函数数值交换结果异常Bug原因与修复方案
问题根因
你的代码一共存在3处逻辑错误,直接导致输出异常:
- C语言函数默认采用值传递规则:调用
swapNum时传入的firstNum、secondNum会被拷贝一份给函数内部的形参num1、num2,你在函数内交换的只是这两个临时副本的值,完全不会改动main函数里原始变量的值,函数执行结束后临时副本就会被销毁。 - 函数无法执行到第二个return语句:C语言中函数执行到第一个
return就会直接退出,后续代码永远不会运行,因此你写的return num2;是无效代码,函数最多只能返回一个值(也就是交换后的num1副本),C语言函数本身也不支持同时返回两个值。 - printf参数和格式占位符不匹配:你的格式化字符串里写了两个
%i占位符,但是只传入了swapNum这一个返回值,第二个占位符会读取栈上的随机垃圾数据,这就是你看到异常乱数的直接原因,这种写法属于未定义行为,每次运行的输出结果都可能不稳定。
正确实现方案
C语言中要在函数内修改外部变量,必须传入变量的内存地址(即指针),通过解引用操作直接修改对应内存位置存储的数据,标准实现代码如下:
#include <stdio.h> // 参数接收两个int类型变量的地址,不需要返回值 void swapNum(int *num1, int *num2){ int tempNumber; tempNumber = *num1; // 解引用拿到地址对应的实际值 *num1 = *num2; *num2 = tempNumber; } int main(){ int firstNum, secondNum; printf("Enter the first number:"); scanf("%i", &firstNum); printf("Enter the second number:"); scanf("%i", &secondNum); swapNum(&firstNum, &secondNum); // 传入两个变量的内存地址 printf("Swapped value: first number: %i, second number: %i", firstNum, secondNum); return 0; }
补充:如果只是在main函数内做交换不需要单独封装函数的话,也可以不用指针,直接在同作用域内用临时变量交换即可;不建议使用异或、加减运算等无临时变量的交换写法,可读性差且容易出现溢出问题。
内容的提问来源于stack exchange,提问作者A.J. Damalan
相关产品推荐
相关产品推荐

