Xotira Boshqaruvi va Dinamik Xotira Boshqaruvi.
Last updated
Last updated
Dinamik xotira boshqaruvi — bu dastur ishlayotganda, ya'ni runtime davomida xotira ajratish va uni bo'shatish imkonini beruvchi jarayon. Bu usul orqali dastur kerak bo'lganda xotira ajratishi va undan foydalanishi mumkin, bu esa ko'proq moslashuvchanlik va samaradorlikni ta'minlaydi. C dasturlash tilida dinamik xotira boshqaruvi uchun stdlib.h kutubxonasidagi quyidagi funksiyalardan foydalanamiz:
malloc(): Ma'lum bir hajmda xotira ajratadi.
calloc(): N ta element uchun xotira ajratadi va barcha joylarni nolga tenglaydi.
realloc(): Avval ajratilgan xotira hajmini o'zgartiradi.
free(): Ajratilgan xotirani bo'shatadi.
malloc() (memory allocation) funksiyasi dinamik xotira ajratish uchun ishlatiladi. Bu funksiyadan ajratilgan xotira "heap" da saqlanadi va dastur tomonidan qo‘llaniladi. malloc() funksiyasi ajratilgan xotira blokining manzilini qaytaradi.
Sintaksis:
size — ajratiladigan xotira hajmi (baytlarda).
return — ajratilgan xotira manzilini ko'rsatadi.
Misol: malloc() yordamida xotira ajratish
int *arr;
— bu ko'rsatkichni e'lon qilamiz. U massivning xotira manzilini saqlaydi.
arr = (int*) malloc(n * sizeof(int));
— malloc() funksiyasi yordamida 5 ta butun son uchun xotira ajratamiz. Bu xotira hajmi n * sizeof(int)
bo'lib, har bir butun son uchun xotira ajratiladi.
if (arr == NULL)
— agar malloc() xotira ajrata olmasa, u holda NULL qaytariladi va dastur xato xabari bilan to'xtaydi.
arr[i] = i + 1;
— ajratilgan xotiraga qiymatlar beramiz. Bu erda har bir element 1 dan boshlab to'ldiriladi.
printf("%d ", arr[i]);
— ajratilgan xotira elementlarini ekranga chiqaramiz.
free(arr);
— ajratilgan xotirani bo'shatamiz. Har bir ochilgan xotira bo'shatilishi kerak.
calloc() (clear allocation) funksiyasi ham dinamik xotira ajratish uchun ishlatiladi, ammo u ajratilgan xotirani nol qiymatlar bilan initsializatsiya qiladi. Bu funksiyadan foydalanish, odatda, massivlar yoki strukturalarni yaratishda ishlatiladi.
Sintaksis:
num — ajratilishi kerak bo'lgan elementlar soni.
size — har bir elementning hajmi (baytlarda).
Misol: calloc() yordamida xotira ajratish
arr = (int*) calloc(n, sizeof(int));
— calloc() yordamida n = 5 elementli xotira ajratamiz. Har bir element hajmi sizeof(int)
ga teng bo'lib, ajratilgan barcha xotira 0 bilan to'ldiriladi.
for (int i = 0; i < n; i++) { arr[i] = i + 1; }
— ajratilgan xotiraga qiymat beramiz.
printf("%d ", arr[i]);
— ajratilgan xotira elementlarini ekranga chiqaramiz.
free(arr);
— ajratilgan xotirani bo'shatamiz.
realloc() funksiyasi avval malloc() yoki calloc() yordamida ajratilgan xotira hajmini o'zgartirish imkonini beradi. Agar xotira hajmini kattalashtirish kerak bo‘lsa yoki xotiraga qo‘shimcha bo‘sh joy kerak bo‘lsa, realloc() yordamida xotira kengaytiriladi.
Sintaksis:
ptr — dastlab ajratilgan xotiraning ko'rsatkichi.
new_size — yangi xotira hajmi.
Misol: realloc() yordamida xotirani kengaytirish
arr = (int*) realloc(arr, n * sizeof(int));
— realloc() yordamida ajratilgan xotira hajmini 10 ta elementga kengaytiramiz.
if (arr == NULL)
— agar realloc() xotira ajrata olmasa, NULL qaytaradi va xato xabari chiqariladi.
for (int i = 5; i < n; i++) { arr[i] = i + 1; }
— yangi ajratilgan xotira joyiga qiymatlar beramiz.
printf("%d ", arr[i]);
— ajratilgan xotira elementlarini ekranga chiqaramiz.
free(arr);
— ajratilgan xotirani bo'shatamiz.
free() funksiyasi dinamik xotira ajratishdan so'ng ajratilgan xotirani bo'shatish uchun ishlatiladi. Bu funksiya xotira manzilini oladi va tegishli xotira joyini bo'shatadi, uni keyingi foydalanish uchun ochiq qiladi.
Sintaksis:
ptr — bo'shatiladigan xotira manzili.
Misol: free() funksiyasi
free(arr);
— bu qator ajratilgan xotirani bo'shatadi. Xotira to'g'ri bo'shatilmasa, dasturda xotira oqishi (memory leak) yuz berishi mumkin, bu esa dastur va tizim uchun muammolar keltirib chiqaradi.
Xulosa:
Ushbu bo'limda dinamik xotira boshqaruvi haqida to'liq ma'lumotlar berildi. malloc(), calloc(), realloc(), va free() funksiyalari qanday ishlatilishini va har birining vazifalarini ko'rdik. Har bir qator kodga batafsil tushuntirish berildi, shuningdek, xotira ajratish va bo'shatish jarayonlari ko'rsatildi.