C xotirani qayta ajratish


ULASHISH

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:

Misol

Ajratilgan xotirani bo‘shatish:

// Free allocated memory free(ptr1);
O‘zingiz sinab ko‘ring »

Ajratilgan xotirani qanday bo‘shatish va bu nima uchun muhimligi haqida keyingi bobda batafsil bilib olasiz.





W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!