为什么保留内存地址0x0,为什么?

时间:2016-01-12 08:51:45

标签: memory memory-management operating-system ram memory-address

为什么保留内存地址0x0,为什么?我无法理解究竟是什么,谢谢你的帮助

2 个答案:

答案 0 :(得分:3)

它主要是约定,它是特定于实现的。

C语言标准(C99或C11) - 以及其他一些编程语言(如Lisp-)的概念null pointer无法解除引用(undefined behaviorsegmentation fault并且与任何其他指针(对于某个有效的存储器位置)不同。 Tony Hoare谦虚地称之为概念"my billion dollar mistake",而一些语言(Haskell,Ocaml)则有一些tagged unions类型(例如Ocaml中的'a option)。

大多数实现(但不是全部)通过地址0表示空指针。

实际上,在台式机,笔记本电脑或平板电脑上,用户模式C程序在某些virtual address space中运行,其中未映射包含地址0的页面。 (在某些Linux上,您可能会mmap(2) MAP_FIXED地址为0,但这样会很糟糕......)

在某些嵌入式microcontrollers(例如AVR)中,可以使用地址0。

理论上(以及过去),地址可能比数字更复杂......(在20世纪80年代,例如x86 memory segmentation i286iAPX432地址,{ {3}}架构等......)

阅读C编程,微处理器架构和数据库的几本书籍和网页。 Rekursivinstruction sets原则,operating systemvirtual memory s。

答案 1 :(得分:2)

分页内存系统的一种常见做法是默认情况下不映射第一个(第0个)页面。这是通常由链接器强制执行的约定。当程序加载器读取可执行文件时,它永远不会获得映射第一个逻辑页面的指令。

原因是检测空指针错误。

int *whatever = 0 ;
 . . . . 
*whatever = 10 ;

会导致访问冲突。

也就是说,进程通常可以在执行开始后映射第一个(第0个)页面,在某些情况下,您可以指定链接器选项,允许程序部分基于那里。