সি প্রোগ্রামিং ভাষায় মেমোরি বরাদ্দ এবং মেমোরি মুক্ত করা গুরুত্বপূর্ণ অংশ। যখন প্রোগ্রাম চলমান থাকে তখন মেমোরি চাহিদা অনুযায়ী ডাইনামিক মেমোরি বরাদ্দ এবং মুক্ত করার জন্য প্রধানত তিনটি ফাংশন ব্যবহার করা হয়: malloc(), calloc() এবং free()।
মেমোরি বরাদ্দ
১. malloc() ফাংশন
malloc() (Memory Allocation) ফাংশন নির্দিষ্ট পরিমাণ মেমোরি বরাদ্দ করে এবং বরাদ্দকৃত মেমোরির প্রথম বাইটের ঠিকানাটি রিটার্ন করে। এটি বরাদ্দকৃত মেমোরি ব্লকটি আনইনিশিয়ালাইজড অবস্থায় রাখে, অর্থাৎ এই মেমোরি ব্লকে কোনো ডেটা থাকে না।
গঠন:
void *malloc(size_t size);
size: বরাদ্দকৃত মেমোরির আকার (বাইটে)।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)malloc(5 * sizeof(int)); // ৫টি ইন্টিজার সাইজের মেমোরি বরাদ্দ
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
printf("%d ", ptr[i]);
}
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
আউটপুট:
1 2 3 4 5
ব্যাখ্যা: malloc ৫টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করেছে, এবং ptr সেই মেমোরি ব্লকের প্রথম বাইটের ঠিকানা পেয়েছে। লুপের মাধ্যমে প্রতিটি ব্লকে একটি মান প্রদান করা হয়েছে।
২. calloc() ফাংশন
calloc() (Contiguous Allocation) ফাংশনও মেমোরি বরাদ্দ করে, তবে এটি একসাথে একাধিক মেমোরি ব্লক বরাদ্দ করে এবং বরাদ্দকৃত মেমোরি শূন্য (০) দিয়ে ইনিশিয়ালাইজ করে।
গঠন:
void *calloc(size_t num, size_t size);
num: ব্লকের সংখ্যা।size: প্রতিটি ব্লকের আকার (বাইটে)।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)calloc(5, sizeof(int)); // ৫টি ইন্টিজারের জন্য মেমোরি বরাদ্দ এবং শূন্য দিয়ে ইনিশিয়ালাইজ
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]); // প্রিন্ট করলে শূন্য দেখাবে
}
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
আউটপুট:
0 0 0 0 0
ব্যাখ্যা: calloc ৫টি ইন্টিজার সাইজের মেমোরি বরাদ্দ করেছে এবং প্রতিটি ব্লক শূন্য দিয়ে ইনিশিয়ালাইজ করেছে।
মেমোরি মুক্ত করা
free() ফাংশন
free() ফাংশন ডাইনামিক্যালি বরাদ্দকৃত মেমোরি মুক্ত করে, অর্থাৎ ডেটা আর সংরক্ষণ করা হবে না এবং সিস্টেমে মেমোরি পুনরায় ব্যবহারযোগ্য হিসেবে ফেরত দেওয়া হয়। free() ফাংশন ডেটা মুছে দেয় না, তবে মেমোরি ব্লকটি পুনরায় ব্যবহারের জন্য মুক্ত করে।
গঠন:
void free(void *ptr);
ptr: যে পয়েন্টারে বরাদ্দকৃত মেমোরি আছে তার ঠিকানা।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)malloc(5 * sizeof(int)); // মেমোরি বরাদ্দ করা
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// মেমোরি ব্যবহার
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
ব্যাখ্যা:
mallocফাংশন মেমোরি বরাদ্দ করেছে।- মেমোরি ব্যবহার করে কিছু মান সংরক্ষণ করা হয়েছে।
free()ফাংশন সেই মেমোরি ব্লকটি মুক্ত করেছে।
malloc() এবং calloc() এর পার্থক্য
| বৈশিষ্ট্য | malloc() | calloc() |
|---|---|---|
| মেমোরি ইনিশিয়ালাইজেশন | মেমোরি ব্লক ইনিশিয়ালাইজ করে না | বরাদ্দকৃত মেমোরি ব্লকগুলো শূন্য দিয়ে ইনিশিয়ালাইজ করে |
| প্যারামিটার | বরাদ্দকৃত মেমোরির আকার (বাইটে) | ব্লক সংখ্যা এবং প্রতিটি ব্লকের আকার (বাইটে) |
| ব্যবহার | সাধারণ মেমোরি বরাদ্দে ব্যবহৃত | নির্দিষ্ট সংখ্যা ব্লকের মেমোরি বরাদ্দে ব্যবহৃত |
মেমোরি ম্যানেজমেন্ট টিপস
malloc()এবংcalloc()ব্যবহারের পরে সবসময় চেক করুন মেমোরি বরাদ্দ সফল হয়েছে কিনা।- মেমোরি ব্যবহার শেষ হলে
free()ফাংশন ব্যবহার করে মেমোরি মুক্ত করুন, যা মেমোরি লিক প্রতিরোধে সহায়ক। free()ফাংশন বারবার ডাকা থেকে বিরত থাকুন, কারণ এটি ত্রুটি তৈরি করতে পারে।
সংক্ষেপে
malloc(): নির্দিষ্ট পরিমাণ মেমোরি বরাদ্দ করে, কিন্তু ইনিশিয়ালাইজ করে না।calloc(): নির্দিষ্ট সংখ্যা ব্লকের মেমোরি বরাদ্দ করে এবং শূন্য দিয়ে ইনিশিয়ালাইজ করে।free(): মেমোরি ব্লক মুক্ত করে এবং পুনরায় ব্যবহারের জন্য উপলব্ধ করে।
ডাইনামিক মেমোরি ম্যানেজমেন্ট সি প্রোগ্রামে মেমোরি ব্যবহারের কার্যকারিতা বৃদ্ধি করে এবং বড় আকারের ডেটা পরিচালনা সহজ করে।
Read more