مثال حافظه (Memory Example)
این «مثال حافظه» یک لیست پویا می سازد. «حافظه پویا (Dynamic Memory)» یعنی اندازه داده ها را موقع اجرا تعیین کنیم؛ مثل وقتی تعداد دانش آموزان کلاس تغییر می کند.
برنامه لیست پویا: مثال حافظه
اینجا با یک «ساختار (Struct)» اطلاعات لیست را نگه می داریم. سپس با malloc() و realloc() اندازه را مدیریت می کنیم و در پایان با free() آزاد می کنیم.
#include <stdio.h>
#include <stdlib.h>
struct list {
int *data;
int numItems;
int size;
};
void addToList(struct list *myList, int item);
int main() {
struct list myList;
int amount;
int i;
int j;
myList.numItems = 0;
myList.size = 10;
myList.data = (int *) malloc(myList.size * sizeof(int));
if (myList.data == NULL) {
printf("Memory allocation failed\n");
return 1;
}
amount = 44;
for (i = 0; i < amount; i++) {
addToList(&myList, i + 1);
}
for (j = 0; j < myList.numItems; j++) {
printf("%d ", myList.data[j]);
}
printf("\n");
free(myList.data);
myList.data = NULL;
return 0;
}
void addToList(struct list *myList, int item) {
if (myList->numItems == myList->size) {
int newSize = myList->size + 10;
int *tmp = (int *) realloc(myList->data, newSize * sizeof(int));
if (tmp == NULL) {
printf("Memory resize failed\n");
return;
}
myList->data = tmp;
myList->size = newSize;
}
myList->data[myList->numItems] = item;
myList->numItems++;
}
تشریح بخش ها با تکه کدهای کوتاه
1) شروع لیست و گرفتن حافظه
اول ظرفیت را 10 می گذاریم. سپس با malloc() حافظه می گیریم. اگر نشد، خطا می دهیم.
myList.numItems = 0;
myList.size = 10;
myList.data = (int *) malloc(myList.size * sizeof(int));
if (myList.data == NULL) {
printf("Memory allocation failed");
return 1;
}
2) افزودن چند آیتم پشت سرهم
با یک حلقه، اعداد 1 تا مقدار خواسته شده را اضافه می کنیم.
amount = 44;
for (i = 0; i < amount; i++) {
addToList(&myList, i + 1);
}
3) بزرگ کردن ظرفیت با realloc()
اگر جا پر شد، 10 تا جا اضافه می کنیم. نتیجه را در اشاره گر موقت می ریزیم.
if (myList->numItems == myList->size) {
int newSize = myList->size + 10;
int *tmp = (int *) realloc(myList->data, newSize * sizeof(int));
if (tmp == NULL) {
printf("Memory resize failed\n");
return;
}
myList->data = tmp;
myList->size = newSize;
}
4) چاپ و آزادسازی حافظه
در پایان چاپ می کنیم و با free() حافظه را آزاد می کنیم.
for (j = 0; j < myList.numItems; j++) {
printf("%d ", myList.data[j]);
}
free(myList.data);
myList.data = NULL;
گام های عملی
- یک ساختار برای وضعیت لیست تعریف کن.
- با
mallocحافظه اولیه بگیر و خطا را چک کن. - آیتم ها را اضافه کن و در صورت نیاز
reallocکن. - نتیجه را چاپ کن و در پایان
freeبزن.
نکته: برای نمونه های بیشتر، مثال حافظه و ساختارها و حافظه را ببین. همچنین درباره خطاها، صفحه مدیریت خطا مفید است.
جمع بندی سریع
- ظرفیت را کم کم ولی منطقی افزایش بده.
- همیشه نتیجه
mallocوreallocرا بررسی کن. - از اشاره گر موقت در
reallocاستفاده کن. - در پایان
freeبزن و اشاره گر را NULL کن.