記憶體與指標

空指標與 NULL

/ NULL: nuhl /

有時候一個指標需要表示「這裡還沒有東西」——串列的結尾、查無相符的查找、配置失敗。空指標(null pointer)就是大家約定好的「不指向任何東西」的值,而 NULL 是 C 給你用來清楚寫出它的名字。指派 p = NULL 等於說「這個指標刻意不指向任何物件」。

空指標是一個保證與任何真實物件位址都比較為「不相等」的指標。在原始碼中,0 與 NULL 在指標情境下都會產生空指標,實務上存下來的位址就是數字 0。重點在於你可以測試它:當 p 指向某處時 if (p) 為真、p 為空時為假,所以 if (p == NULL) 或乾脆 if (!p) 就能在你信任它之前先檢查。關鍵是:你絕不可解參考空指標——p 為 NULL 時的 *p 是未定義行為,在大多數系統上會以記憶體區段錯誤當掉,因為作業系統刻意讓位址 0 那一頁沒有對映,正是為了攔住這種錯誤。

空指標是工具,本身並不危險:它是定義良好、可檢查的「不存在」值,比一個持有隨機垃圾位址的未初始化野指標安全得多。規矩很簡單——當指標不擁有任何東西時把它設成 NULL,並在每次解參考前檢查 NULL,尤其是任何「可能無法給你真實指標」的函式的回傳值。

char *s = NULL; if (s != NULL) puts(s); ——這個守衛因為 s 是空指標而跳過 puts,避免了當掉。對比:s 為 NULL 時無守衛地呼叫 puts(s),就會解參考空指標。

if (p) / if (p != NULL) 是解參考前的標準守衛。

NULL 是「不指向任何東西」的標記,不是讓你拿來做算術的數字零;而且空指標不同於未初始化的指標(持有垃圾),也不同於指向值為零之物的指標。呼叫 free() 後把指標設為 NULL,這樣日後不小心使用它時是乾淨的當掉,而不是釋放後使用。

又称
NULL pointernullptr空指標