Xotira bilan ishlovchi funksiyalar — dastur ishlash vaqtida xotirani dinamik ravishda ajratish va bo’shatish vositalari. Ba’zan qancha ma’lumot kelishini oldindan bilmaymiz — foydalanuvchi 10 ta yoki 10000 ta element kiritishi mumkin. Aynan shunday holatlarda dinamik xotira kerak bo’ladi. Bu C’ning eng kuchli, ayni paytda eng mas’uliyatli imkoniyatidir.
Dinamik xotira — dastur ishlash vaqtida ajratiladigan xotira. C’da u
malloc,calloc,reallocbilan ajratiladi vafreebilan bo’shatiladi. Bu funksiyalarstdlib.hda.
malloc — xotira ajratish
malloc (memory allocation) berilgan hajmdagi xotirani ajratib, unga ko’rsatkich qaytaradi:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = malloc(3 * sizeof(int)); /* 3 ta int uchun joy */
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
printf("%d %d %d\n", arr[0], arr[1], arr[2]);
free(arr); /* xotirani bo'shatamiz */
return 0;
}
10 20 30
malloc(3 * sizeof(int)) — uchta butun son uchun xotira ajratdi. Undan massiv kabi foydalanamiz. Eng muhimi: free(arr) bilan xotirani majburan bo’shatish kerak.
free — xotirani bo’shatish
C’da ajratilgan xotira avtomatik bo’shatilmaydi — buni dasturchi qiladi. free ni unutish xotira sizib chiqishi (memory leak) ga olib keladi:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *ism = malloc(50);
strcpy(ism, "Master Sherkulov");
printf("%s\n", ism);
free(ism); /* majburiy! */
return 0;
}
Master Sherkulov
Har bir malloc uchun mos free bo’lishi shart. Bu qoidani unutish katta dasturlarda jiddiy muammolarga olib keladi. C’da xotira mas’uliyati to’liq dasturchi zimmasida.
Xotira funksiyalari
Dinamik xotira funksiyalarini jadvalda ko’ramiz:
| Funksiya | Vazifasi |
|---|---|
malloc(n) |
n bayt ajratadi (tozalanmagan) |
calloc(n, size) |
ajratadi va nolga to’ldiradi |
realloc(p, n) |
ajratilgan hajmni o’zgartiradi |
free(p) |
xotirani bo’shatadi |
calloc va tekshirish
calloc xotirani ajratib, uni nolga to’ldiradi. Ajratish muvaffaqiyatli bo’lganini tekshirish muhim:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = calloc(3, sizeof(int)); /* hammasi 0 */
if (arr == NULL) {
printf("Xotira ajratilmadi!\n");
return 1;
}
printf("%d %d %d\n", arr[0], arr[1], arr[2]);
free(arr);
return 0;
}
0 0 0
calloc ajratgan xotira 0 bilan to’ldirildi. if (arr == NULL) — ajratish muvaffaqiyatsiz bo’lganini tekshiradi. Bu professional C kodining muhim odati.
Xulosa
Bu bo’limda dinamik xotira funksiyalarini — malloc, calloc, realloc, free — va xotirani majburan bo’shatishning muhimligini ko’rib chiqdik. C’da xotira mas’uliyati dasturchi zimmasida. Keyingi darsda fayllar bilan ishlashga o’tamiz.