C dynamic memory allocation (tsz. C dynamic memory allocations)
A dinamikus memóriafoglalás lehetővé teszi, hogy egy program futási időben foglaljon le memóriát.
Miért hasznos?
👉 C nyelvben a dinamikus memória heap területen kerül lefoglalásra.
A C szabványos könyvtárban a stdlib.h
tartalmazza a dinamikus memória-kezelő függvényeket:
Függvény | Funkció |
---|---|
malloc()
|
Memória lefoglalása |
calloc()
|
Lefoglal + nulláz |
realloc()
|
Átméretez korábban lefoglalt memóriát |
free()
|
Felszabadít lefoglalt memóriát |
malloc()
Szintaxis:
void* malloc(size_t size);
Használat:
#include <stdlib.h>
int* arr = (int*) malloc(10 * sizeof(int));
if (arr == NULL) {
// Hiba történt
}
malloc
void pointert ad vissza → típuskényszerítés ((int*)
) szükséges.malloc
nem adott-e vissza NULL
-t → ez azt jelenti, hogy nem sikerült a memóriafoglalás.
calloc()
malloc
-hoz, de:
Szintaxis:
void* calloc(size_t num_elements, size_t size_of_element);
Példa:
int* arr = (int*) calloc(10, sizeof(int));
// Minden elem 0-ra inicializált
realloc()
Szintaxis:
void* realloc(void* ptr, size_t new_size);
Példa:
int* arr = (int*) malloc(5 * sizeof(int));
arr = (int*) realloc(arr, 10 * sizeof(int));
// Most már 10 elemnyi hely van
⚠️ Ha realloc
sikertelen → NULL
-t ad vissza, az eredeti arr
érvényes marad.
free()
Szintaxis:
void free(void* ptr);
Példa:
free(arr); // fontos!
arr = NULL; // jó gyakorlat → dangling pointer elkerülése
Nagyon fontos: ha free()
után a pointert nem állítod NULL
-ra, akkor dangling pointer marad → hibás hozzáférés történhet.
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("How many numbers? ");
scanf("%d", &n);
int* arr = (int*) malloc(n * sizeof(int));
if (arr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
for (int i = 0; i < n; i++) {
arr = i * i;
}
for (int i = 0; i < n; i++) {
printf("%d ", arr);
}
free(arr); // felszabadítjuk a memóriát
arr = NULL;
return 0;
}
👉 Statikus memóriafoglalás → int arr;
→ fordítási időben ismert méret.
👉 Dinamikus memóriafoglalás → malloc
, calloc
, realloc
→ futási időben döntjük el a méretet.
👉 Dinamikus memória használata esetén:
free()
!malloc
/calloc
visszatérési értékét (NULL
).realloc
-nál figyelj a hibakezelésre.free()
-zett pointert → dangling pointer.
✅ Maximális rugalmasság → futás közben is tudsz memóriát foglalni. ✅ Nagy adatszerkezetek létrehozhatók dinamikusan (pl. linkelt lista, bináris fa, stb.). ✅ Csak annyi memóriát használsz, amennyire szükséged van.
❌ Bonyolultabb kezelés → kézzel kell felszabadítani. ❌ Hibalehetőség: memory leak, dangling pointer, double free. ❌ Lassabb → heap-hez képest lassabb a hozzáférés, mint a stack-hez.