3
1

ডাইনামিক মেমরি এলোকেশন এর মাধ্যমে কিভাবে ২ ডাইমেনশনাল এর্যেতে ইনপুট নেবো আর আউটপুট দেব ব্যাপারটা বই পড়ে আর গুগল করেও ধুকছে না,কেও হেল্প করলে ভালো হত।সুবিন দাদা তুমি বোঝালে খুব ভালো হত,আসলে তোমার বোঝানোর স্টাইল টা খুব সুন্দর,একবারেই মাথায় ঢুকে যায়।আর malloc() function এর মাধ্যমে ভ্যালু স্টোর করলে মেমরির single block এ স্টোর হয় কিন্তু তাহলে p=(int)malloc (50*sizeof(int)); এর মধ্যে তো ৫০ টা ইন্টিজার ভ্যালু স্টোর হচ্ছে। তাহলে single block এ তো ভ্যালু স্টোর হচ্ছে না।এই ব্যাপারটাই খুব confused..

asked 22 Jan '15, 18:58

Raja%20Das's gravatar image

Raja Das
7519


এরের ঘোষণার সময় তার সাইজ নির্ধারণ করে দিতে হয়। একে স্ট্যাটিক মেমোরি এলকেশন বলে। কিন্তু এরে ব্যাবহারের সবচেয়ে অসুবিধা হল অনেক সময় প্রয়োজনের তুলনায় বেশি সাইজ দিতে হয়, এতে মেমোরি অপচয় হয় ।
ডাইনামিক মেমরি এলোকেশন এর মাধ্যমে আমরা নিজের প্রয়োজনমত সাইজ নির্ধারণ করতে পারি। তা দিয়ে কাজ করতে পারি আবার তা খালি করে দিতে পারি ।

malloc() ফাংশনের সাহায্যে মেমোরি নির্ধারন করা যায় ।

int *p;
p=malloc(40);

এর মাধ্যমে বোঝায় p পয়েন্টারে ৪০ বাইট জায়গা নির্ধারণ হইলো এখানে আমরা ১০টি integer(১ টি integer ৪ বাইট) রাখতে পারব । কিন্তু প্রতিটা ডাটাটাইপের মেমোরি হিসাব করে করে লিখার থেকে আদর্শ পদ্ধতি হল ।

p=(int)malloc (40*sizeof(int));

এখানে বোঝানো হইছে আমি ৪০ টি integer এর সমান জায়গা নির্ধারন করবো ।

malloc() function এর মাধ্যমে মেমোরি নির্ধারন করলে পাশাপাশি জায়গা নির্ধারণ হয় । যেমনঃ

p=(int)malloc (40*sizeof(int));

এর ফলে পাশাপাশি ১৬০ বাইট জায়গা নির্ধারন করা হবে । এই পাশাপাশি জায়গা নির্ধারণ করার ব্যাপারটাকে বলা হচ্ছে single block । মানে এক সাথে সবগুলো পাশাপাশি থাকবে । মাঝের কোন জায়গা ফাকা থাকবে না ।

ধরলাম আমি নিচের এরেটি ইনপুট নিতে চাচ্ছি এবং আউটপুট দিতে চাচ্ছি।

1  2  3  4
5  6  7  8
9  10 11 12

এখানে ৩ টি সারি ও ৪ টি কলাম। আপনার অন্য হতে পারে তাই আমি এগুলর মান ভেরিয়েবলে নিচ্ছি।

int r = 3, c = 4;

২ ডাইমেনশনাল এর জন্য দুইটা পয়েন্টার ।

 int **arr;

এর মানে হচ্ছে কতগুলো সারি হবে তার মেমোরি নির্ধারন কতে হবে ।

arr = arr = (int **)malloc(r * sizeof(int *));

এখানে r (=3) সংখ্যক সারির জন্য জায়গা নির্ধারণ হল কিন্তু প্রত্যেক সারিতে কি পরিমান জায়গা হবে তা এখন নির্ধারন হয় নি ।

for (i=0; i<r; i++)
     arr[i] = (int *)malloc(c * sizeof(int));

এখানে r (=3) সংখ্যক সারির প্রত্যেকের জন্য c (=4) জায়গা নির্ধারণ হল । এখন **arr হয়ে গেলো অনেকটা এরকম arr[3][4] এর মতো । এখন এটি নিয়ে কাজ করবো ।

