malloc() এবং calloc() এর পার্থক্য এবং প্রয়োগ
সি প্রোগ্রামিং ভাষায় malloc() (memory allocation) এবং calloc() (contiguous allocation) ফাংশন দুটি ডাইনামিক মেমোরি বরাদ্দ করার জন্য ব্যবহৃত হয়। তবে, এই দুটি ফাংশনের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে, যা তাদের ব্যবহারকে নির্ধারণ করে।
এখানে malloc() এবং calloc() এর পার্থক্য এবং তাদের প্রয়োগ সম্পর্কে বিস্তারিত আলোচনা করা হলো।
malloc() – মেমোরি বরাদ্দ করা
malloc() ফাংশনটি একটি নির্দিষ্ট আকারের মেমোরি ব্লক বরাদ্দ করে এবং মেমোরির শুরুতে একটি পয়েন্টার রিটার্ন করে। তবে, এটি বরাদ্দ করা মেমোরি ব্লকটি অ্যানডিফাইনড মান (garbage values) দিয়ে পূর্ণ রাখে, অর্থাৎ এতে কোনো প্রাথমিক মান থাকে না।
সিঙ্কট্যাক্স:
void *malloc(size_t size);size– বরাদ্দ করতে চাওয়া মেমোরির আকার (বাইটে)।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
// 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ
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;
}
// আউটপুট
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
// বরাদ্দকৃত মেমোরি মুক্ত করা
free(ptr);
return 0;
}এখানে malloc() ফাংশনটি 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করেছে, এবং ptr পয়েন্টার দ্বারা সেই মেমোরি অ্যাক্সেস করা হয়েছে।
বৈশিষ্ট্য:
malloc()শুধুমাত্র মেমোরি বরাদ্দ করে এবং এটি পূর্ববর্তী মান প্রদান না করে। অর্থাৎ, বরাদ্দ করা মেমোরি ব্লকটি কোনো মান দিয়ে পূর্ণ থাকে না (গার্বেজ মান)।- এটি একক আকারে মেমোরি বরাদ্দ করে, যেমন একটি অ্যারে বা স্ট্রাকচার।
calloc() – মেমোরি বরাদ্দ এবং ইনিশিয়ালাইজেশন
calloc() ফাংশনটি মেমোরির একটি ব্লক বরাদ্দ করে এবং সেই মেমোরির প্রতিটি অংশকে শূন্য (0) দিয়ে পূর্ণ করে দেয়। এটি malloc() এর মতো, তবে এটি মেমোরি বরাদ্দ করার পাশাপাশি বরাদ্দকৃত মেমোরি ইনিশিয়ালাইজও করে।
সিঙ্কট্যাক্স:
void *calloc(size_t num, size_t size);num– বরাদ্দ করতে চাওয়া এলিমেন্টের সংখ্যা।size– প্রতিটি এলিমেন্টের আকার (বাইটে)।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
// 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ এবং সবগুলোকে শূন্য দিয়ে পূর্ণ করা
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]); // সবগুলো ভ্যালু হবে 0
}
// বরাদ্দকৃত মেমোরি মুক্ত করা
free(ptr);
return 0;
}এখানে calloc() ফাংশনটি 5টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করেছে এবং সবগুলোকে 0 দিয়ে পূর্ণ করেছে।
বৈশিষ্ট্য:
calloc()মেমোরি বরাদ্দ করার পাশাপাশি এটি প্রতিটি ব্লককে শূন্য (0) দিয়ে পূর্ণ করে। এটি মেমোরি ইনিশিয়ালাইজেশন সরবরাহ করে।- এটি দুটি আর্গুমেন্ট গ্রহণ করে: একটির মাধ্যমে এলিমেন্টের সংখ্যা এবং অন্যটির মাধ্যমে প্রতিটি এলিমেন্টের আকার।
- এটি একটি নির্দিষ্ট আকারের মেমোরি ব্লক বরাদ্দ করে, যেমন একটি অ্যারে বা স্ট্রাকচার, এবং ইনিশিয়ালাইজ করা মান 0 হয়।
malloc() এবং calloc() এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | malloc() | calloc() |
|---|---|---|
| ইনিশিয়ালাইজেশন | বরাদ্দকৃত মেমোরি ব্লকটি অ্যানডিফাইনড মান (garbage values) দিয়ে পূর্ণ থাকে। | বরাদ্দকৃত মেমোরি ব্লকটি শূন্য (0) দিয়ে পূর্ণ থাকে। |
| আর্গুমেন্ট | একক আর্গুমেন্ট (মেমোরির আকার)। | দুটি আর্গুমেন্ট (এলিমেন্ট সংখ্যা এবং প্রতিটি এলিমেন্টের আকার)। |
| প্রকৃতি | একক আকারের মেমোরি বরাদ্দ করে। | একটি বৃহৎ ব্লক বরাদ্দ করে এবং প্রতিটি অংশে শূন্য মান স্থাপন করে। |
| পারফরম্যান্স | সাধারণত দ্রুত, কারণ এটি ইনিশিয়ালাইজেশন করে না। | কিছুটা ধীর, কারণ এটি মেমোরি ইনিশিয়ালাইজ করে। |
সারসংক্ষেপ
| ফাংশন | কাজ | সিঙ্কট্যাক্স |
|---|---|---|
malloc() | মেমোরি বরাদ্দ করে, কিন্তু ইনিশিয়ালাইজেশন করে না | void *malloc(size_t size); |
calloc() | মেমোরি বরাদ্দ করে এবং ইনিশিয়ালাইজ করে (সব অংশে শূন্য মান স্থাপন) | void *calloc(size_t num, size_t size); |
malloc() এবং calloc() ফাংশন দুটি ডাইনামিক মেমোরি বরাদ্দ করতে ব্যবহৃত হয়, তবে malloc() মেমোরি বরাদ্দের পর মেমোরি ইনিশিয়ালাইজেশন করে না, এবং calloc() ইনিশিয়ালাইজেশন সহ মেমোরি বরাদ্দ করে (যা সবগুলো এলিমেন্ট শূন্য মান দিয়ে পূর্ণ থাকে)।
Read more