বিভিন্ন এসিএম সমস্যার সমাধান করতে গেলে দেখা যায় প্রায়ই অনেক বড় অ্যারের প্রয়োজন হয় যা লোকালি কিংবা গ্লোবালী কোনো ভাবেই সম্ভব হয় না। তখন সি-তে সেই কাজটা করার উপায় কী? malloc() ব্যবহার করে কি কাজটা হতে পারে? সেটা কীভাবে? আর করলে সর্বোচ্চ কত পর্যন্ত অ্যারে ইনডেক্স করা সম্ভবপর হবে?

asked 08 Apr '15, 10:27

saifbgc's gravatar image

saifbgc
1165

edited 10 Aug, 01:48

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
30618


malloc() হলো একটা মেমোরি ব্যবস্থাপনা (Memory management) ফাংশন যার প্রোটোটাইপ stdlib.h হেডার ফাইলে ডিক্লেয়ার করা আছে।

প্রোটোটাইপঃ void* malloc(byte_size);

malloc() ফাংশনের আর্গুমেন্ট হিসাবে যে সাইজ পাঠানো হবে হিপ (Heap) থেকে এটা সেই সাইজের জায়গা দখল করবে এবং দখলকৃত জায়গার এড্রেস রিটার্ন করবে। উদাহরণস্বরূপ নিচের স্টেটমেন্ট দুটো দেখা যাক,

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

এখানে int ডেটা টাইপের জন্য যত বাইট জায়গা দরকার malloc() ফাংশনটা হিপ-এ তত বাইট দখল (allocate) করবে এবং ptr সেই দখলকৃত জায়গাকে পয়েন্ট করবে। এখানে ptr কোনো ভ্যারিয়েবলকে পয়েন্ট করছে না। বরং malloc()-এর মাধ্যমে দখল হওয়া int টাইপের বেনামি জায়গাকে পয়েন্ট করছে। আমরা জানি কোনো পয়েন্টারের পয়েন্ট করা অ্যাড্রেসের ডেটা নিয়ে কাজ করার জন্য indirection অপারেটর, * ব্যবহার করা হয়। তাই,

*ptr = 10;

স্টেটমেন্ট কাজ করার পর ptr-এর পয়েন্ট করা অ্যাড্রেসে 10 রাখা হবে।

malloc()-এর মাধ্যমে হিপ থেকে কোনো ডেটা টাইপের অ্যারেও অ্যালোকেট করা যায়। যেমন,

int*  ptr;
ptr = (int*)  malloc(5* sizeof(int));

এখানে হিপ থেকে পাঁচটা int টাইপের ডেটার জন্য প্রয়োজনীয় বাইট দখল করা হবে যাদেরকে ptr পয়েন্ট করবে। এখানে ptr পাঁচটা মেমোরি ব্লককে পয়েন্ট করছে এবং তাতে পাঁচটা int টাইপের এলিমেন্ট আছে। ptr-এর মাধ্যমে এই এলিমেন্টগুলো নিয়ে কাজ করার জন্যও indirection অপারেটর, * ব্যবহার করা যায়। যেমনঃ

*(ptr ) = 10;
*(ptr + 1)  = 20;
*(ptr + 2) = 30;
*(ptr + 3) = 40;
*(ptr + 4 )= 50;

উৎস এবং বিস্তারিতঃ সবার জন্য সি (কামরুজ্জামান নিটন)

permanent link

answered 10 Apr '15, 07:06

Hafiz%20Al%20Asad's gravatar image

Hafiz Al Asad
225115

edited 10 Aug, 02:05

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
30618

এসিএম প্রবলেমগুলো সলভ করতে সাধারণত ডায়নামিক মেমোরি অ্যালোকেশনের দরকার হয় না। বেশি বড় সাইজের অ্যারে হলে সেটা গ্লোবাল অ্যারে হিসেবে ডিক্লেয়ার করতে হবে। নিজের কম্পিউটারে না চললেও জাজের কম্পিউটারে প্রোগ্রাম চলবে। তবে চাইলে ডায়নামিক মেমোরি অ্যালোকেশন দিয়ে করা যায়, কিন্তু তাতে অতিরিক্ত কোনো সুবিধা পাওয়া যায় না।

permanent link

answered 08 Apr '15, 12:41

Tamim%20Shahriar%20Subeen's gravatar image

Tamim Shahriar Subeen ♦♦
6.0k1126

edited 10 Aug, 02:06

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
30618

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×2
×1
×1

question asked: 08 Apr '15, 10:27

question was seen: 719 times

last updated: 10 Aug, 02:06

Related questions