ヌルポインタ

ヌルポインタ: null pointer 英語: [nʌl pɔɪntə(ɹ)])とは、何のオブジェクトも指していないことを表す特別なポインタの値である。

プログラムではヌルポインタを、不定長のリストの終端を表したり、何らかの動作の結果が失敗であることを表したりするのに使用する。後者の用法は、nullable型オプション型Nothing 値(None 値)を使用することもできる。

ヌルポインタの値やがいかなるものかという詳細は言語によって異なる。実際的にはいかなるオブジェクトも参照しないという言語もあり、参照先を求めようとするとJavaNullPointerException)のように例外が発生するものもある。

ヌルポインタはほとんどの処理系(この場合、言語処理系プログラムだけではなく、ハードウェアまでを含めて)で、内部的に数値0で表現されるが、ごく希に、0でない処理系もある。言語仕様上の意味としては普通「アドレス0(あるいは他のアドレス)を指し示すポインタ」ではなく、どこも指し示さないものとされる。

ヌルポインタを未初期化のポインタと混同してはならない。ヌルポインタは、あらゆる有効なオブジェクトとも異なることが保証されている。それに対し、言語や実装によっては、未初期化のポインタはそのような保証はなく、C言語の自動変数のようにでたらめなアドレス(不定値)を指している可能性もある。

ヌルポインタはヌル値とは意味が違う。ヌルポインタは多くのプログラミング言語において「値がない (no value)」ことを意味し、ヌル値はリレーショナルデータベースにおいて「未詳値 (unknown value)」であることを意味する。ほとんどのプログラミング言語では2つのヌルポインタは等しいが、リレーショナルデータベースエンジンは2つのヌル値を等しいとはみなさない(それらは未詳値を表しているので、それらが等しいかどうかはわからない)。

C言語

C言語では、すべての型の2つのヌルポインタは等しいことが保証されている[1]。また、マクロ NULL が処理系定義のヌルポインタ定数 (null pointer constant) に展開されるものと規定されている[2]C89/C90 (ISO/IEC 9899:1990) や C99 (ISO/IEC 9899:1999) では、NULL はヌルポインタ定数を表現するマクロとして定義され、多くの実装においてヌルポインタ定数は整数定数の 0 もしくは 0 を汎用ポインタ void * に型キャストしたものとして定義されている[3]C23 (ISO/IEC 9899:2024) ではキーワード nullptr がヌルポインタを表す、左辺値とならない定数値として追加され、その型も nullptr_t として追加される予定である。規格上は、依然としてマクロNULLは処理系定義のヌルポインタ定数に展開されるものであることには変わりない[4]が、nullptrに展開される実装がありえることになる[3]

C言語における汎用ポインタ型はあらゆるポインタ型に暗黙的変換可能となっているため、ポインタ型変数にNULLを代入する際は型キャストの記述が不要となる。POSIX.1-2008 では整数定数の 0 ではなく、0 を void * に型キャストした物、(void *) 0 でなければならないと定義していて、rationale にて、整数の 0 ではあってはならないと、その定義の差を明記している[5]。よって、ほぼ全ての標準Cライブラリは NULL(void *) 0 としている。そして、C89, C99 では、ヌルポインタ定数を、(void * 以外を含めた)ポイント型に型キャストした物をヌルポインタと定義している。ほとんどの実装はそのまま変換するが、C89, C99 の仕様では、整数からポインタ、ポインタから整数への型キャストがどのような結果になるかは実装依存と明記されていて、ポインタに 0 や NULL を代入したときに、ほとんどのコンパイラは数値の 0 を代入したというコンパイル結果を生成するが、数値の 0 以外を代入するというコンパイル結果を生成しても良いという仕様になっている[6]。整数の 0 をポインタにキャストするとヌルポインタとなることは規定されているが、ヌルポインタを整数にキャストしても 0 になることは規定されていない。存在するオブジェクトや関数へのポインタはヌルポインタであってはならないと規定されている。近年[いつ?]はほとんど無いが、歴史的には、ヌルポインタを 0 以外で表現することもあった[7][8]

