程式語言中,空指標[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]

其他语言

编辑

一些语言使用其他的命名方式来表示空指针,如Python使用NoneJavascript使用undefinednullPascal, 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)。

參見

编辑

參考文獻

编辑
  1. ^ 空指標 null pointer. 國家教育研究院. [2018-09-08]. (原始内容存档于2018-09-09). 
  2. ^ 2.0 2.1 Tony Hoare. Null References: The Billion Dollar Mistake. InfoQ.com. 2009-08-25 [2018-09-08]. (原始内容存档于2018-09-04). 
  3. ^ 3.0 3.1 Joint Technical Committee ISO/IEC JTC 1, Subcommittee SC 22, Working Group WG 14. International Standard ISO/IEC 9899 (PDF; Committee Draft). 2007-09-08 [2018-09-08]. (原始内容存档 (PDF)于2018-06-24). 
  4. ^ ISO/IEC 9899[3], clause 6.3.2.3, paragraph 4.
  5. ^ ISO/IEC 9899[3], clause 7.17, paragraph 3: NULL... which expands to an implementation-defined null pointer constant...
  6. ^ NULL pointer in C. [2018-09-09]. (原始内容存档于2018-09-09). 
  7. ^ Stroustrup, Bjarne. Chapter 5: Pointers, Arrays, and Structures: 5.1.1: Zero. The C++ Programming Language 14th printing of 3rd. United States and Canada: Addison–Wesley. March 2001: 88. ISBN 0-201-88954-4. In C, it has been popular to define a macro NULL to represent the zero pointer. Because of C++'s tighter type checking, the use of plain 0, rather than any suggested NULL macro, leads to fewer problems. If you feel you must define NULL. use
        const int NULL = 0;
    The const qualifier (§5.4) prevents accidental redefinition of NULL and ensures that NULL can be used where a constant is required.
     
  8. ^ 8.0 8.1 A name for the null pointer: nullptr (PDF). stroustrup.com. 2003-09-10 [2018-09-09]. (原始内容 (PDF)存档于2017-07-05). 
  9. ^ Elliot B. Koffman, Pascal 3rd Edition, Addison Wesley, Reading MA, ISBN 0-201-11834-3, pp. 678-679
  10. ^ java.lang.NullPointerException. docs.oracle.com. [2018-09-08]. (原始内容存档于2018-09-10). 
  11. ^ Null pointer exceptions. 曼徹斯特大學電腦科學系. [2018-09-09]. (原始内容存档于2018-03-25). 
  12. ^ 新版Android SDK寬容處理Kotlin程式碼可空合約違規,給開發者更新的緩衝時間. ithome.com.tw. [2018-09-08]. (原始内容存档于2018-09-09). 
  13. ^ System.NullReferenceException. msdn.microsoft.com. [2018-09-08]. (原始内容存档于2018-09-09). 

📚 Artikel Terkait di Wikipedia

Plaxton Pointer

Plaxton Pointer (原稱 Reeve Burgess Pointer,後來先後改稱TransBus Pointer 及Alexander Dennis Pointer) 是一款在1990年代生產的單層巴士車身,起初由Plaxton生產,後來改由Transbus/Alexander Dennis生產。

指標 (電腦科學)

在计算机科学中,指標(英語:Pointer),是在许多程式語言中用来存储内存地址的变量。指针变量的值直接指向(points to)存在该地址的对象的值。所指向的可以是计算机内存中的另一个值,或者在某些情况下,是内存映射计算机硬件的值。 在1964年,哈羅德·勞森發明了最早的指標。他在PL/I中實作

IP

智慧財產權(Intellectual Property) 有時候特指跨媒體製作,也称为媒体连锁,一种特许经营连锁 指令指標(Instruction Pointer) 香港警務處督察 IP (複雜度)(英语:IP (complexity)),一种複雜度類 防水防塵等級(Ingress Protection

瑟多米尼克·波因特

瑟多米尼克·丹泽尔·波因特(英語:Sir'Dominic Denzel Pointer,1992年5月6日—)為美國男子籃球運動員。 波因特成長於密西根州底特律,在密西根州羅斯維(英语:Roseville, Michigan)就讀高中兩年,高中最後兩年就讀位於北卡罗来纳州的Quality Education

丹尼士飛鏢巴士

SLF)於1990年代中期面世。1990年代末期,飛鏢SLF更出現其衍生產品,11.3米長的丹尼士飛鏢SPD(Super Pointer Dart)及8.8米長的丹尼士飛鏢MPD(Mini Pointer Dart)。 丹尼士飛鏢系列是丹尼士車廠的一款成功的車款,銷售總數超越12,000輛,常見於英國本土、香港、澳門等地。

Nullptr

C++语言标准规定: 值0或std::nullptr_t类型的纯右值是空指针常量(null pointer constant)。可以通过空指针转换(null pointer conversion)成为某个类型的空指针值(null pointer value)。 C++语言标准还规定,在实参个数多于形参个数时(即可变参

Oberon

MODULE Figures; (* 抽象模块 *) TYPE Figure* = POINTER TO FigureDesc; Interface* = POINTER TO InterfaceDesc; InterfaceDesc* = RECORD draw* : PROCEDURE

指示犬

dogs),有時也被稱為鳥犬(Bird dogs),是一種獵犬類別,通常被用來尋找獵物。 獵犬通常分為三大類:尋回犬、水犬以及指示犬。 「指示犬」(Pointer)這個名稱來自其本能的「指示」動作:牠會停止移動,並將鼻口朝向獵物,藉此告訴獵人獵物的位置,方便獵人靠近至射程範圍。指示犬是由那些具有強烈指示