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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:54:23