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

为何内联函数实现的swap操作未得到正确结果?

问题

以下是使用内联函数实现的swap操作代码:

#define INLINE static inline __attribute__((always_inline)) 

INLINE void swap(int a, int b){
    int tmp = a;
    a = b;
    b = tmp;
}


int main(){
    int x = 10;
    int y = 20;
    swap(x, y);
    printf("x:%d y:%d", x, y);
    return 0;
}

运行输出:

output: x:10 y:20

既然内联函数会被插入到调用处,为什么这个swap没法正确交换变量值?

解答

别扯内联的事,这锅内联不背——问题出在参数传递方式上:

  • 你的swap函数用的是值传递:调用swap(x,y)时,只是把x和y的数值拷贝到形参a、b里,a和b是完全独立于x、y的临时变量
  • 哪怕内联把swap的代码直接怼进main函数里,本质还是在操作那两个拷贝出来的临时变量,跟原变量x、y一毛钱关系都没有
  • 函数里交换的是a和b的值,原变量x、y根本没被修改,输出当然还是原来的数

要实现真正的交换,必须用指针传递,修改后的代码如下:

#define INLINE static inline __attribute__((always_inline)) 

INLINE void swap(int *a, int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}


int main(){
    int x = 10;
    int y = 20;
    swap(&x, &y); // 传递变量的内存地址
    printf("x:%d y:%d", x, y);
    return 0;
}

这次操作的是原变量的内存空间,交换后x和y的值就会正确互换了。


内容的提问来源于stack exchange,提问作者kaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:10:03