程式語言中,空指標[1](英語:Null Pointer)是一個已宣告但並未指向一個有效物件的指標,許多程式利用空指標來表示某些特定條件,例如未知長度陣列的結尾或某些無法執行的操作。在可選擇型態(optional type)的程式語言中,空指標通常可以跟可為Null的型別(Nullable types)和空值(Nothing value)進行比較。

空指標與未初始化的英語Uninitialized_variable指標(uninitialized pointer)不同,空指標保證不會和有值的指標相等,而未初始化的指標則是要看所使用的程式語言或編譯器而定,在部分程式語言環境下,未初始化的指標無法保證不與有值的指標相等,他可能因為存有記憶體殘值而指向了某個有效物件。有許多實現上是以0 (全位為0) 代表空指標。

空參照

程式語言中,空參照(英語:Null Reference)是一個與空指標類似的概念,是一個已宣告但其並未參照到一個有效物件的變數。東尼·霍爾在1965年發明了空參照,並作為ALGOL W程式語言的一部分[2]

歷史

查爾斯·安東尼·理察·霍爾(C. A. R. Hoare)在2009年表示他在1965年發明了空參照,並且將這項發明描述為「十億美元的錯誤」[2]

程式語言中的空指標

C語言

在C語言中,任何2個空指標都保證是相等的[4],其是由預處理器的巨集提供,即NULL,其被定義為用來表示空指標的常數值,在C99是透過隱含轉換或直接轉換成void*的整數值0來使用[5]

在C語言中,空指標的值表示為#define NULL (void *)0[6]

C語言標準並沒有規定記憶體位置0與空指標相同,隨然實際上記憶體位置0與空指標在大部分的情況下會是相同的。對空指標反參考在C語言中是一個未定義行為,在實作上,反參考時必須確保所取的指標不為空。

C++語言

C++語言中,同樣有繼承自C語言的NULL巨集可供使用,但在傳統上會優先使用整數零來表示空指標常數[7]。在C++11標準中已明確的引入一個常數(部分編譯器視之為關鍵字,如Visual Studio)nullptr做為表示空指標的常數[8]

nullptr是C++11語言中的關鍵字,在C++11語言標準用來表示空指標的常數值。其型態為nullptr_t[8]

其他語言

一些語言使用其他的命名方式來表示空指標,如Pascal, Ruby 以及 Lua 則使用 nil[9]Visual Basic 使用 NothingFortran不支援此一常數,但其屬性(property)可被設置成 NULLIFY 並由 ASSOCIATED 函數測試之。

反參考

因為空指標沒有指向有效的物件,所以若嘗試反參考(Dereference,即,從該記憶體位置取出數值)的話,有概率導致程式執行時發生錯誤或立即崩潰。

  • 在C語言中,對空指標反參考是一個未定義行為。許多實作對空指標反參考的案例都會導致程式因為segmentation fault而死機或停止運作,因為空指標通常表示選擇了一個不是由系統分配的儲存空間,但是並非每次都會出現這種情況。
  • 在Java語言中,若嘗試從空指標的物件中反參考則會觸發NullPointerException(NPE)[10],由於會觸發錯誤,因此可以使用例外處理的程式碼來捕捉,但編程上仍要儘量確保永遠不會發生此錯誤為佳。

NullPointerException

空指標錯誤是一種常見的程式錯誤,當嘗試存取空指標所指向之物件時,就會發生NullPointerException[11],通常是因為物件未順利初始化或者提前解構而造成。空指標錯誤常常出現在類別設計或管理上有缺陷的程式中,一旦出現了空指標錯誤經常會導致程式死機或崩潰[12]。而在部分程式語言中,則有NullReferenceException[13](空參照錯誤),例如.Net平台。

在Java中,NullPointerException被定義在java.lang.NullPointerException日語NullPointerException,是一種執行階段錯誤(java.lang.RuntimeException)。

參見

參考文獻

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.