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

C++中对赋值为nullptr的指针执行解引用赋值为何非法?

为什么对赋值为nullptr的指针解引用赋值属于非法操作

要搞懂这个问题,先记住两个最基础的规则:

  • 指针的核心作用是存储有效内存地址,解引用操作(即*p)的唯一合法前提,是指针当前存储的地址,确实指向一块你程序有权限访问、且匹配对应类型的已分配内存。
  • nullptr是C++定义的空指针常量,它的语义非常明确:标记当前指针不指向任何有效的内存对象,它不对应任何一块程序可以合法读写的真实内存地址。

你给出的代码逻辑拆解:

int* p = nullptr;
*p = 7;
  • 第一行代码声明了一个int类型指针p,并将其置为空,等价于明确标注:这个指针现在没有指向任何可用的int类型存储位置。
  • 第二行的*p = 7,逻辑是「找到p存储的地址对应的内存块,把整数值7写入该位置」。但p里根本没有存合法可写的内存地址,这个操作没有任何合法的执行基础。

从实际运行层面看,绝大多数操作系统会把低地址区(包含空指针对应的通常为0的地址)设为受保护的不可访问区域,只要程序尝试读写这块内存,会直接触发段错误(Segmentation Fault),被操作系统强制终止。

注意:部分编译器在低优化等级下可能不会在编译阶段直接报错,只会抛出警告,但这个操作是C++标准明确规定的未定义行为——无论程序运行时是崩溃、是误改了其他位置的内存数据、还是看似“正常运行”,本质都是违规的非法操作,任何场景下都不应该这么写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:54:29