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

