關於C程序中空指針(null指針)的設計哲學

C語言裏面的指針可以指向任何有效的數據,也可以
不指向任何東西;這後者即所謂的NULL指針。

當指向有效數據的時候,對它使用*做dereference操
作就可以取出數據來了;但是對不指向任何數據的指針
來進行*操作肯定就沒什麼意義了,對吧?所以對不指
向任何數據的指針做提領其實是個bug。

在現代的操作系統設計中,爲了消除程序裏面的這種
bug,故意分配一些專門的不能訪問的內存頁,然後
將NULL指針安排在裏面。這樣當程序員不小心在自己
的程序中寫下對NULL指針的提領操作後,系統運行時
就會報錯。

在windows和linux中,這些內存頁被設計者安排在
0地址開始對應的那幾個頁上。實際上,這些頁面裏面
的任何地址都是不能被提領的。*((char *)0) 不可以,
*((char *)0x12)之類的地址也不可以。

很多人認爲NULL指針其實就是指向0地址的指針,實際
上這是不準確的。雖然很少見,但也有處理器架構將
NULL指針安排在非零地址起始的頁面內。所以爲了程
序的可移植性,在需要使用NULL指針的時候,用NULL
宏而來不用0值來初始化指針變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章