【发布时间】:2018-01-16 19:05:59
【问题描述】:
今天我想知道是否可以将整数 0 分配给指针,即执行与分配 NULL 相同的操作。直到今天我都认为,这是 C++ 的新功能。这从一开始就是 C 的一个特性,还是随着更新的语言标准而放松?
【问题讨论】:
-
指针指向内存地址。 0 是有效的无效内存地址
-
"可以将整数 0 分配给指针" 对于 object 指针是可以的。不确定函数指针——它们有一些不同的规则。
-
实际上,在我所知道的任何现代硬件和操作系统上,从地址 0 开始的内存页面在 MMU 中被有意取消映射,因此任何取消引用那里的指针的尝试总是会产生页面错误,这通常会映射到操作系统级别的致命错误。
-
@DanielPryden Minor:标准不调用
0literal,而是 constant -
@DanielPryden:现代操作系统将地址 0 标记为未映射到 用户空间。在内核空间中不一定如此。 C 支持“独立环境”(特殊情况)以及“托管环境”(普通用户程序)。我知道内存被映射为零对于某些内核代码来说是个问题。地址 0 不用于任何 C 对象,因此它满足空指针与指向有效对象的指针可区分的规则,但这意味着空指针的不正确解引用不会崩溃,使得一些 bug 难以发现。
标签: c null-pointer