我想知道......如果当你做一个新的,预订开始的地址是0x0?我想这不可能,但为什么呢? 是为此准备的新运营商?是第一个字节的一部分不可用吗?操作系统启动时始终保留它?
谢谢!
答案 0 :(得分:10)
空指针不一定是地址0x0
,因此架构可能会选择另一个地址来表示空指针,您可以得到{{1来自0x0
的有效地址。 (我认为没有人这样做,顺便说一下,它会打破大量new
电话背后的逻辑,而且反正它更难实施。
操作系统或 C ++实现是否保留空指针未指定,但是memset
将永远不会返回空指针,无论其地址是什么( nothrow new
是一个不同的野兽)。所以,回答你的问题:
内存地址0x0是否可用?
也许,这取决于具体的实现/架构。
答案 1 :(得分:3)
“早期”内存地址通常是为操作系统保留的。操作系统不使用早期物理内存地址来匹配虚拟内存地址以供用户程序使用。根据操作系统,可以有很多东西 - 中断向量表,页表等等。
这是Linux中物理和虚拟内存布局的非特定图表;可能会从发行版到发行版略有不同,并发布到发行版:
http://etutorials.org/shared/images/tutorials/tutorial_101/bels_0206.gif
^不要被图形混淆 - 引导程序不在物理内存中......不知道为什么它们包含了......但是否则它是准确的。
答案 2 :(得分:2)
我想你在问为什么虚拟内存不能一直映射到0x0。其中一个最大的原因是,当你没有指定一个指针时,这是非常明显的 - 如果它是0x0,它指向“没有”并且总是错误的。
当然,NULL可能是任何值(因为它依赖于实现),但是因为未初始化的int的值为0,所以在我看到的每个实现中,为了保持一致性,他们选择保留NULL 0。
还有很多其他原因,但这是一个很好的理由。 Here是一篇关于虚拟寻址的维基百科文章。
答案 3 :(得分:1)
系统保留了许多内存地址以帮助调试。
0x00000000 Returned by keyword "new" if memory allocation failed
0xCDCDCDCD Allocated in heap, but not initialized
0xDDDDDDDD Released heap memory.
0xFDFDFDFD "NoMansLand" fences automatically placed at boundary of heap memory. Should never be overwritten. If you do overwrite one, you're probably walking off the end of an array.
0xCCCCCCCC Allocated on stack, but not initialized
但正如其他一些人所指出的那样,操作系统使用的物理内存地址与操作系统分配给您的应用程序的逻辑内存地址之间存在区别。示例图片显示为here。