ヌルポインタを参照して、そのメモリアドレスに読み書きしようとすると、それは何も指していないため、メモリ保護の仕組みが存在する実行環境では、通常セグメンテーション違反やアクセス違反が発生する。この場合、Unix系ではシグナルWindowsでは構造化例外処理による例外が生成され、特に対処しなければ当該のプロセスは異常終了(クラッシュ)となる。一方、メモリ保護のない実行環境、例えばx86のリアルモードでは、アドレス0000:0000は読み書きが可能であり、ヌルポインタを参照したメモリアクセスは成功しクラッシュはしないものの、不定の期待しない動作になる。ただし、ヌルポインタへの参照があえて定義されている場合もある。例えば、16ビットのリアルモードx86デバイスのためにCで記述されたBIOSコードは、ヌルポインタを参照することにより、物理アドレス0にInterrupt Descriptor Table英語版(IDT) を書く場合がある。ヌルポインタの参照をしないようにコンパイラが最適化することもできる。それにより、セグメンテーション違反を避けられるが、他の望ましくないふるまいを引き起こす。

C++

C++では、C言語よりも型チェックが厳密になり、汎用ポインタvoid *をあらゆるポインタ型に暗黙的変換することが不可能になった。代わりに、整数リテラル 0 がヌルポインタ定数を意味するという仕様になった[9]。C言語からの移植を容易にするためなどの目的で、NULLマクロ自体は依然として標準ヘッダーで定義され、実装定義のヌルポインタ定数に展開される仕様となっているが[10]、前述の理由から#define NULL ((void*)0)と定義してしまうと、void*以外のポインタに代入する際は明示的な型キャストが必要になるため、C言語とは異なり整数リテラル0に展開される実装となっていることが多い。Cと共有されるヘッダーでは、通例__cplusplusの定義有無でNULLの定義が切り替わる実装となっている。

ただし、整数リテラル 0 をヌルポインタとみなすという仕様は、関数オーバーロードやテンプレート関連でしばしば問題を引き起こす結果となった。C++11では代替として、std::nullptr_tという型を持ち、明確にヌルポインタであることを表すnullptrリテラルが導入された[11]。C++11以降でもNULLマクロは引き続き利用可能だが、整数リテラル0に展開される実装とは限らず、nullptrに展開される実装もありえる[12]

その他の言語

Pascalでは綴り記号[13] nil である。nil は、空の値を表す[14]

そのほかにも参照型の概念を持つ言語には、用語やキーワードこそ違えど同様なものが存在する。例えばJavaC#ではnullC++/CLIおよびC++11ではnullptrVisual BasicおよびVisual Basic .NETではNothingPythonではNoneObjective-CRubyではnilREALbasicではNilがヌルポインタに相当するキーワードである。ポインタではなく参照を利用する言語の場合、概念上ヌルポインタに相当するものはヌル参照 (null reference) と呼ばれる。

歴史

2009年にアントニー・ホーアは、彼が1965年にALGOL Wの一部としてヌル参照を発明したと述べている[15]。2009年のカンファレンスでホーアはこの発明を「10億ドルの誤り」と述べた。

それは10億ドルにも相当する私の誤りだ。null参照を発明したのは1965年のことだった。当時、私はオブジェクト指向言語 (ALGOL W) における参照のための包括的型システムを設計していた。目標は、コンパイラでの自動チェックで全ての参照が完全に安全であることを保証することだった。しかし、私は単にそれが容易だというだけで、無効な参照を含める誘惑に抵抗できなかった。これは、後に数え切れない過ち、脆弱性、システムクラッシュを引き起こし、過去40年間で10億ドル相当の苦痛と損害を引き起こしたとみられる。

