为何代码触发SIGSEGV?添加引用变量后C++程序崩溃原因咨询
问题解答
你的核心问题出在未初始化指针的解引用属于C++中的未定义行为,两种运行结果的差异只是随机巧合,和那行引用代码本身没有直接因果关系,具体拆解如下:
关于未初始化指针
int *p;- 局部指针变量如果不初始化,它的取值是栈上的随机垃圾值,指向的是一块不确定的内存区域。
- 解引用
*p意味着要读取这块随机地址的内容,这是C++标准明确禁止的未定义行为——运行时可能出现任何结果:输出随机数、崩溃、甚至看起来“正常”输出某个值,完全取决于当前栈的内存布局和进程的内存访问权限。
两种场景的差异原因
- 当保留
int &ref_i = i;时,栈上的内存布局发生了变化,未初始化的p恰好指向了一块当前进程没有权限访问的内存区域(比如栈边界外、系统保护内存),因此触发了段错误(SIGSEGV),程序崩溃。 - 当移除那行引用代码时,栈布局改变,
p恰好指向了一块当前进程可以访问的内存(刚好该地址的内容是0),所以程序“正常”输出了0,但这纯粹是运气,不是正确的行为。
- 当保留
正确的写法
必须给指针初始化,让它指向一个有效的内存地址,比如:int i = 23; int *p = &i; // 让指针指向变量i的地址 cout << *p << endl; // 此时解引用是合法的,会输出23
内容的提问来源于stack exchange,提问作者Sky
相关产品推荐
相关产品推荐

