Grundlagen der Programmiersprache C
Was trifft in C auf die Dereferenzierung eines NULL-Zeigers zu (wenn *p gelesen wird, während p NULL ist)?
- ADer Standard schreibt vor, dass sie zur Laufzeit stets als Fehler erkannt wird; in jeder Umgebung hält das Programm mit einer Fehlermeldung an
- BNULL zeigt laut Festlegung auf Adresse 0, daher wird in jeder Umgebung der Inhalt von Adresse 0 gelesen, und die Verarbeitung läuft weiter
- CSie ist undefiniertes Verhalten; unter einem Betriebssystem bricht das Programm meist ab, auf einem Mikrocontroller ohne MMU kann Adresse 0 aber lesbar sein, sodass der Fehler unbemerkt bleibt
Antwort und Erläuterung anzeigen
Antwort: C. Sie ist undefiniertes Verhalten; unter einem Betriebssystem bricht das Programm meist ab, auf einem Mikrocontroller ohne MMU kann Adresse 0 aber lesbar sein, sodass der Fehler unbemerkt bleibt
Die Dereferenzierung eines NULL-Zeigers ist undefiniertes Verhalten; was passiert, legt der Standard nicht fest. Linux und Windows ordnen dem Bereich um Adresse 0 keine Seite zu, daher löst ein Zugriff einen Seitenfehler aus, und das Programm bricht in der Regel ab (unter Linux etwa mit einem Segmentation Fault). Auf einem kleinen Mikrocontroller ohne MMU liegen an Adresse 0 mitunter Flash-Speicher oder die Tabelle der Interrupt-Vektoren, die sich lesen lassen; der Fehler tritt dann nicht zutage, und das Gerät arbeitet fehlerhaft weiter. Wichtig ist, vor der Verwendung eines Zeigers zu prüfen, dass er nicht NULL ist.
Weiter: 9 weitere Fragen zu Grundlagen der Programmiersprache C