Dynamische Speicherverwaltung in C: calloc, malloc und free erklärt
Dieses Kapitel erklärt die dynamische Speicherverwaltung in C. Die C-Programmiersprache bietet mehrere Funktionen für Speicherallokation und -verwaltung. Diese Funktionen finden sich in der Header-Datei <stdlib.h>.
| Nr. | Funktion & Beschreibung |
|---|---|
| 1 | void *calloc(int num, int size); Diese Funktion allokiert ein Array von num Elementen, von denen jedes eine Größe von size Bytes hat. |
| 2 | void free(void *address); Diese Funktion gibt einen Speicherblock frei, der durch address angegeben wird. |
| 3 | void *malloc(size_t size); Diese Funktion allokiert size Bytes und lässt sie uninitialisiert. |
| 4 | void *realloc(void *address, int newsize); Diese Funktion allokiert Speicher neu und erweitert ihn auf newsize. |
Dynamische Speicherallokation
Beim Programmieren, wenn Sie die Größe eines Arrays kennen, ist es einfach und Sie können es als Array definieren. Zum Beispiel, um den Namen einer Person zu speichern, der maximal 100 Zeichen lang sein kann, können Sie definieren:
char name[100];
Betrachten wir nun eine Situation, in der Sie keine Vorstellung von der Länge des zu speichernden Textes haben, zum Beispiel, Sie möchten eine detaillierte Beschreibung zu einem Thema speichern. Hier müssen Sie einen Zeiger auf char definieren, ohne festzulegen, wie viel Speicher erforderlich ist, und später basierend auf dem Bedarf Speicher allokieren, wie im folgenden Beispiel gezeigt:
Live Demo#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* Speicher dynamisch allokieren */
description = malloc(200 * sizeof(char));
if (description == NULL) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy(description, "Zara ali a DPS student in class 10th");
}
printf("Name = %s\n", name);
printf("Description: %s\n", description);
}
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:
Name = Zara Ali Description: Zara ali a DPS student in class 10th
Dasselbe Programm kann mit calloc() geschrieben werden; Sie müssen lediglich malloc durch calloc ersetzen:
calloc(200, sizeof(char));
So haben Sie die volle Kontrolle und können beliebige Größenwerte bei der Speicherallokation übergeben, im Gegensatz zu Arrays, wo die Größe einmal definiert nicht mehr geändert werden kann.
Speichergröße ändern und freigeben
Wenn Ihr Programm endet, gibt das Betriebssystem automatisch den gesamten von Ihrem Programm allokierten Speicher frei. Aber als gute Praxis sollten Sie Speicher freigeben, wenn Sie ihn nicht mehr benötigen, indem Sie die Funktion free() aufrufen.
Alternativ können Sie die Größe eines allokierten Speicherblocks durch Aufrufen der Funktion realloc() vergrößern oder verkleinern. Überprüfen wir das obige Programm erneut und nutzen realloc() und free():
Live Demo#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* Speicher dynamisch allokieren */
description = malloc(30 * sizeof(char));
if (description == NULL) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcpy(description, "Zara ali a DPS student.");
}
/* Angenommen, Sie möchten eine größere Beschreibung speichern */
description = realloc(description, 100 * sizeof(char));
if (description == NULL) {
fprintf(stderr, "Error - unable to allocate required memory\n");
} else {
strcat(description, "She is in class 10th");
}
printf("Name = %s\n", name);
printf("Description: %s\n", description);
/* Speicher mit free() freigeben */
free(description);
}
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:
Name = Zara Ali Description: Zara ali a DPS student.She is in class 10th
Sie können das obige Beispiel ohne erneute Speicherallokation ausprobieren; die strcat()-Funktion wird einen Fehler aufgrund von fehlendem verfügbarem Speicher in description verursachen.
C Sprache
- ROM, PROM, EPROM und EEPROM verstehen: Design, Programmierung und Identifikation
- Mikroprozessoren: Die Evolution des Stored-Program-Computing
- C++ Speicherverwaltung meistern: Experten-Einsatz von new und delete
- Dynamische Speicherallokation in C: malloc, calloc, realloc & free meistern
- Java-Dokumentationskommentare: Javadoc und Kommentartypen meistern
- C++ Dynamischer Speicher: Stack vs. Heap erklärt
- Java 10: Heap auf alternativen Speicher (NV-DIMM) allozieren – JEP 316
- Das definitive Handbuch der Instandhaltungsmanagement: Praktischer Leitfaden für Führungskräfte
- Asset Management Events 2012: Top Konferenzen, Trainings & Ausstellungen
- 4 zentrale Ziele für effektives Asset Management