脚注

  1. ^ ISO/IEC 9899, §6.3.2.3, ¶4: Conversion of a null pointer to another pointer type yields a null pointer of that type. Any two null pointers shall compare equal.
  2. ^ ISO/IEC 9899, §7.17, ¶3: NULL... which expands to an implementation-defined null pointer constant...
  3. ^ a b NULL - cppreference.com (C)
  4. ^ ISO/IEC 9899:2024 (en) — N3220 working draft, §7.21, ¶4
  5. ^ stddef.h - standard type definitions - The Open Group Base Specifications Issue 7
  6. ^ Can a conforming C implementation #define NULL to be something wacky - Stack Overflow
  7. ^ comp.lang.c FAQ list - Question 5.17
  8. ^ C FAQ 5.17 ヌルポインターに0以外の値を使用するマシンや、異なる型のポインターに異なる内部形式を持つマシンは本当に存在するのか。”. C言語 FAQ 日本語訳. 2021年4月12日閲覧。
  9. ^ Stroustrup, Bjarne (March 2001). “Chapter 5: Pointers, Arrays, and Structures: 5.1.1: Zero”. The C++ Programming Language英語版 (14th printing of 3rd ed.). United States and Canada: Addison–Wesley. p. 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."
     
  10. ^ ISO/IEC 14882:1998, C.2.2.3 Macro NULL
  11. ^ nullptr - cpprefjp C++日本語リファレンス
  12. ^ NULL - cppreference.com (C++)
  13. ^ word symbol、すなわち予約語。『PASCAL 原書第4版』§1.2
  14. ^ 『PASCAL 原書第4版』§8.1
  15. ^ Tony Hoare (2009年8月25日). “Null References: The Billion Dollar Mistake”. InfoQ.com. 2016年3月9日閲覧。

外部リンク

Read other articles:

Gereja Kristen Jawa Salatiga Timur Pepanthan Nyamat. Gereja Kristen Jawa Salatiga Timur Pepanthan Nyamat adalah gereja di bawah naungan sinode Gereja Kristen Jawa yang berada di Jalan Raya Salatiga–Dadapayam km. 3, Dusun Pandansari, Desa Nyamat, Kecamatan Tengaran, Kabupaten Semarang, Provinsi Jawa Tengah.[1][2] Lihat pula Gereja Isa Almasih Duren Rujukan ^ Gereja Kristen Jawa Salatiga Timur Pepanthan Nyamat. Gereja Kristen Jawa Salatiga Timur. Diarsipkan dari versi asli tan...

 

Fœderatio Internationalis JuventutemAbbreviationF.I.J.Formation24 May 2006; 17 years ago (2006-05-24)LocationKirchbergerstrasse 42Bern, SwitzerlandCoordinates46°56′17″N 7°25′22″E / 46.938193°N 7.422684°E / 46.938193; 7.422684PresidentHenry WalkerAffiliationsRoman Catholic ChurchWebsitewww.juventutem.org Juventutem (Latin: Fœderatio Internationalis Juventutem) is an international movement of young Roman Catholics of the ages 18 to 39 who...

 

Voce principale: Associazione Calcio Mantova. Associazione Calcio MantovaStagione 1966-1967 Sport calcio Squadra Mantova Allenatore Giancarlo Cadé Presidente Andrea Zenesini Serie A9º Coppa ItaliaPrimo turno Maggiori presenzeCampionato: Spanio, Zoff (34)Totale: Spanio, Zoff (35) Miglior marcatoreCampionato: Di Giacomo (6)Totale: Di Giacomo (6) StadioStadio Danilo Martelli 1965-1966 1967-1968 Si invita a seguire il modello di voce Questa voce raccoglie le informazioni riguardanti l'...

انتشار اللوفيون كان اللوفيون شعبًا تاريخيًا يُعزى إلى آسيا الصغرى وشمال سوريا خلال العصر البرونزي والعصر الحديدي. تحدثوا اللغة اللوفية، وهي لغة هندية أوروبية تابعة للفرع الأناضولي، واستخدموا الهيروغليفية الخاصة بهم، والتي كانت تستخدم جزئيًا أيضًا من قبل الحثيين. تاريخ �...

 

