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

为何Case1触发段错误Case2却不触发?含未使用初始化变量b

为什么初始化未使用的变量b会改变野指针代码的崩溃行为?

两段代码本质都是未定义行为(Undefined Behavior),核心原因是int *a;定义了一个未初始化的野指针——它的值是随机的,指向的内存地址完全不确定。对野指针指向的地址赋值,结果完全取决于程序运行时的内存布局,没有任何保证。

两种情况的差异原因

  • Case 1:栈上只有未初始化的指针a,a的随机值恰好指向了进程没有写入权限的内存区域(比如内核空间、只读内存段、其他进程的内存),此时执行*a = 10会触发段错误。
  • Case 2:新增的int b{};会在栈上占用一块内存,改变了栈的整体布局。这时野指针a的随机值刚好指向了进程自身有权限写入的内存区域(比如b所在的栈空间,或者栈上其他可写位置),所以写入操作没有触发段错误,但这完全是偶然的,不是代码正确的表现。

关键提醒

未定义行为的结果是不可预测的:换个编译器版本、调整编译选项、甚至重启电脑,都可能让Case2也触发段错误,或者出现更隐蔽的问题(比如破坏其他变量的值、导致程序逻辑混乱)。

正确的指针使用方式

要使用指针,必须先让它指向有效的内存区域,比如:

// 方式1:指向栈上的已有变量
int val;
int *a = &val;
*a = 10;

// 方式2:动态分配堆内存(记得释放)
int *a = new int;
*a = 200;
delete a;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:12:25