تخصیص مجدد (Reallocate Memory)
گاهی حافظه کم می آید. «تخصیص مجدد حافظه» یعنی بزرگ تر کردن فضای رزروشده و حفظ داده ها. در C این کار با تابع «realloc» انجام می شود. با دقت عمل کن تا آدرس ها قاطی نشوند.
تخصیص مجدد حافظه چیست؟
تابع realloc() اندازه حافظه قبلی را تغییر می دهد. اگر نشود، حافظه تازه می گیرد و آدرس جدید می دهد.
int *ptr2 = realloc(ptr1, size);
نمونه: افزایش اندازه حافظه
اول چهار int می گیریم. سپس به شش int افزایش می دهیم و آدرس چاپ می کنیم.
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr1 = NULL;
int *ptr2 = NULL;
int size = 0;
size = 4 * sizeof(*ptr1);
ptr1 = malloc(size);
printf("%d bytes allocated at address %p\n", size, (void *)ptr1);
size = 6 * sizeof(*ptr1);
ptr2 = realloc(ptr1, size);
printf("%d bytes reallocated at address %p\n", size, (void *)ptr2);
return 0;
}
آدرس جدید و ایمنی
ممکن است آدرس عوض شود. پس از موفقیت، متغیر قبلی را به آدرس جدید اشاره بده تا اشتباه نشود.
نمونه: بررسی NULL
اگر realloc نتواند حافظه بدهد، NULL برمی گرداند. همیشه بررسی کن.
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr1 = NULL;
int *ptr2 = NULL;
ptr1 = malloc(4);
ptr2 = realloc(ptr1, 8);
if (ptr2 == NULL) {
printf("Failed. Unable to resize memory\n");
} else {
printf("Success. 8 bytes reallocated at address %p\n", (void *)ptr2);
ptr1 = ptr2;
}
return 0;
}
آزاد کردن حافظه
پس از پایان کار، حافظه را «free» کن تا نشت حافظه رخ ندهد.
free(ptr1);
گام های عملی
- حافظه اولیه را با
mallocبگیر. - اندازه جدید را حساب کن.
- با
reallocاندازه را تغییر بده. - بررسی
NULLرا فراموش نکن. - در پایان، حافظه را
freeکن.
نکته: برای مرور پایه ها، صفحه اختصاص حافظه و دسترسی به حافظه را ببین. همچنین مدیریت حافظه دید کلی می دهد. فصل بعدی هم آزادسازی حافظه است.
جمع بندی سریع
- تخصیص مجدد حافظه یعنی تغییر اندازه قبلی.
- ممکن است آدرس عوض شود، مراقب باش.
- همیشه نتیجه
reallocرا برایNULLچک کن. - در پایان، حافظه را آزاد کن.