null确实有什么价值?

Gor*_*son 8 c# java language-agnostic null object

(我知道null是什么以及它用于什么)

问题:好的,我们说用任何语言引用一个对象.计算机在内存中为该参考创建一个32位(或其他大小,取决于计算机的设计)空间.可以将该内存分配给表示对象在内存中的位置的值.但是当我将引用设置为null时,它确实具有什么价值?(参考集中的各个位是什么)这些位是否刚刚清零?但那也不是记忆中的一个位置吗?计算机如何告诉引用包含null而不是对象的引用?

我知道这不是一个"重要"的问题,但我很好奇它是如何运作的.

谢谢你们:D

Ric*_*dle 14

答案分为两部分:

  • 值为零(即值中的所有位均为零)
  • 零永远不会被视为有效地址.

第二点是为什么你的问题的答案"但这不也是记忆中的位置吗?" 是"否" - 它只是一个规则,零不被视为有效的内存位置.试图访问它将导致异常.

编辑: 根据维基百科(所以它必须是8-)"一些架构使用签名的地址空间并使用最负值".因此,它不一定对所有体系结构都是零,但无论它在给定体系结构上具有什么价值,该值都被视为无效的内存位置.

  • 该标准并不要求零是无效地址,它要求无论何时将地址与零进行比较,编译器都必须将该零转换为该体系结构上的标准错误地址.有点巧合的是,在x86 Linux上,无效页面也为零,但并非必须如此. (4认同)
  • "这只是一个规则,零不被视为有效的记忆位置"< - 这不是真的.在某些系统上将0映射到有效页面是完全合法的(如果令人难以置信的令人不安).但是,特别是在C和C++的情况下,标准要求0是无效指针,所以我不确定它是如何交互的. (2认同)

Jon*_*eet 8

在.NET中,空值由"全零"位模式表示.

这很重要,因为这意味着正确创建新数组或对象只涉及擦除内存以在开始调用构造函数,变量初始化器等之前为所有字段创建适当的默认值.

(我一直试图找到这个指定的位置,到目前为止我失败了...但它是唯一有意义的实现.我会继续寻找.)


Deu*_*uro 7

来自C++背景,在谈论指针时,NULL的标准定义是0.我会假设其他语言的工作方式类似.

  • 不要混淆C++代码中空指针的值,它必须是C++标准的4.10/1部分为零,以及编译器使用的空指针的内部表示,这可以是任何方便的. (2认同)