Dynamic Memory Allocation in C
03 Feb 2020 / 2 min read
ဒိုင်နမစ် မန်မိုရီ ခွဲဝေမှု ဆိုသည်မှာ ပရိုဂရမ် လည်ပတ်နေစဉ် (runtime) အတွင်း ဒေတာဖွဲ့စည်းပုံတစ်ခု၏ အရွယ်အစားကို ပြောင်းလဲနိုင်စေမည့် နည်းလမ်းတစ်ခု ဖြစ်သည်။ ဥပမာအားဖြင့်၊ ပရိုဂရမ် လုပ်ဆောင်နေစဉ် အချက်အလက် အသစ်များ ဝင်လာပါက ဒေတာဖွဲ့စည်းပုံ၏ အရွယ်အစားကို ပိုမိုကြီးမားအောင် ချဲ့ထွင်နိုင်သည် သို့မဟုတ် မလိုအပ်တော့သည့် အချက်အလက်များကို ဖျက်ပစ်လိုက်ခြင်းဖြင့် အရွယ်အစားကို လျော့ချနိုင်သည်။
C ဘာသာစကားတွင် ဒိုင်နမစ် မန်မိုရီ ခွဲဝေမှုကို လွယ်ကူချောမွေ့စေရန် <stdlib.h>
header file အောက်တွင် သတ်မှတ်ထားသော လုပ်ဆောင်ချက် ၄ ခု ရှိသည်။
- malloc()
- calloc()
- free()
- realloc()
malloc()
အဓိပ္ပာယ်: သတ်မှတ်ထားသော အရွယ်အစားရှိ မန်မိုရီ တစ်ခုကို ခွဲဝေပေးသည့် လုပ်ဆောင်ချက်ဖြစ်သည်။
```
ptr = (cast-type*) malloc(byte-size);
```
- `ptr`: ခွဲဝေပေးထားသော မန်မိုရီ၏ လိပ်စာကို သိုမှတ်ထားမည့် pointer တစ်ခု
- `cast-type`: pointer ၏ အမျိုးအစား (ဥပမာ၊ int *, char *, float *)
- `byte-size`: ခွဲဝေပေးလိုသော မန်မိုရီ byte အရေအတွက်
calloc()
အဓိပ္ပာယ်: သတ်မှတ်ထားသော အရွယ်အစားရှိ မန်မိုရီ ဘလောက်များစွာကို ခွဲဝေပေးသည့် လုပ်ဆောင်ချက်ဖြစ်သည်။ ခွဲဝေပေးထားသော မန်မိုရီ အားလုံးကို 0 ဖြင့် စတင်ပေးမည်ဖြစ်သည်။
```
ptr = (cast-type*)calloc(n, element-size);
```
- `n`: ခွဲဝေပေးလိုသော ဘလောက် အရေအတွက်
- `element-size`: တစ်ခုချင်းစီ ဘလောက်၏ အရွယ်အစား
free()
အဓိပ္ပာယ်: ခွဲဝေပေးထားသော မန်မိုရီကို ပြန်လည်လွှတ်ပေးသည့် လုပ်ဆောင်ချက်ဖြစ်သည်။ malloc() နှင့် calloc() ဖြင့် ခွဲဝေပေးထားသော မန်မိုရီများကို လက်တွေ့တွင် ဖျက်ပစ်ခြင်း မရှိပါ။ ထို့ကြောင့် မလိုအပ်တော့သည့် မန်မိုရီများကို free() ဖြင့် ပြန်လည်လွှတ်ပေးရန် လိုအပ်သည်။
```
free(ptr);
```
realloc()
အဓိပ္ပာယ်: ယခင်က ခွဲဝေပေးထားသော မန်မိုရီ၏ အရွယ်အစားကို ပြောင်းလဲလိုသည့်အခါ အသုံးပြုသည်။ မန်မိုရီ ပိုလိုအပ်ပါက ချဲ့ထွင်နိုင်သလို၊ မလိုအပ်တော့ပါက လျှော့ချနိုင်သည်။
ptr = realloc(ptr, newSize);
- `newSize`: ပြောင်းလဲလိုသော အရွယ်အစား
အားသာချက်များ
- ပရိုဂရမ်၏ တိုးချဲ့မှုအတွက် လွယ်ကူစေသည်။
- မန်မိုရီကို ထိရောက်စွာ အသုံးပြုနိုင်စေသည်။
- ဒေတာဖွဲ့စည်းပုံများကို ပိုမိုကြိုတင်ခန့်မှန်း၍မရသော အခြေအနေများတွင် အသုံးဝင်သည်။
အားနည်းချက်များ
- မန်မိုရီ လျော့ချခြင်းနှင့် ပြန်လည်ခွဲဝေခြင်းတို့ကို မမေ့ဘဲ ဂရုတစိုက် လုပ်ဆောင်ရန် လိုအပ်သည်။
- မန်မိုရီ လျော့ချခြင်းကို မမေ့လျော့ပါက memory leak ဖြစ်ပေါ်နိုင်သည်။
ဥပမာ
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr, i, num;
printf("Enter number of elements: ");
scanf("%d", &num);
// allocate memory dynamically
ptr = (int*)calloc(num, sizeof(int));
if(ptr == NULL) {
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements: ");
for(i = 0; i < num; ++i) {
scanf("%d", ptr+i);
}
printf("You entered elements: ");
for(i = 0; i < num; ++i) {
printf("%d ", *(ptr+i));
}
free(ptr);
return 0;
}