Zurück zu: C Tutorial
Speicher neu zuweisen
Wenn der reservierte Speicher nicht ausreicht, können Sie ihn durch Neuzuweisung vergrößern.
Durch die Neuzuweisung wird eine andere (normalerweise größere) Speichermenge reserviert, während die darin gespeicherten Daten erhalten bleiben.
Sie können die Größe des zugewiesenen Speichers mit der Funktion realloc()
ändern.
Die Funktion realloc()
verwendet zwei Parameter:
int *ptr2 = realloc(ptr1, size);
- Der erste Parameter ist ein Zeiger auf den Speicher, dessen Größe geändert wird.
- Der zweite Parameter gibt die neue Größe des zugewiesenen Speichers in Bytes an.
Die Funktion realloc()
versucht, die Speichergröße bei ptr1 zu ändern und dieselbe Speicheradresse zurückzugeben. Wenn die Speichergröße an der aktuellen Adresse nicht geändert werden kann, weist sie Speicher an einer anderen Adresse zu und gibt stattdessen die neue Adresse zurück.
Hinweis: Wenn
realloc()
eine andere Speicheradresse zurückgibt, ist der Speicher an der ursprünglichen Adresse nicht mehr reserviert und kann nicht mehr sicher verwendet werden. Wenn die Neuzuweisung abgeschlossen ist, empfiehlt es sich, den neuen Zeiger der vorherigen Variable zuzuweisen, damit der alte Zeiger nicht versehentlich verwendet werden kann.
Beispiel
Erhöhen Sie die Größe des zugewiesenen Speichers:
int *ptr1, *ptr2, size;
// Allocate memory for four integers
size = 4 * sizeof(*ptr1);
ptr1 = malloc(size);
printf("%d bytes allocated at address %p \n", size, ptr1);
// Resize the memory to hold six integers
size = 6 * sizeof(*ptr1);
ptr2 = realloc(ptr1, size);
printf("%d bytes reallocated at address %p \n", size, ptr2);
NULL Zeiger und Fehlerprüfung
Die Funktion realloc()
gibt einen NULL
Zeiger zurück, wenn sie nicht mehr Speicher zuordnen kann. Das ist sehr unwahrscheinlich, aber Sie sollten es im Hinterkopf behalten, wenn Ihr Code ausfallsicher sein muss.
Das folgende Beispiel prüft, ob realloc()
in der Lage ist, die Speichergröße zu ändern oder nicht, indem es nach einem NULL
Zeiger sucht:
Beispiel
Suchen Sie nach einem NULL Zeiger:
int *ptr1, *ptr2;
// Allocate memory
ptr1 = malloc(4);
// Attempt to resize the memory
ptr2 = realloc(ptr1, 8);
// Check whether realloc is able to resize the memory or not
if (ptr2 == NULL) {
// If reallocation fails
printf("Failed. Unable to resize memory");
} else {
// If reallocation is sucessful
printf("Success. 8 bytes reallocated at address %p \n", ptr2);
ptr1 = ptr2; // Update ptr1 to point to the newly allocated memory
}
Hinweis: Sie sollten bei der Speicherzuweisung immer eine Fehlerprüfung einbeziehen (wenn Zeiger == NULL).
Hinweis: Sie sollten zugewiesenen Speicher auch immer freigeben, wenn Sie ihn nicht mehr benötigen. Dies ist wichtig, um sicherzustellen, dass sich Ihr Programm wie erwartet verhält, und macht es außerdem wartungsfreundlicher und effizienter.
Um Speicher freizugeben, verwenden Sie einfach die Funktion free()
:
Beispiel
Frei zugewiesener Speicher:
// Free allocated memory
free(ptr1);
Im nächsten Kapitel erfahren Sie mehr darüber, wie Sie zugewiesenen Speicher freigeben und warum dies wichtig ist.