内存的物理部分是否为NULL(0)?

时间:2010-10-14 10:09:11

标签: c++ memory pointers null

我知道当你想要指出这个特定的指针没有指向任何它应该设置为NULL(实际上是0)时,有一句老话,但我想知道实际上是不是存在一个物理部分的内存地址为NULL(0)?

7 个答案:

答案 0 :(得分:6)

总是有一个0的物理地址(但它可能不一定映射到物理RAM),但在典型的平台上,任何访问通常都会在虚拟地址空间中执行(正如jweyrich指出的那样,你可以使用{ {1}}等等直接映射物理地址空间),因此任何读取/写入地址0的尝试都会引发某种异常。

在更简单的处理器(想想微控制器等)上,可能没有这样的保护,所以如果你试图写入地址0,就没有什么可以抓住你了。

另请注意,空指针不一定必须指向地址0;唯一的保证是它将等于整数值mmap

答案 1 :(得分:3)

是的,在许多系统(尤其是嵌入式系统)中,存在一个内存地址0,这对于读写是合法的。

在此类系统上,可以选择设置捕获此类读/写的陷阱。

答案 2 :(得分:3)

是的,计算机可以有一个物理地址0.例如,在旧的DOS时代,你经常在那里捅 - 这是中断表开始的地方 - 所以如果你想知道什么会在按键上运行或然后你可以创建一个指向指针数组的指针,然后将指向。我几年前检查了C ++标准中的措辞,看看这是否必然是系统上未定义的行为其中地址0应该是可访问的(在CPU /体系结构级别),而我的回忆是它没有明确表示这将导致未定义的行为。仍然,它基本上保留了在将0放入指针时加载非0值的权利,将指针与0等比较:0是一个特殊的哨兵值,它可以随意做任何事情,所以如果你关心去“通过这本书”然后你就得走累了。

答案 3 :(得分:1)

除非您编写系统内核,否则从您的角度来看,没有这样的内存位置。您的地址位于虚拟地址空间中,这意味着它们不是物理地址。它们通过CPU查找系统表转换为物理。

答案 4 :(得分:1)

在内核空间中,yes NULL可以是有效地址。在用户空间没有。至于物理地址,是的,地址始终为零,但程序使用逻辑地址。

答案 5 :(得分:1)

请注意,即使值0比较等于C / C ++ NULL指针,标准中也不保证空指针实际引用进程的(虚拟)地址空间中的地址零。 (通常会这样,但是你知道,那里肯定会有一些微控制器等等。)所以*(reinterpret_cast<int *>(&my_pointer))可能不会== 0

在某些版本的Unix上(但不在Linux上),每个进程都有一个只读页面,其中只包含映射到地址零地址空间的零字节。在这些机器上,空指针始终指向零值。有一些软件可以使用这个功能,并在移植到Linux或Windows时崩溃。

答案 6 :(得分:1)

由于这是标记的C ++,应该注意标准保证尝试通过取消引用访问“空指针”会引起未定义的行为:

1.9程序执行[intro.execution]

  

描述了某些其他操作   在本国际标准中   undefined(例如,。的效果)   取消引用空指针)。   [注:本国际标准   没有要求   包含的程序的行为   未定义的行为。 ]

...失败的dynamic_cast的效果是空指针,delete空指针没有效果,最后“空指针常量”是==整数表达式0

4.10指针转换[conv.ptr]

  
      
  1. 空指针常量是一个整数常量表达式(5.19)   整数类型的rvalue,其值为零。
  2.