【发布时间】:2016-07-15 20:20:11
【问题描述】:
在许多 C 实现中(但不是 all),NULL 对应于进程的逻辑地址 0。当我们尝试取消引用 NULL 时,我们会遇到分段错误,因为 NULL“映射”到内存既不可读也不可写的段。
是否存在具有对应于虚拟NULL 地址的真实物理地址的系统?如果是这样,那里可能存储什么?还是NULL 纯粹是一个没有物理对应物的虚拟地址?
【问题讨论】:
-
空指针是一个概念,
NULL是该概念的实现(编译器)实现。的确,在许多平台上,空指针由地址0表示(如(void *) 0),但特定于实现的部分应该无关紧要。从您作为程序员的角度来看,空指针就是空指针,仅此而已。 -
取消引用 NULL 不一定会导致崩溃,它是未定义的行为。鼻恶魔。并非所有可以使用 C 的系统都有类似于分段错误的概念。
-
NULL可能有也可能没有对应的物理地址。无论哪种情况,它都符合 C 标准。 C 标准所说的是 undefined 取消引用 NULL。所以(很多)你的问题的答案是“视情况而定”。 -
@John Bode 我认为 OP 正在寻找超出 C 规范的
NULL的一些已定义属性。NULL可能是无效地址。NULL可能是有效地址。NULL可能/可能不会耦合到特定的物理地址。当然同意它“保证与程序中任何对象或函数的地址比较不相等”。