Dinamik xotira ajratish uchun ajratilgan kalit so'z. C da dinamik xotira ajratish. Asosiy dastur muammolari ANSI C standarti dinamik xotirani ajratish uchun zarur bo'lgan sarlavha ma'lumotlari stdlib.h faylida mavjudligini belgilaydi. Biroq, Borland C++ stdlib.h yoki alloc.h sarlavha fayllaridan foydalanish imkonini beradi. Biz bu yerda stdlib.h sarlavha faylidan foydalanamiz, chunki u portativlikni ta'minlaydi. Ba'zi boshqa dinamik xotira ajratish funktsiyalari alloc.h, malloc.h yoki dos.h sarlavha fayllarini talab qiladi. Har bir funktsiyadan foydalanish uchun qaysi sarlavha fayli kerakligiga alohida e'tibor bering.
Biz dinamik xotirani taqsimlash imkoniyatlarini kashf qildik. Bu nima degani? Bu shuni anglatadiki, dinamik xotira taqsimoti bilan xotira kompilyatsiya bosqichida emas, balki dasturni bajarish bosqichida saqlanadi. Va bu bizga xotirani, asosan, massivlar uchun samaraliroq ajratish imkoniyatini beradi. FROM dinamik tanlash Xotirada biz massiv hajmini oldindan belgilashimiz shart emas, ayniqsa massiv qanday o'lchamga ega bo'lishi har doim ham ma'lum emas. Keyinchalik, xotirani qanday ajratish mumkinligini ko'rib chiqamiz.
C da xotirani ajratish (malloc funktsiyasi)
malloc() funksiyasi ichida belgilangan sarlavha fayli stdlib.h , u kerakli hajmdagi xotira bilan ko'rsatgichlarni ishga tushirish uchun ishlatiladi. Xotira sektordan ajratilgan tasodifiy kirish xotirasi ushbu mashinada ishlaydigan har qanday dastur uchun mavjud. Argument ajratiladigan xotira baytlari soni bo'lib, funksiya xotiradagi ajratilgan blokga ko'rsatgichni qaytaradi. malloc() funksiyasi boshqa funksiyalar kabi ishlaydi, yangilik yo'q.
Chunki turli xil turlari ma'lumotlar turli xil xotira talablariga ega, biz qandaydir tarzda ma'lumotlar uchun baytdagi hajmni qanday olishni o'rganishimiz kerak har xil turdagi. Misol uchun, bizga int tipidagi qiymatlar massivi uchun xotira bo'lagi kerak - bu xotiraning bir o'lchamidir va agar biz bir xil o'lchamdagi, lekin allaqachon char tipidagi massiv uchun xotirani ajratishimiz kerak bo'lsa - bu boshqa o'lcham. Shuning uchun siz qandaydir tarzda xotira hajmini hisoblashingiz kerak. Buni ifodani qabul qiladigan va uning hajmini qaytaradigan sizeof() operatsiyasi yordamida amalga oshirish mumkin. Masalan, sizeof(int) int qiymatini saqlash uchun zarur bo'lgan baytlar sonini qaytaradi. Bir misolni ko'rib chiqing:
#o'z ichiga oladi int *ptrVar = malloc(sizeof(int));
Ushbu misolda, in 3-qator ptrVar ko'rsatkichiga xotira qismining manzili beriladi, uning hajmi int ma'lumotlar turiga mos keladi. Avtomatik ravishda ushbu xotira maydoni boshqa dasturlar uchun mavjud bo'lmaydi. Va bu ajratilgan xotira keraksiz holga kelgandan so'ng, uni aniq bo'shatish kerak degan ma'noni anglatadi. Agar xotira aniq bo'shatilmasa, dastur oxirida xotira bo'shatilmaydi. operatsion tizim, bu xotira sızıntısı deb ataladi. Shuningdek, siz ajratilishi kerak bo'lgan ajratilgan xotira hajmini null ko'rsatkichni o'tkazish orqali aniqlashingiz mumkin, bu erda bir misol:
int *ptrVar = malloc(sizeof(*ptrVar));
Bu yerda nima bo'lyapti? Sizeof(*ptrVar) operatsiyasi ko'rsatgich tomonidan ko'rsatilgan xotira maydoni hajmini taxmin qiladi. ptrVar int tipidagi xotira qismiga ko'rsatgich bo'lgani uchun sizeof() butun son hajmini qaytaradi. Ya'ni, aslida, ko'rsatgich ta'rifining birinchi qismiga ko'ra, ikkinchi qism uchun o'lcham hisoblanadi. Xo'sh, nega bizga kerak? Agar to'satdan ko'rsatgich ta'rifini o'zgartirish kerak bo'lsa, bu zarur bo'lishi mumkin, int , masalan, float va keyin, biz ko'rsatgich ta'rifining ikki qismida ma'lumotlar turini o'zgartirishimiz shart emas. Birinchi qismni o'zgartirish kifoya qiladi:
Float *ptrVar = malloc(sizeof(*ptrVar));
Ko'rib turganingizdek, bunday rekordda bittasi bor forte, biz malloc() funktsiyasini sizeof(float) yordamida chaqirmasligimiz kerak. Buning o'rniga, biz float turiga ko'rsatgichni malloc() ga uzatdik, bu holda ajratilgan xotira hajmi avtomatik ravishda o'zi tomonidan aniqlanadi!
Bu, ayniqsa, xotirani ko'rsatkich ta'rifidan uzoqroqqa ajratish kerak bo'lsa foydalidir:
Float *ptrVar; /* . . . yuz satr kod */. . . ptrVar = malloc(sizeof(*ptrVar));
Agar siz sizeof() operatsiyasi bilan xotirani ajratish konstruksiyasidan foydalansangiz, koddagi ko‘rsatgich ta’rifini topishingiz, uning ma’lumotlar turiga qarashingiz kerak bo‘ladi va shundan keyingina xotirani to‘g‘ri taqsimlay olasiz.