Grundlagen der Programmiersprache C

int process(int n) {
    int *buf = malloc(n * sizeof(int));
    if (buf == NULL) return -1;
    if (fill(buf, n) != 0)
        return -2;
    use(buf, n);
    free(buf);
    return 0;
}

fill und use seien separat definierte Funktionen. Welches Problem hat die obige Funktion?

  1. AGibt fill einen Wert ungleich 0 zurück, kehrt die Funktion zurück, ohne buf freizugeben, sodass der reservierte Bereich unfreigegeben bestehen bleibt
  2. BDer Rückgabewert von malloc wird nicht geprüft, daher wird bei einer fehlgeschlagenen Reservierung NULL dereferenziert
  3. Cbuf wird nach free verwendet, daher wird auf einen freigegebenen Bereich zugegriffen
Antwort und Erläuterung anzeigen

Antwort: A. Gibt fill einen Wert ungleich 0 zurück, kehrt die Funktion zurück, ohne buf freizugeben, sodass der reservierte Bereich unfreigegeben bestehen bleibt

Ein mit malloc reservierter Bereich bleibt bestehen, bis er mit free freigegeben wird. Auf dem Pfad, auf dem fill fehlschlägt und die Funktion mit return -2 zurückkehrt, wird free nicht aufgerufen, und auch der Wert (die Adresse) in buf geht verloren; der Bereich kann daher nie mehr freigegeben werden. Das nennt man ein Speicherleck. Wird die Funktion wiederholt aufgerufen, schrumpft der verfügbare Speicher immer weiter, was besonders bei lange laufenden Embedded-Geräten und Servern zum Problem wird. Abhilfe schafft ein Aufruf von free(buf) vor der Rückkehr oder das Zusammenfassen der Freigabe an einer einzigen Stelle am Ende der Funktion.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. Was trifft auf den Zeiger zu, den die obige Funktion make zurückgibt?
  2. Warum wird in C empfohlen, unmittelbar nach free(p); die Anweisung p = NULL; zu schreiben?
  3. Der obigen Funktion save wird die Zeichenkette "ABCDEFGH" mit 8 Zeichen übergeben. Was passiert?
  4. Was trifft in C auf die Dereferenzierung eines NULL-Zeigers zu (wenn *p gelesen wird, während p NULL ist)?
  5. 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?