Malloc: Unterschied zwischen den Versionen
PhilKa (Diskussion | Beiträge) Die Seite wurde neu angelegt: „= malloc (C-Funktion) = Die Funktion '''malloc()''' (*memory allocation*) gehört zur Standardbibliothek der Programmiersprache C und dient der '''dynamischen Speicherreservierung''' während der Programmlaufzeit. Sie wird in der Header-Datei <code><stdlib.h></code> deklariert. == Zweck == Im Gegensatz zu statischen Variablen (die beim Kompilieren eine feste Größe haben) ermöglicht '''malloc()''', Speicher dynamisch zur Laufzeit aus dem '''He…“ |
PhilKa (Diskussion | Beiträge) |
||
| (Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
= malloc (C-Funktion) = | = malloc (C-Funktion) = | ||
Die Funktion '''malloc()''' ( | Die Funktion '''malloc()''' (''memory allocation'') gehört zur Standardbibliothek der Programmiersprache C und dient der '''dynamischen Speicherreservierung''' während der Programmlaufzeit. | ||
Sie wird in der Header-Datei <code><stdlib.h></code> deklariert. | Sie wird in der Header-Datei <code><stdlib.h></code> deklariert. | ||
| Zeile 19: | Zeile 19: | ||
== Parameter == | == Parameter == | ||
* '''size''' – Anzahl der '''Bytes''', die reserviert werden sollen. | * '''size''' – Anzahl der '''Bytes''', die reserviert werden sollen. | ||
** Der Datentyp <code>size_t</code> ist ein ganzzahliger Typ, der für Speichergrößen verwendet wird. | |||
== Rückgabewert == | == Rückgabewert == | ||
Aktuelle Version vom 21. Oktober 2025, 12:46 Uhr
malloc (C-Funktion)
Die Funktion malloc() (memory allocation) gehört zur Standardbibliothek der Programmiersprache C und dient der dynamischen Speicherreservierung während der Programmlaufzeit.
Sie wird in der Header-Datei <stdlib.h> deklariert.
Zweck
Im Gegensatz zu statischen Variablen (die beim Kompilieren eine feste Größe haben) ermöglicht malloc(), Speicher dynamisch zur Laufzeit aus dem Heap anzufordern. Dies ist besonders nützlich, wenn die benötigte Speichergröße erst während der Programmausführung bekannt ist – etwa bei Benutzereingaben, dynamischen Arrays oder verketteten Listen.
---
Syntax
#include <stdlib.h>
void* malloc(size_t size);
Parameter
- size – Anzahl der Bytes, die reserviert werden sollen.
- Der Datentyp
size_tist ein ganzzahliger Typ, der für Speichergrößen verwendet wird.
- Der Datentyp
Rückgabewert
- Gibt einen Zeiger (void*) auf den Anfang des reservierten Speicherbereichs zurück, falls die Zuweisung erfolgreich war.
- Gibt NULL zurück, wenn der Speicher nicht zugewiesen werden konnte (z. B. bei Speichermangel).
---
Beispiel: Einfacher Speicherblock
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr;
// Speicher für 10 int-Werte reservieren
ptr = (int*) malloc(10 * sizeof(int));
if (ptr == NULL) {
printf("Fehler: Speicher konnte nicht zugewiesen werden.\n");
return 1;
}
// Speicher verwenden
for (int i = 0; i < 10; i++) {
ptr[i] = i * 2;
printf("ptr[%d] = %d\n", i, ptr[i]);
}
// Speicher wieder freigeben
free(ptr);
return 0;
}
Ausgabe:
ptr[0] = 0 ptr[1] = 2 ptr[2] = 4 ... ptr[9] = 18
---
Verwendungshinweise
1. Typumwandlung (Cast)
In C ist ein expliziter Typ-Cast beim Rückgabewert von malloc() **nicht erforderlich** (und teils unerwünscht):
// Empfohlen:
int* ptr = malloc(10 * sizeof(int));
Ein Cast ist nur in C++ nötig:
int* ptr = (int*) malloc(10 * sizeof(int)); // in C++ erforderlich
---
2. Speicherfreigabe mit free()
Der mit malloc() angeforderte Speicher muss mit free() wieder freigegeben werden, um Speicherlecks zu vermeiden:
free(ptr);
ptr = NULL; // optional, um Dangling Pointer zu vermeiden
---
3. Initialisierung des Speichers
Der von malloc() bereitgestellte Speicher ist **nicht initialisiert** – der Inhalt ist undefiniert.
Wenn du den Speicher automatisch mit Nullen füllen möchtest, verwende stattdessen:
calloc()– für nullinitialisierten Speichermemset()– zum nachträglichen Setzen von Werten
Beispiel:
int* ptr = calloc(10, sizeof(int)); // automatisch mit 0 belegt
---
4. Fehlerbehandlung
Wenn malloc() keinen Speicher mehr findet, liefert es NULL.
Beispiel:
int* p = malloc(1000000000000);
if (p == NULL) {
fprintf(stderr, "Speicherzuweisung fehlgeschlagen!\n");
exit(EXIT_FAILURE);
}
---
5. Reallokation mit realloc()
Wenn du später mehr (oder weniger) Speicher benötigst, kannst du den vorhandenen Bereich mit realloc() anpassen:
int* p = malloc(5 * sizeof(int));
p = realloc(p, 10 * sizeof(int));
---
Beispiel: Dynamisches Array
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("Wie viele Zahlen? ");
scanf("%d", &n);
int* arr = malloc(n * sizeof(int));
if (arr == NULL) {
printf("Fehler bei Speicherzuweisung\n");
return 1;
}
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
printf("Eingegebene Zahlen:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
free(arr);
return 0;
}
---
Typische Fehlerquellen
- Vergessen von
free()→ Speicherleck - Zugriff außerhalb des reservierten Bereichs → undefiniertes Verhalten
- Verwendung nach
free()→ Dangling Pointer - Keine Prüfung auf
NULLnachmalloc()
---
Verwandte Funktionen
- calloc (C-Funktion) – wie malloc(), aber initialisiert mit Nullen
- realloc (C-Funktion) – verändert die Größe eines reservierten Bereichs
- free (C-Funktion) – gibt Speicher wieder frei
- memset (C-Funktion) – schreibt Werte in Speicherbereiche
---
Siehe auch
- Heap (Speicherverwaltung)
- Zeiger (C)
- Dynamische Speicherverwaltung
- calloc (C-Funktion)
- realloc (C-Funktion)
- free (C-Funktion)
Quellen
- ISO/IEC 9899:2018 (C18) – Programming Language C
- Kernighan, Brian W.; Ritchie, Dennis M.: The C Programming Language. Prentice Hall, 1988.
- GNU C Library Documentation
- man 3 malloc