Grundlagen der Programmiersprache C

Welche Kombination gibt in C die Zeitspanne (Lebensdauer) richtig an, in der (1) eine in einer Funktion ohne static deklarierte lokale Variable, (2) ein mit malloc reservierter Bereich und (3) eine außerhalb von Funktionen deklarierte Variable existieren?

  1. A(1) bis zum Programmende, (2) bis zur Rückkehr aus der reservierenden Funktion, (3) bis zum Programmende
  2. B(1) bis zum Verlassen des deklarierenden Blocks, (2) bis zur Freigabe mit free, (3) bis zum Programmende
  3. C(1) bis zum Verlassen des deklarierenden Blocks, (2) bis zum Programmende (eine vorherige Freigabe ist nicht möglich), (3) bis zur Rückkehr aus der Funktion, die die Variable zuerst verwendet hat
Antwort und Erläuterung anzeigen

Antwort: B. (1) bis zum Verlassen des deklarierenden Blocks, (2) bis zur Freigabe mit free, (3) bis zum Programmende

Die automatische Variable in (1) liegt in der Regel auf dem Stack, wird beim Eintritt in den deklarierenden Block angelegt und verschwindet beim Verlassen. Der mit malloc reservierte Bereich in (2) liegt auf dem Heap, bleibt auch nach der Rückkehr aus der Funktion bestehen und ist nutzbar, bis er mit free freigegeben wird. Die Variable außerhalb von Funktionen in (3) (wie auch mit static versehene Variablen) existiert während der gesamten Programmausführung und liegt in einem statischen Bereich wie .data oder .bss. Häufige Fehlerursachen sind Zeiger auf Bereiche, deren Lebensdauer abgelaufen ist, und vergessene free-Aufrufe, durch die Bereiche dauerhaft belegt bleiben.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. int habe 32 Bit (Maximalwert 2147483647). Was ist das größte n, für das die obige Funktion fact(n) die Fakultät von n ohne Überlauf korrekt zurückgibt?
  2. int habe 4 Byte und ein Zeiger 8 Byte. Ein Zeiger p auf int hat den Wert (die Adresse) 0x1000. Welchen Wert hat p + 3?
  3. int habe 4 Byte und ein Zeiger 8 Byte. Welche Ausgabe erzeugt das obige Programm bei der Ausführung?
  4. int habe 4 Byte. Welche Ausgabe erzeugt der obige Code bei der Ausführung?
  5. Welche Ausgabe erzeugt der obige Code mit einem char-Array, das eine Zeichenkette enthält, bei der Ausführung?