C xotirani qayta ajratish
Xotirani qayta ajratish
Agar band qilgan xotirangiz yetarli bo‘lmasa, uni kattalashtirish uchun qayta ajratishingiz mumkin.
Qayta ajratish unda saqlangan ma’lumotlarni saqlab qolgan holda boshqa (odatda kattaroq) hajmdagi xotirani band qiladi.
Ajratilgan xotira o‘lchamini realloc() funksiyasi yordamida o‘zgartirishingiz mumkin.
realloc() funksiyasi ikkita parametr qabul qiladi:
int *ptr2 = realloc(ptr1, size);
- Birinchi parametr — o‘lchami o‘zgartirilayotgan xotiraga ko‘rsatkich.
- Ikkinchi parametr ajratilgan xotiraning baytlarda o‘lchangan yangi hajmini belgilaydi.
realloc() funksiyasi ptr1 manzilidagi xotira o‘lchamini o‘zgartirishga va xuddi shu xotira manzilini qaytarishga harakat qiladi. Agar joriy manzildagi xotira o‘lchamini o‘zgartira olmasa, u boshqa manzilda xotira ajratadi va buning o‘rniga yangi manzilni qaytaradi.
Eslatma: realloc() boshqa xotira manzilini qaytarganda, asl manzildagi xotira endi band qilingan bo‘lmaydi va undan foydalanish xavfli. Qayta ajratish tugagach, eski ko‘rsatkichdan tasodifan foydalanib qo‘ymaslik uchun yangi ko‘rsatkichni avvalgi o‘zgaruvchiga o‘zlashtirish maqsadga muvofiq.
Misol
Ajratilgan xotira o‘lchamini oshirish:
int *ptr1, *ptr2, size;
// Allocate memory for four integers
size = 4 * sizeof(*ptr1);
ptr1 = malloc(size);
printf("%d bytes allocated at address %p \n", size, ptr1);
// Resize the memory to hold six integers
size = 6 * sizeof(*ptr1);
ptr2 = realloc(ptr1, size);
printf("%d bytes reallocated at address %p \n", size, ptr2);
O‘zingiz sinab ko‘ring »
NULL ko‘rsatkich va xatolarni tekshirish
Agar ko‘proq xotira ajrata olmasa, realloc() funksiyasi NULL ko‘rsatkich qaytaradi. Bunday holat juda kam uchraydi, lekin kodingiz nosozliklarga chidamli bo‘lishi kerak bo‘lganda buni yodda tutgan ma’qul.
Quyidagi misol NULL ko‘rsatkichni tekshirish orqali realloc() xotira o‘lchamini o‘zgartira oldimi yoki yo‘qmi, shuni aniqlaydi:
Misol
NULL ko‘rsatkichni tekshirish:
int *ptr1, *ptr2;
// Allocate memory
ptr1 = malloc(4);
// Attempt to resize the memory
ptr2 = realloc(ptr1, 8);
// Check whether realloc is able to resize the memory or not
if (ptr2 == NULL) {
// If reallocation fails
printf("Failed. Unable to resize memory");
} else {
// If reallocation is successful
printf("Success. 8 bytes reallocated at address %p \n", ptr2);
ptr1 = ptr2; // Update ptr1 to point to the newly allocated memory
}
O‘zingiz sinab ko‘ring »
Eslatma: Xotira ajratishda har doim xatolarni tekshirishni qo‘shing (if pointer == NULL).
Eslatma: Ajratilgan xotiradan foydalanib bo‘lgach, uni har doim bo‘shatishingiz (free) ham kerak. Bu dasturingiz kutilganidek ishlashini ta’minlash uchun muhim, shuningdek uni qo‘llab-quvvatlashga qulayroq va samaraliroq qiladi.
Xotirani bo‘shatish uchun shunchaki free() funksiyasidan foydalaning:
Ajratilgan xotirani qanday bo‘shatish va bu nima uchun muhimligi haqida keyingi bobda batafsil bilib olasiz.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
