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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:42:03