Empress XiaoshuruiEmpress consort of the Qing dynastyTenure12 February 1796 – 5 March 1797PredecessorEmpress NaraSuccessorEmpress XiaoheruiBorn(1760-10-02)2 October 1760(乾隆二十五年 八月 二十四日)Died5 March 1797(1797-03-05) (aged 36)(嘉慶二年 二月 七日)Forbidden City, BeijingBurialChang Mausoleum, Western Qing tombsSpouse Jiaqing Emperor ​ ​(m. 1774⁠–⁠1797)​IssueSecond daughterDaoguang EmperorPrincess Zhuangji...

 

Campeonato Brasileiro de 2013 - Série C Brasileirão 2013 - Série C Dados Participantes 21 Organização CBF Período 1 de junho – 1 de dezembro Gol(o)s 514 Partidas 214 Média 2,4 gol(o)s por partida Campeão Santa Cruz (1º título) Vice-campeão Sampaio Corrêa Promovido(s) Santa Cruz Sampaio Corrêa Luverdense Vila Nova Rebaixado(s) Brasiliense Betim Grêmio Barueri Baraúnas Rio Branco-AC Melhor marcador Assisinho (Fortaleza) – 12 gols Melhor ataque (fase inicial) Fortaleza – 38...

Controls imposed by a government on the purchase/sale of foreign currencies This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Foreign exchange controls – news · newspapers...

 

Romani subgroup in the UK Ethnic group Romanichal Travellers/GypsiesRomanichalA Gypsy Girl by George Elgar Hicks (1899)Regions with significant populations United KingdomNo reliable numbers; UK census data gives fewer than 58,000, though this may be unreliable[1] United States164,000 (estimate) South Africa14,000 (estimate) Australia6,600 (estimate) Canada3,900 (estimate) New Zealand1,500 (estimate)LanguagesEnglish and AngloromaniReligionMajority:Christia...

 

St Margaret Westminster redirects here. For the church in the grounds of Westminster Abbey, see St Margaret's, Westminster. St Margaret and St JohnSt Margaret (until 1727)Westminster District (1855–1887)Civil parishArea • 1881815 acres (3.30 km2) • 1901766 acres (3.10 km2) • 1921767 acres (3.10 km2) • Coordinates51°29′58″N 0°08′00″W / 51.4995°N 0.1333°W / 51.4995; -0.1333 Population •&#...

Suburb of Cape Town, in Western Cape, South Africa Place in Western Cape, South AfricaParklandsParklandsShow map of Western CapeParklandsShow map of South AfricaCoordinates: 33°48′52″S 18°30′09″E / 33.81444°S 18.50250°E / -33.81444; 18.50250CountrySouth AfricaProvinceWestern CapeMunicipalityCity of Cape TownMain PlaceBloubergGovernment • CouncillorMeisie Sarah Makuwa (Ward 104) (ANC) Jonathan Mills (DA) (Ward 107)Area[1] • To...

 

Artikel ini bukan mengenai Organisasi untuk Kerja Sama dan Pembangunan Ekonomi. Organisasi Kerja Sama Ekonomi Persia:سازمان همکاری اقتصادیUrdu:اقتصادی تعاون تنظیمTurki:Ekonomik İşbirliği TeşkilatıAzerbaijan:İqtisadi Əməkdaşlıq TəşkilatıUzbek:Iqtisodiy Hamkorlik TashkilotiTajik:Ташкилоти ҳамкории иқтисодӣKazakh:Экономикалық ынтымақтастық ұйымы Logo Semboyan: Sustainable socioeconomic de...

 

Fédération Béninoise de FootballDisciplina Calcio Fondazione1962 Nazione Benin ConfederazioneFIFA (dal 1962)CAF (dal 1969) Presidente Moucharafou Anjorin Sito ufficialefebefoot.org Modifica dati su Wikidata · Manuale La Federazione calcistica del Benin (fra. Fédération Béninoise de Football; arabo اتحاد بنين لكرة القدم, acronimo FBF) è l'ente che governa il calcio in Benin. Fondata nel 1962, si affiliò alla FIFA nello stesso anno e alla CAF nel 1969. Ha se...

