C++指针参数传递规则、内存分配原理及传引用相关问题咨询
指针面试题解答
原题代码
void fun(int *p){ int q = 10; p = &q; } int main() { int r = 20; int *p = &r; fun(p); cout<<*p<<endl; }
(1)运行结果原理说明
上述代码的运行结果为输出20,结合内存分配机制的解释如下:
- C/C++默认函数参数为值传递,此处传入
fun的是main中指针p的值拷贝:fun的形参p和main的实参p是栈上两个完全独立的变量,仅初始值相同,都存储着变量r的栈地址。 - 调用
fun时系统会为其分配独立的栈帧:形参p、局部变量q都分配在fun的栈帧上,执行p = &q仅修改了fun栈帧内形参p的取值,不会对main栈帧里的指针p产生任何影响。 fun执行结束后其栈帧被回收,main中的指针p仍然指向变量r,因此解引用取值为r的初始值20。
(2)引用传递的野指针问题
你的理解完全正确,相关原理如下:
- 将
fun的参数修改为int *&p后,形参p是main中实参指针p的引用(别名),此时在fun内对p的赋值操作会直接修改main中指针p的取值。 - 局部变量
q是fun栈帧上的非静态变量,生命周期和fun的栈帧完全绑定:fun执行结束后栈帧被操作系统回收,该区域内存会被标记为空闲可复用,原q的存储地址变为无效地址。 - 此时
main中的p存储的就是已经被释放的栈内存地址,属于典型的野指针,访问*p属于访问非法内存,行为是未定义的:大部分场景下会读到随机垃圾值,部分场景会触发段错误导致程序直接崩溃。
内容的提问来源于stack exchange,提问作者Saurav kumar
相关产品推荐
相关产品推荐

