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ückgegeben
NULL, 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;
}
#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 immer
realloc()den Rückgabewert. Wenn er zurückgibtNULL, verwerfen Sie den ursprünglichen Zeiger nicht direkt. - Speicherleck: wenn
realloc()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, um
realloc()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.