C++向函数传递二级指针时形参地址生成与初始化相关疑问
问题解答
C++函数默认采用值传递逻辑,你对ptr变量的疑惑本质是对函数形参的内存分配逻辑不了解,原理很简单:
你调用myFunc(&p)的时候,程序会依次执行以下操作:
- 计算实参
&p的值:也就是main函数中指针变量p本身的内存地址,对应你代码里的输出值0x7ffeefbff520 - 为
myFunc的形参int** ptr在当前的函数栈帧上分配独立的内存空间,这个地址就是你输出的&ptr = 0x7ffeefbff4d8,这个分配过程是编译器编译阶段就提前规划好的,运行时调用函数自动完成,不需要你手动写代码处理 - 把实参
&p的值拷贝到刚才给ptr分配的内存空间里,完成形参的初始化,所以你输出ptr的值才会和&p的输出完全一致
你说的“隐式初始化”确实存在:分配空间+拷贝实参值的整个过程都是程序自动执行的,不需要你显式写初始化代码。ptr本质就是myFunc的局部变量,它的地址和main里的任何变量都没有关联,只有它存储的值是从实参拷贝来的。
额外提醒:你当前的代码存在未定义行为:
myFunc里的局部变量b会在函数返回后被销毁,你把main里的p指向b的地址,后续执行cout << *p << endl;的时候其实是访问已经被回收的栈内存,只是测试场景下这块内存还没被改写所以输出了20,实际生产环境这么写会出现不可预期的崩溃问题。
内容的提问来源于stack exchange,提问作者Yihan Hu
相关产品推荐
相关产品推荐

