Darsliklar C Xotira bilan ishlovchi funksiyalar

C C Xotira bilan ishlovchi funksiyalar

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 xotiradastur ishlash vaqtida ajratiladigan xotira. C’da u malloc, calloc, realloc bilan ajratiladi va free bilan bo’shatiladi. Bu funksiyalar stdlib.h da.

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.