C++值传递(Pass-by-value)内存地址一致性疑问咨询
问题解惑:传值传递参数地址一致的原因
传值传递的核心逻辑没错——调用函数时会创建原变量的独立副本,副本的内存地址理论上应该和原变量不同。你遇到的地址一致情况,大概率是以下几种场景导致的:
print函数的实现错误
最常见的坑:如果你的print函数没有使用传入的参数地址,而是直接打印全局/外部作用域中dog、cat的地址,那不管你是传值还是传引用,输出的都会是原变量的地址。比如代码写成这样:int dog = 1, cat = 2; void print() { cout << &dog << " " << &cat << endl; // 直接访问全局变量 } void swap_byValue(int a, int b) { print(); // 这里调用print,打印的还是全局dog/cat的地址 }这种情况下,
swap_byValue里的a、b是副本,但print根本没用到它们,自然输出原变量地址。编译器的栈空间复用优化
当swap_byValue执行完毕后,它的参数(栈上的副本)会被销毁,栈空间被释放。后续调用print函数时,编译器可能会复用这块刚刚释放的栈空间来存放print的参数,导致两次打印的地址看起来相同。但这只是栈空间的重复利用,本质上swap_byValue的参数和print的参数是不同生命周期的独立变量,并不是同一个内存位置。特殊的变量存储位置
如果dog、cat是static或者全局变量,它们存放在静态存储区而非栈上,但传值传递依然会创建栈上的副本,除非你的print函数逻辑错误,否则不会出现地址一致的情况。
你可以检查下print函数的实现,或者在swap_byValue内部直接打印参数a、b的地址,对比原变量dog、cat的地址,就能确认是否真的创建了副本。
内容的提问来源于stack exchange,提问作者ian
相关产品推荐
相关产品推荐

