回答

2

它主要是约定,它是具体实现。

C语言标准(C99或C11) - 和一些其他的编程语言如Lisp-具有null pointer不能被解除引用的概念(这将是undefined behaviorsegmentation fault),并且是任何其它指针的不同(某些有效的内存位置)。 Tony Hoare谦虚地称这种概念为"my billion dollar mistake",而某些语言(Haskell,Ocaml)具有一些​​3210类型(例如Ocaml中的'a option)。

大多数的实现(但不是全部)通过地址0

表示空指针在实践中,在桌面,膝上型计算机或平板计算机,用户模式C程序中一些virtual address space运行,其中含有该地址的页0未映射。 (在一些Linux,你或许可以用mmap(2)MAP_FIXED地址为0,但是这将是口感差...)

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

在理论(和过去),地址可能是多了一些更复杂的......(在上世纪80年代,如x86 memory segmentationi286,并且iAPX432寻址,Rekursiv建筑等...)

读几本书和C编程网页,微处理器架构& instruction setsoperating system原则,virtual memoryMMU秒。

1

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

原因是检测空指针错误。

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

将导致访问冲突。

这就是说,它通常是可能的过程映射执行开始后的第一个(零)页面,并在某些情况下,你可以指定链接器选项,允许程序段必须有依据。