空指標- 维基百科,自由的百科全书

文章推薦指數: 80 %
投票人數:10人

此條目介紹的是以各種程式語言為基礎介紹Null Pointer的概念。

关于C++11語言標準的關鍵字,请见「nullptr」。

在程式語言中,空指標 ... 空指標 語言 監視 編輯   此條目介紹的是以各種程式語言為基礎介紹NullPointer的概念。

關於C++11語言標準的關鍵字,請見「nullptr」。

在程式語言中,空指標[1](英語:NullPointer)是一個已宣告但並未指向一個有效物件的指標,許多程式利用空指標來表示某些特定條件,例如未知長度陣列的結尾或某些無法執行的操作。

在可選擇型態(optionaltype)的程式語言中,空指標通常可以跟可為Null的型別(Nullabletypes)和空值(Nothingvalue)進行比較。

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

目次 1空參照 2歷史 3程式語言中的空指標 3.1C語言 3.2C++語言 4nullptr 5取值 5.1NullPointerException 6參見 7參考文獻 空參照編輯 在程式語言中,空參照(英語:NullReference)是一個與空指標類似的概念,是一個已宣告但其並未參照到一個有效物件的變數。

東尼·霍爾在1965年發明了空參照,並作為ALGOLW程式語言的一部分[2]。

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

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

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

C語言標準並沒有規定記憶體位置0與空指標相同,隨然實際上記憶體位置0與空指標在大部分的情況下會是相同的。

對空指標取值在C語言中是一個未定義行為,在實作上,取值時必須確保所取的指標不為空。

C++語言編輯 在C++語言中,同樣有繼承自C語言的NULL巨集可供使用,但在傳統上會優先使用整數零來表示空指標常數[7]。

在C++11標準中已明確的引入一個常數(部分編譯器視之為關鍵字,如VisualStudio)nullptr做為表示空指標的常數[8]。

nullptr編輯 主條目:nullptr nullptr是C++11語言中的關鍵字,在C++11語言標準用來表示空指標的常數值。

其型態為nullptr_t[8]。

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

在C語言中,對空指標取值是一個未定義行為。

許多實作對空指標取值的案例都會導致程式因為segmentationfault而當機或停止運作,因為空指標通常表示選擇了一個不是由系統分配的儲存空間,但是並非每次都會出現這種情況。

在Java語言中,若嘗試從空指標的物件中取值則會觸發NullPointerException(NPE)[9],由於會觸發錯誤,因此可以使用例外處理的程式碼來捕捉,但編程上仍要儘量確保永遠不會發生此錯誤為佳。

NullPointerException編輯 主條目:NullPointerException(日語:NullPointerException) 空指標錯誤是一種常見的程式錯誤,當嘗試存取空指標所指向之物件時,就會發生NullPointerException[10],通常是因為物件未順利初始化或者提前解構而造成。

空指標錯誤常常出現在類別設計或管理上有缺陷的程式中,一旦出現了空指標錯誤經常會導致程式當機或崩潰[11]。

而在部分程式語言中,則有NullReferenceException[12](空參照錯誤),例如.Net平台。

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

參見編輯 記憶體除錯(英語:Memory_debugger) 零號分頁(英語:Zero_page)參考文獻編輯 ^空指標nullpointer.國家教育研究院.[2018-09-08].(原始內容存檔於2018-09-09).  ^2.02.1TonyHoare.NullReferences:TheBillionDollarMistake.InfoQ.com.2009-08-25[2018-09-08].(原始內容存檔於2018-09-04).  ^3.03.1JointTechnicalCommitteeISO/IECJTC1,SubcommitteeSC22,WorkingGroupWG14.InternationalStandardISO/IEC9899(PDF;CommitteeDraft).2007-09-08[2018-09-08].(原始內容存檔(PDF)於2018-06-24).  ^ISO/IEC9899[3],clause6.3.2.3,paragraph4. ^ISO/IEC9899[3],clause7.17,paragraph3:NULL...whichexpandstoanimplementation-definednullpointerconstant... ^NULLpointerinC.[2018-09-09].(原始內容存檔於2018-09-09).  ^Stroustrup,Bjarne.Chapter5:Pointers,Arrays,andStructures:5.1.1:Zero.TheC++ProgrammingLanguage14thprintingof3rd.UnitedStatesandCanada:Addison–Wesley.March2001:88.ISBN 0-201-88954-4.InC,ithasbeenpopulartodefineamacroNULLtorepresentthezeropointer.BecauseofC++'stightertypechecking,theuseofplain0,ratherthananysuggestedNULLmacro,leadstofewerproblems.IfyoufeelyoumustdefineNULL.use    constintNULL=0;Theconstqualifier(§5.4)preventsaccidentalredefinitionofNULLandensuresthatNULLcanbeusedwhereaconstantisrequired.  ^8.08.1Anameforthenullpointer:nullptr(PDF).stroustrup.com.2003-09-10[2018-09-09].(原始內容(PDF)存檔於2017-07-05).  ^java.lang.NullPointerException.docs.oracle.com.[2018-09-08].(原始內容存檔於2018-09-10).  ^Nullpointerexceptions.曼徹斯特大學電腦科學系.[2018-09-09].(原始內容存檔於2018-03-25).  ^新版AndroidSDK寬容處理Kotlin程式碼可空合約違規,給開發者更新的緩衝時間.ithome.com.tw.[2018-09-08].(原始內容存檔於2018-09-09).  ^System.NullReferenceException.msdn.microsoft.com.[2018-09-08].(原始內容存檔於2018-09-09).  取自「https://zh.wikipedia.org/w/index.php?title=空指標&oldid=67945864」



請為這篇文章評分?