空指標- 维基百科,自由的百科全书
文章推薦指數: 80 %
此條目介紹的是以各種程式語言為基礎介紹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」
延伸文章資訊
- 1如何在C++ 中檢查指標是否為空指標 - Delft Stack
++ cCopy #include <iostream> using std::cout; using std::endl; #define SIZE 123 int main() { char...
- 2C語言中,空指標NULL會佔記憶體嗎?多少位元組 - 就問知識人
C語言中的空指標是什麼意思,C語言中,空指標NULL會佔記憶體嗎?多少位元組,1樓匿名使用者這樣一看才知道大家對空指標的概念如此渾濁哦首先void 這不 ...
- 3空指標
空(Null) 指標:其值為0,不是指到記憶體位址0 ,而是沒有指到任何的記憶體。 [dywang@dyw219 zzz]$ vim pointer2.c [dywang@dyw219 zzz]...
- 4空指標- 维基百科,自由的百科全书
此條目介紹的是以各種程式語言為基礎介紹Null Pointer的概念。关于C++11語言標準的關鍵字,请见「nullptr」。 在程式語言中,空指標 ...
- 5C語言知識彙總| 56-C語言NULL空指標以及void指標 - IT人
NULL 是“零值、等於零”的意思,在C語言中表示空指標。從表面上理解,空指標是不指向任何資料的指標,是無效指標,程式使用它不會產生效果。