为何内联函数实现的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
相关产品推荐
相关产品推荐

