Reallocate Memory

0

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.

Nach oben scrollen