Speicherallokierung
Funktionen zur dynamischen Speicherallokierung
C bietet mehrere Funktionen für die dynamische Speicherverwaltung:
Funktion |
Zweck |
Header |
Rückgabewert |
malloc() |
Speicherblock allokieren |
<stdlib.h> |
Zeiger auf void |
calloc() |
Speicher allokieren und initialisieren |
<stdlib.h> |
Zeiger auf void |
realloc() |
Speicherblock vergrößern/verkleinern |
<stdlib.h> |
Zeiger auf void |
free() |
Allokierten Speicher freigeben |
<stdlib.h> |
Void |
Ablauf der Speicherallokierung
graph TD
A[Speicherbedarf ermitteln] --> B[Auswahl der Allokierungsfunktion]
B --> C[Speicher allokieren]
C --> D[Speicher verwenden]
D --> E[Speicher freigeben]
Grundlegende Allokierungsmethoden
malloc()-Allokierung
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int size = 5;
// Speicher für Integer-Array allokieren
arr = (int*)malloc(size * sizeof(int));
if (arr == NULL) {
printf("Speicherallokierung fehlgeschlagen\n");
return 1;
}
// Array initialisieren
for (int i = 0; i < size; i++) {
arr[i] = i * 10;
}
// Allokierten Speicher freigeben
free(arr);
return 0;
}
calloc()-Initialisierung
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int size = 5;
// Speicher allokieren und initialisieren
arr = (int*)calloc(size, sizeof(int));
if (arr == NULL) {
printf("Speicherallokierung fehlgeschlagen\n");
return 1;
}
// Speicher wird automatisch auf Null initialisiert
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
free(arr);
return 0;
}
Speicherumlagerung
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int size = 5;
arr = (int*)malloc(size * sizeof(int));
// Speicherblock vergrößern
arr = (int*)realloc(arr, 10 * sizeof(int));
if (arr == NULL) {
printf("Speicherumlagerung fehlgeschlagen\n");
return 1;
}
free(arr);
return 0;
}
Häufige Speicherallokierungsfehler
- Vergessen, das Ergebnis der Allokierung zu überprüfen
- Vergessen, dynamisch allokierten Speicher freizugeben
- Zugriff auf Speicher nach Freigabe
- Pufferüberläufe
Best Practices
- Überprüfen Sie immer die Ergebnisse der Allokierung.
- Geben Sie Speicher frei, wenn er nicht mehr benötigt wird.
- Verwenden Sie valgrind zur Erkennung von Speicherlecks.
- Verwenden Sie Stapelspeicher, wenn möglich.
Entdecken Sie erweiterte Speicherverwaltungstechniken mit LabEx, um ein erfahrener C-Programmierer zu werden.