কম্পিউটার টিউটোরিয়াল

C ভাষায় malloc কী?


C লাইব্রেরি মেমরি অ্যালোকেশন ফাংশন void *malloc(size_t size) চাহিদা অনুযায়ী মেমরি অ্যালোকেট করে এবং একটি পয়েন্টার রিটার্ন করে।

মেমরি অ্যালোকেশন ফাংশন

মেমরি দুটি পদ্ধতিতে অ্যালোকেট করা যায় যেগুলো নিচে ব্যাখ্যা করা হলো −

C ভাষায় malloc কী?

একবার কম্পাইল টাইমে মেমরি অ্যালোকেট হলে, এক্সিকিউশন চলাকালীন এটিকে পরিবর্তন করা যায় না। মেমরির অভাবে অথবা মেমরির অপচয় হবে।

সমাধান হলো ডাইনামিক্যালি মেমরি তৈরি করা অর্থাৎ প্রোগ্রাম এক্সিকিউশনের সময় ইউজারের প্রয়োজন অনুযায়ী।

ডাইনামিক মেমরি ম্যানেজমেন্টের জন্য ব্যবহৃত স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলো হলো −

  • malloc()
  • calloc()
  • realloc()
  • free()

malloc() ফাংশন

এই ফাংশনটি রানটাইমে বাইটে মেমরি ব্লক অ্যালোকেট করতে ব্যবহৃত হয়। এটি একটি void পয়েন্টার রিটার্ন করে, যা অ্যালোকেট করা মেমরির বেস অ্যাড্রেস নির্দেশ করে।

malloc()-র সিনট্যাক্স নিচে দেওয়া হলো −

void *malloc(বাইটে সাইজ)

উদাহরণ ১

নিচের উদাহরণটি malloc() ফাংশন ব্যবহারের 모습을 보여준다।

int *ptr; ptr = (int *) malloc(1000); int *ptr; ptr = (int *) malloc(n * sizeof(int));

নোট − মেমরি ফ্রি না থাকলে NULL রিটার্ন করে।

উদাহরণ প্রোগ্রাম

নিচে ডাইনামিক মেমরি অ্যালোকেশন ফাংশন - malloc() ডেমনস্ট্রেট করার C প্রোগ্রাম দেওয়া হলো।

#include  #include  void main(){ // ভেরিয়েবল ও পয়েন্টার ঘোষণা // int numofele, i; int *p; // এলিমেন্ট ইনপুট হিসেবে পড়া // printf("অ্যারেতে এলিমেন্টের সংখ্যা লিখুন: "); scanf("%d", &numofele); // malloc ফাংশন ঘোষণা // p = (int *)malloc(numofele * (sizeof(int))); // পয়েন্টার অ্যারেতে এলিমেন্ট পড়া // for(i = 0; i < numofele; i++){ p[i] = i + 1; printf("অ্যারেতে %d নম্বর এলিমেন্ট: %d\n", i, p[i]); } }

আউটপুট

উপরোক্ত প্রোগ্রামটি এক্সিকিউট করলে নিচের ফলাফল পাওয়া যায় −

অ্যারেতে এলিমেন্টের সংখ্যা লিখুন: ৪ অ্যারেতে ০ নম্বর এলিমেন্ট: ১ অ্যারেতে ১ নম্বর এলিমেন্ট: ২ অ্যারেতে ২ নম্বর এলিমেন্ট: ৩ অ্যারেতে ৩ নম্বর এলিমেন্ট: ৪

উদাহরণ ২

ডাইনামিক মেমরি অ্যালোকেশন ফাংশন ব্যবহার করে এলিমেন্টগুলো প্রদর্শনের C প্রোগ্রাম নিচে দেওয়া হলো −

প্রথম পাঁচটি ব্লক খালি থাকবে, দ্বিতীয় পাঁচটি ব্লকে লজিক থাকবে।

#include  #include  void main(){ // ভেরিয়েবল, পয়েন্টার, যোগফল ঘোষণা // int numofe, i, sum = 0; int *p; // ইউজার থেকে এলিমেন্ট সংখ্যা পড়া // printf("এলিমেন্টের সংখ্যা লিখুন: "); scanf("%d", &numofe); // malloc() ফাংশন কল // p = (int *)malloc(numofe * sizeof(int)); /* আউটপুট প্রিন্ট - if স্টেটমেন্ট ব্যবহার করা হয়েছে কারণ * মেমরি সফলভাবে অ্যালোকেট/রিজার্ভ হয়েছে কিনা চেক করতে হবে */ if(p == NULL){ printf("মেমরি উপলব্ধ নেই"); exit(0); } // এলিমেন্টগুলো প্রিন্ট করা // printf("এলিমেন্টগুলো লিখুন: \n"); for(i = 0; i < numofe; i++){ scanf("%d", p+i); sum = sum + *(p+i); } printf("\nএলিমেন্টগুলোর যোগফল %d", sum); free(p); // প্রথম ২টি মেমরি লোকেশন ক্লিয়ার করা printf("\nক্লিয়ার করা মেমরি লোকেশন প্রদর্শন: \n"); for(i = 0; i < numofe; i++){ printf("%d\n", p[i]); // গার্বেজ ভ্যালু দেখাবে } }

আউটপুট

উপরোক্ত প্রোগ্রামটি এক্সিকিউট করলে নিচের ফলাফল পাওয়া যায় −

এলিমেন্টের সংখ্যা লিখুন: ৫ এলিমেন্টগুলো লিখুন: 12 10 24 45 67 এলিমেন্টগুলোর যোগফল 158 ক্লিয়ার করা মেমরি লোকেশন প্রদর্শন: 7804032 0 7799120 0 67

  1. সি ভাষায় আইডেন্টিফায়ার কী?

  2. C-তে ফাংশন স্পেসিফায়ার (Function Specifier) কী?

  3. C# প্রোগ্রামিং কী? (What is C# Programming?)

  4. C#-এ ডিকশনারি (Dictionary) কী এবং ব্যবহার