Régine Crespin pada 1987 Abu jenazah Régine Crespin di Krematorium-kolumbarium Père-Lachaise (divisi 87, kotak 40 499) Régine Crespin merupakan seorang penyanyi Prancis (sopran dramatik), lahir 23 Februari 1927 di Marseille (Bouches-du-Rhône) dan meninggal 5 Juli 2007 di Clichy (Hauts-de-Seine). Unggul dalam repertoar Prancis dan Jerman, ia memiliki karier internasional di bawah arahan dirigen seperti Georg Solti atau Herbert von Karajan. Crespin lahir di Marseille pada 1927. Dia pindah ...

 

Le tournage consiste à réaliser des pièces dont les formes sont issues d'une révolution d'un profil autour d'un axe, créant un volume tel un cylindre, un cône, un tore, ou des formes plus complexes : toupie, bol, quille etc. Le repoussage et le fluotournage permettent de donner forme à une feuille métallique plane, le flan, ou à une motte de terre par déformation plastique, sans enlèvement de matière. Le tournage mécanique, procédé d'usinage, réalise les pièces par enlè...

 

Vector space V equipped with a linear map V → V ⊗ V In mathematics, coalgebras or cogebras are structures that are dual (in the category-theoretic sense of reversing arrows) to unital associative algebras. The axioms of unital associative algebras can be formulated in terms of commutative diagrams. Turning all arrows around, one obtains the axioms of coalgebras. Every coalgebra, by (vector space) duality, gives rise to an algebra, but not in general the other way. In finite dimensions, th...

Rivalry between the UMD Terrapins and the UVA Cavaliers This article is about the college soccer (association football) rivalry. For the college football (American football) rivalry, see Maryland–Virginia football rivalry. Maryland-Virginia men's soccer rivalry Maryland Terrapins Virginia Cavaliers SportCollege soccerFirst meetingOctober 8, 1941Maryland 12, Virginia 0Latest meetingSeptember 4, 2023Virginia 2, Maryland 1Next meetingSeptember 2024StatisticsMeetings total85All-time seriesMaryl...

 

تاريخ النيجرمعلومات عامةالمنطقة نيجيريا التأثيراتأحد جوانب نيجيريا تعديل - تعديل مصدري - تعديل ويكي بيانات تاريخ النيجر منذ عصور ما قبل التاريخ حتى الوقت الحاضر. النجير ما قبل التاريخ عاش البشر في النيجر الحالية منذ أقدم العصور. عُثر على بقايا أسترالوبيثكس باهريلغزالي ال�...

 

亀田医療大学 大学設置 2012年創立 1954年学校種別 私立設置者 学校法人鉄蕉館本部所在地 千葉県鴨川市横渚462番地北緯35度6分6秒 東経140度6分0秒 / 北緯35.10167度 東経140.10000度 / 35.10167; 140.10000座標: 北緯35度6分6秒 東経140度6分0秒 / 北緯35.10167度 東経140.10000度 / 35.10167; 140.10000キャンパス 横渚キャンパス(千葉県鴨川市横渚)東町キャンパ�...

Legal rules pertaining to familial relationships South African family law is concerned with those legal rules in South Africa which pertain to familial relationships.[1] It may be defined as that subdivision of material private law which researches, describes and regulates the origin, contents and dissolution of all legal relationships between: (i) husband and wife (including the parties to a civil union); (ii) parents, guardians (and other holders of parental rights and responsibilit...

 

Austrian actor and singer (1850–1918) Alexander Girardi Alexander Girardi (pronounced [dʒiˈrardi]) (5 December 1850 – 20 April 1918) was an Austrian actor and tenor singer in operettas. Career Girardi was born in Graz; his father was the locksmith Andreas Girardi who had migrated to Graz from Cortina d'Ampezzo. Following the early death of his father, Alexander Girardi was raised by his stepfather who put him into a locksmith apprenticeship. Against his stepfather's wishes, he j...