C-Bibliotheksfunktionen -realloc()

C-Standardbibliothek - <stdlib.h>

realloc() ist eine Funktion in der C-Standardbibliothek, die verwendet wird, um Speicherplatz neu zuzuweisen. Sie ist sehr wichtig in der dynamischen Speicherverwaltung, insbesondere wenn die Größe des zugewiesenen Speichers angepasst werden muss.

C-Bibliotheksfunktionenvoid *realloc(void *ptr, size_t size)Versuchen Sie, vor dem Aufruf vonmallocodercalloc anzupassenZugewiesenptrDie Größe des Speicherblocks, auf den gezeigt wird.

Deklaration

Nachfolgend finden Sie die Deklaration der Funktion realloc():

void *realloc(void *ptr, size_t size)

Parameter

  • ptr-- ptr zeigt auf einen Speicherblock, der neu zugewiesen werden soll und der zuvor durch Aufruf von malloc, calloc oder realloc zugewiesen wurde. Wenn es ein Nullzeiger ist, wird ein neuer Speicherblock zugewiesen, und die Funktion gibt einen Zeiger darauf zurück.
  • size-- Die neue Größe des Speicherblocks in Bytes. Wenn die Größe 0 ist und ptr auf einen vorhandenen Speicherblock zeigt, wird der Speicherblock, auf den ptr zeigt, freigegeben, und ein Nullzeiger wird zurückgegeben.

Rückgabewert

  • Bei Erfolg,realloc()Gibt einen Zeiger auf den neuen Speicherblock zurück.
  • Wenn es fehlschlägt, wird zurückgegebenNULL, und der ursprüngliche Speicherblock bleibt unverändert (nicht freigegeben).

Verwendungshinweise

  • realloc()Es kann den Speicherblock an eine neue Position verschieben (wenn am ursprünglichen Ort nicht genügend Speicherplatz vorhanden ist, um die neue Größe aufzunehmen). Wenn das Verschieben erfolgreich ist,ptrzeigt er auf die neue Position. Besondere Aufmerksamkeit ist erforderlich: der alteptrDer Zeiger muss aktualisiert werden aufrealloc()die zurückgegebene neue Adresse.
  • Wenn die Speicherzuweisung fehlschlägt,realloc()returnNULL, und der ursprüngliche Speicherblock wird nicht freigegeben. Um Speicherlecks zu vermeiden, sollte ein temporärer Zeiger verwendet werden, umrealloc()den Rückgabewert zu empfangen und zu prüfen, ob erNULL。

Beispiel

Das folgende Beispiel demonstriert die Verwendung der Funktion realloc().

Beispiel 1

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *str; /*Anfängliche Speicherzuweisung*/ str = (char *) malloc(15); strcpy(str, "example"); printf("Zeichenkette = %s, Adresse = %p\n", str, str); /*Speicher neu zuweisen*/ str = (char *) realloc(str, 25); strcat(str, ".com"); printf("Zeichenkette = %s, Adresse = %p\n", str, str); free(str); return(0); }

Lassen Sie uns das obige Programm kompilieren und ausführen, was das folgende Ergebnis erzeugt:

String = example,  Address = 0x7fa2f8c02b10
String = example.com,  Address = 0x7fa2f8c02b10

Beispiel 2

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *arr = malloc(5 * sizeof(int));  // Speicher für 5 Ganzzahlen reservieren

    if (arr == NULL) {
        printf("Speicherallokation fehlgeschlagen\n");
        return 1;
    }

    // Das Array füllen
    for (int i = 0; i < 5; i++) {
        arr[i] = i * 2;
    }

    // Speicher neu zuweisen, um 10 Ganzzahlen aufzunehmen
    int *new_arr = realloc(arr, 10 * sizeof(int));

    if (new_arr == NULL) {
        printf("Neuzuweisung fehlgeschlagen\n");
        free(arr);  // Bei Fehlschlag den ursprünglichen Speicher freigeben
        return 1;
    }

    // Den neuen Teil füllen
    for (int i = 5; i < 10; i++) {
        new_arr[i] = i * 2;
    }

    // Das neue Array ausgeben
    for (int i = 0; i < 10; i++) {
        printf("%d ", new_arr[i]);
    }

    free(new_arr);  // Schließlich den Speicher freigeben
    return 0;
}

Hinweise

  • Prüfen Sie den Rückgabewert: Prüfen Sie immerrealloc()den Rückgabewert. Wenn er zurückgibtNULL, verwerfen Sie den ursprünglichen Zeiger nicht direkt.
  • Speicherleck: wennrealloc()returnNULL, wird der ursprüngliche Speicherblock nicht freigegeben. An diesem Punkt sollte der ursprüngliche Speicher freigegeben und eine Fehlerbehandlung durchgeführt werden.
  • Zeigerinvalidierung: Wenn Sie den ursprünglichen Zeiger direkt verwenden, umrealloc()den zurückgegebenen neuen Zeiger zu empfangen, was Speicherlecks verursachen kann, insbesondere wennrealloc()es fehlschlägt. Daher ist es üblich, zuerst einen temporären Zeiger zu verwenden, um den Rückgabewert zu empfangen.

Übliche Verwendungen

  • Die Größe von Arrays oder anderen Datenstrukturen dynamisch erweitern.
  • Wird verwendet, um zur Laufzeit Datenmengen variabler Größe zu verarbeiten, wie dynamisch generierte Listen, Strings oder Caches usw.

C-Standardbibliothek - <stdlib.h>

Weitere Erweiterungen