Antwort

2

Es ist vor allem eine Konvention, und es ist Implementierung spezifisch.

Die Sprache C Standard (C99 oder C11) -und einige andere Programmiersprachen wie Lisp- hat den Begriff des null pointer die dereferenziert werden können (dass undefined behavior wäre, segmentation fault) und unterscheidet sich von jedem anderen Zeiger (um einige gültiger Speicherort). Tony Hoare nannte diesen Begriff bescheidenerweise "my billion dollar mistake", und einige Sprachen (Haskell, Ocaml) haben stattdessen einige tagged unions Typen (z. B. 'a option in Ocaml).

Die meisten Implementierungen (aber nicht alle), um die Null-Zeiger nach Adressen repräsentieren 0.

In der Praxis auf einem Desktop, Laptop oder Tablet, ein User-Mode-C-Programm läuft in einigen virtual address space, wo die Seite die Adresse enthält, 0 ist nicht zugeordnet. (Auf einigen Linux, man könnte vielleicht mmap(2) mit MAP_FIXED die Adresse 0, aber das schlechte Geschmack wäre ...)

In einigen eingebetteten microcontrollers (z AVR), Adresse 0 verwendet werden könnten.

Theoretisch (und in der Vergangenheit), Adressen möglicherweise komplexer als eine Nummer ... (in den 1980er Jahren, zum Beispiel auf x86 memory segmentationi286 und iAPX432 Adressierung Rekursiv Architektur, etc ...)

Lesen Sie mehrere Bücher und Webseiten über C-Programmierung, Mikroprozessorarchitekturen & instruction sets, operating system Prinzipien, virtual memory, MMU s.

1

Bei ausgelagerten Speichersystemen ist es üblich, die erste (nullte) Seite standardmäßig nicht zuzuordnen. Dies ist eine Konvention, die normalerweise vom Linker erzwungen wird. Wenn der Programmlader die ausführbare Datei liest, erhält er nie eine Anweisung zum Zuordnen der ersten logischen Seite.

Der Grund dafür ist, Nullzeigerfehler zu erkennen.

int *whatever = 0 ; 
. . . . 
*whatever = 10 ; 

wird eine Zugriffsverletzung verursachen.

Das heißt, es ist normalerweise möglich, dass ein Prozess die erste (nullte) Seite nach dem Start abbildet und in einigen Fällen können Sie Linker-Optionen angeben, die es erlauben, Programmabschnitte dort zu basieren.