爲什麼內存地址0x0保留,併爲什麼?我無法理解什麼,謝謝你的幫助爲什麼內存地址0x0保留,併爲什麼?
回答
它主要是約定,它是具體實現。
C語言標準(C99或C11) - 和一些其他的編程語言如Lisp-具有null pointer不能被解除引用的概念(這將是undefined behavior,segmentation 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 segmentation上i286,並且iAPX432尋址,Rekursiv建築等...)
讀幾本書和C編程網頁,微處理器架構& instruction sets,operating system原則,virtual memory,MMU秒。
它一直在分頁內存系統中的常見做法,是不會默認的第(零)頁面映射。這是鏈接器強制執行的約定。當程序加載器讀取可執行文件時,它永遠不會獲得映射第一個邏輯頁面的指令。
原因是檢測空指針錯誤。
int *whatever = 0 ;
. . . .
*whatever = 10 ;
將導致訪問衝突。
這就是說,它通常是可能的過程映射執行開始後的第一個(零)頁面,並在某些情況下,你可以指定鏈接器選項,允許程序段必須有依據。
- 1. 爲什麼get_memory_usage保留內存?
- 2. self.viewDelegate = 0x0爲什麼?
- 3. 爲什麼UILabel 0x0?
- 4. CALayer爲什麼不保留其內容?
- 5. 爲什麼Azure保留子網的前四個IP地址
- 6. 爲什麼GDB中的一些內存地址比其他內存地址短?
- 7. 什麼導致內存保留
- 8. 爲什麼.NET爲我的應用程序保留這麼多內存?
- 9. 保留的內存地址?
- 10. 爲什麼Android的JSONObject保留在內存中?
- 11. 爲什麼Backbone.View對象仍然保留在內存中?
- 12. 爲什麼插入空結構保留向量增加內存?
- 13. 這個內存地址包含什麼?
- 14. 爲什麼這麼多「保留的內置符號」-s在python
- 15. 爲什麼不保存cookie?
- 16. 爲什麼我無法保留通過谷歌地圖的返回地址
- 17. 爲什麼我的程序輸出內存地址?
- 18. 爲什麼Rails在我的頁面上顯示內存地址?
- 19. MIPS爲什麼內存地址增加4?
- 20. 爲什麼數組的內存地址總是增加?
- 21. 爲什麼在運行時改變內存地址
- 22. 爲什麼每次編譯時內存地址都會改變?
- 23. 爲什麼這些調用具有相同的內存地址?
- 24. 爲什麼內存地址以0x開頭?
- 25. vb6爲什麼我想要無人執行並保留在內存集中?
- 26. 爲什麼0x0指向有效數據
- 27. 什麼爲0x0指示指令
- 28. 爲什麼addSubview不保留視圖
- 29. NSTimer保留數增加,爲什麼?
- 30. 爲什麼GCC保留空功能?