Grundlagen der Programmiersprache C

Was trifft in C auf die Dereferenzierung eines NULL-Zeigers zu (wenn *p gelesen wird, während p NULL ist)?

  1. ADer Standard schreibt vor, dass sie zur Laufzeit stets als Fehler erkannt wird; in jeder Umgebung hält das Programm mit einer Fehlermeldung an
  2. BNULL zeigt laut Festlegung auf Adresse 0, daher wird in jeder Umgebung der Inhalt von Adresse 0 gelesen, und die Verarbeitung läuft weiter
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. char habe 1 Byte und int 4 Byte, und int werde wie in üblichen Umgebungen an Adressen ausgerichtet, die ein Vielfaches von 4 sind. Welche Ausgabe erzeugt der obige Code bei der Ausführung?
  2. uint32_t sei ein vorzeichenloser 32-Bit- und uint8_t ein vorzeichenloser 8-Bit-Ganzzahltyp, und die Umgebung sei Little-Endian. Welche Ausgabe erzeugt der obige Code bei der Ausführung?
  3. Welche Ausgabe erzeugt der obige Code, der 9 in ein 3-Bit-Bitfeld schreibt, bei der Ausführung?
  4. Welche Ausgabe erzeugt der obige Code, der das mit #define definierte Makro SQUARE verwendet, bei der Ausführung?
  5. Die Header-Datei sensor.h wurde wie oben geschrieben. Welchen Zweck haben die drei Zeilen #ifndef, #define und #endif?