回答

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 ; 

將導致訪問衝突。

這就是說,它通常是可能的過程映射執行開始後的第一個(零)頁面,並在某些情況下,你可以指定鏈接器選項,允許程序段必須有依據。