为何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
相关产品推荐
相关产品推荐

