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

为何代码触发SIGSEGV?添加引用变量后C++程序崩溃原因咨询

问题解答

你的核心问题出在未初始化指针的解引用属于C++中的未定义行为,两种运行结果的差异只是随机巧合,和那行引用代码本身没有直接因果关系,具体拆解如下:

  1. 关于未初始化指针int *p;

    • 局部指针变量如果不初始化,它的取值是栈上的随机垃圾值,指向的是一块不确定的内存区域。
    • 解引用*p意味着要读取这块随机地址的内容,这是C++标准明确禁止的未定义行为——运行时可能出现任何结果:输出随机数、崩溃、甚至看起来“正常”输出某个值,完全取决于当前栈的内存布局和进程的内存访问权限。
  2. 两种场景的差异原因

    • 当保留int &ref_i = i;时,栈上的内存布局发生了变化,未初始化的p恰好指向了一块当前进程没有权限访问的内存区域(比如栈边界外、系统保护内存),因此触发了段错误(SIGSEGV),程序崩溃。
    • 当移除那行引用代码时,栈布局改变,p恰好指向了一块当前进程可以访问的内存(刚好该地址的内容是0),所以程序“正常”输出了0,但这纯粹是运气,不是正确的行为。
  3. 正确的写法
    必须给指针初始化,让它指向一个有效的内存地址,比如:

    int i = 23;
    int *p = &i; // 让指针指向变量i的地址
    cout << *p << endl; // 此时解引用是合法的,会输出23
    

内容的提问来源于stack exchange,提问作者Sky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:45:28