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