// ইনপুট এর জন্য
count = 0;
for (i = 0; i <  r; i++)
  for (j = 0; j < c; j++)
     arr[i][j] = ++count;


// আউটপুট এর জন্য 
for (i = 0; i <  r; i++)
  for (j = 0; j < c; j++)
     printf("%d ", arr[i][j]);

মেমোরি ফ্রি করতে গেলেও লুপ দিয়ে করতে হবে ।

প্রথমে সব সারির কলাম গুলো:

for (i=0; i<3; ++i) {
   free(arr[i]);
}

তারপর সারিগুলোঃ

free(arr);
permanent link

answered 23 Jan '15, 04:24

Sharif%20Chowdhury's gravatar image

Sharif Chowdhury
3.5k111

edited 23 Jan '15, 08:16

malloc() ফাংশন কখনো ভ্যালু স্টোর করে না, এটা শুধু মেমোরি অ্যালোকেট করে। এই অ্যালোকেটেড মেমোরি uninitialized অবস্থায় থাকে, এতে নির্দিষ্ট কোনো মান থাকে না।

এই ফাংশনের ডিক্লারেশন এরকম:

void *malloc(size_t size);

অর্থাৎ এই ফাংশনে একটা size_t টাইপের মান প্যারামিটার হিসাবে দিতে হয় (যত বাইট অ্যালোকেট করা প্রয়োজন), আর এটা রিটার্ন করে একটা ভয়েড পয়েন্টার (অ্যালোকেটেড মেমরির প্রথম বাইটের অ্যাড্রেস)।

int *p = (int*) malloc(50 * sizeof(int));

উপরের স্টেটমেন্টে malloc এর প্যারামিটার হিসাবে পাঠানো হচ্ছে 50 * sizeof(int)। সাধারণত int ডাটা টাইপের সাইজ হয় 4 বাইট, কাজেই এই ফাংশন কলে 50 * 4 = 200 বাইট মেমরি অ্যালোকেট হবে, আর রিটার্ন ভ্যালু হিসাবে আমরা পাবো এই 200 বাইটের প্রথমটার অ্যাড্রেস। যেহেতু এটা ভয়েড পয়েন্টার, এটাকে নিয়ে কাজ করতে হলে (যেমন ভ্যালু রিড/রাইট করতে হলে) একে প্রয়োজনীয় ডাটা টাইপের পয়েন্টারে কাস্ট করতে হবে, তাই এর সামনে (int*) লেখা। এখন p কে যেকোনো ইন্টেজার অ্যারের মতই ব্যবহার করা যাবে। p[0] লিখলে সেটা এই মেমরির প্রথম 4 বাইটকে বুঝাবে, p[1] বললে তার পরের 4 বাইট।

এই ধারণা কাজে লাগিয়ে 2-dimensional অ্যারেও তৈরি করা যায়। একটা টু ডাইমেনশনাল অ্যারেকে বলা যায় এমন একটা ওয়ান ডাইমেনশনাল অ্যারে যার প্রত্যেকটা উপাদান হল এক একটা ওয়ান ডাইমেনশনাল অ্যারে। যেহেতু ওয়ান ডাইমেনশনাল অ্যারে তৈরি করতে আমরা malloc করে পাওয়া মেমরিকে পয়েন্টার দিয়ে ধরে রাখি, কাজেই এরকম কয়েকটাকে ধরতে হলে আমাদের দরকার পয়েন্টারের অ্যারে, আর সেটাকে অ্যালোকেট করতে দরকার পয়েন্টারের পয়েন্টার। সেটা করা যায় এভাবে:

int **tab = (int**) malloc(5 * sizeof(int*));
int i;
for(i = 0; i < 5; i++) {
    tab[i] = (int*) malloc(6 * sizeof(int));
}

এখানে একটা 5x6 আকারের টু ডাইমেনশনাল ইন্টেজার অ্যারে তৈরি হল। এখন tab[i][j] বলতে এই অ্যারের i-তম সারির j-তম কলাম বুঝাবে।

alt text

এখানে এই বিষয়ে আলোচনা করা হয়েছে।

permanent link

answered 23 Jan '15, 04:51

0605002's gravatar image

0605002
4907

edited 23 Jan '15, 10:42

+1 for the image.

(26 Jan '15, 19:45) tahmidrafi ♦♦
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:

×402

question asked: 22 Jan '15, 18:58

question was seen: 1,835 times

last updated: 26 Jan '15, 19:45