কিভাবে C তে ম্যালক ফাংশন ব্যবহার করবেন

How Use Malloc Function C



ম্যালোক একটি অন্তর্নির্মিত ফাংশন যা হেডার ফাইলে ঘোষিত হয়। ম্যালোক হল 'মেমরি বরাদ্দকরণ' এর সংক্ষিপ্ত নাম এবং নির্দিষ্ট আকার অনুসারে সংগত মেমরির একটি বড় ব্লককে গতিশীলভাবে বরাদ্দ করতে ব্যবহৃত হয়। মেমরি বরাদ্দ দুই ধরনের আছে স্ট্যাটিক এবং গতিশীল। স্ট্যাটিক মেমরি বরাদ্দ সংকলনের সময় করা হয়, এবং এটি রানটাইমের সময় পরিবর্তন হয় না। ডায়নামিক মেমরি বরাদ্দ এই জন্য রানটাইম সময়ে মেমরি বরাদ্দ করা হয়; আমরা malloc ব্যবহার করি। এখন বিন্দু হল এই মেমরি থেকে কোথা থেকে আসছে, তাই সি এর সমস্ত গতিশীল প্রয়োজনীয়তা হিপ মেমরি থেকে পূরণ করা হয়। মূলত, আমাদের অ্যাপ্লিকেশন/প্রোগ্রামের মেমরি 3 ধরণের থাকবে

  • স্ট্যাক মেমরি প্রতিটি পদ্ধতির জন্য স্থানীয়, এবং যখন পদ্ধতিটি ফিরে আসে, স্ট্যাক স্বয়ংক্রিয়ভাবে এটি পরিষ্কার করে।
  • গ্লোবাল মেমরি এলাকা সমস্ত গ্লোবাল ভেরিয়েবলের জন্য মেমরি বরাদ্দ করে। এই মেমরি এলাকাটি প্রোগ্রামের শুরুতে তৈরি করা হয়, এবং শেষ পর্যন্ত, এটি স্বয়ংক্রিয়ভাবে মেমরি এলাকা পরিষ্কার করে।
  • হিপ মেমরি সর্বদা শত্রু প্রোগ্রাম/অ্যাপ্লিকেশনের সমস্ত গতিশীল প্রয়োজনীয়তা পূরণ করে। যখনই আমরা malloc ফাংশন ব্যবহার করতে যাচ্ছি, এটি গাদা থেকে কিছু স্মৃতি ধার করতে যাচ্ছে এবং আমাদের এটির নির্দেশক দেবে।

বাক্য গঠন:







Malloc এর সিনট্যাক্স হল (void*) malloc (size_t size)। সুতরাং সিনট্যাক্স বলছে যে মলোকের একটি আকার প্রয়োজন, এটি মূলত একটি অকার্যকর পয়েন্টার এবং আকার টিকে স্বাক্ষরবিহীন পূর্ণসংখ্যা হিসাবে সংজ্ঞায়িত করবে। ম্যালোক ফাংশন কেবল গাদাতে নির্দিষ্ট আকার অনুসারে একটি মেমরি ব্লক বরাদ্দ করে যেমন আপনি সিনট্যাক্সে দেখতে পারেন যে আকারটি নির্দিষ্ট করা দরকার এবং সাফল্যে এটি বরাদ্দকৃত মেমরির প্রথম বাইটের দিকে নির্দেশ করে একটি পয়েন্টার প্রদান করে অন্যটি নুল ফেরত দেয় । সুতরাং, ম্যালোকের কাজ হল রান টাইমে মেমরি বরাদ্দ করা।



কেন অকার্যকর পয়েন্টার:

ম্যালোক এর কোন দিকে ইঙ্গিত করছে তার কোন ধারণা নেই; এর সহজ অর্থ হলো, সেই মেমরির অবস্থানে কোন তথ্য সংরক্ষণ করা হবে তা জানে না। এটি কেবল ব্যবহারকারীর অনুরোধকৃত মেমরি বরাদ্দ করে মেমরির ভিতরে সংরক্ষণ করা ডেটার ধরন না জেনে। এজন্য এটি একটি অকার্যকর পয়েন্টার ফিরিয়ে দিচ্ছে।



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





এখানে আমরা ম্যালোককে 6 বাইট মেমরি বরাদ্দ করতে বলছি যদি এটি একটি সফল ম্যালোক একটি অকার্যকর পয়েন্টার ফিরিয়ে দেয়। সেই ক্ষেত্রে, আমাদের এটি একটি পূর্ণসংখ্যা টাইপ পয়েন্টার টাইপকাস্ট করতে হবে কারণ আমরা সেই মেমরিতে একটি পূর্ণসংখ্যা সংরক্ষণ করতে চাই। এখানে ম্যালোক একটি স্তূপে 6 বাইট মেমরি বরাদ্দ করে, এবং প্রথম বাইটের ঠিকানা পয়েন্টার ptr এ সংরক্ষিত থাকে।



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

সঠিক উপায়ে মলোকের ধারণাটি বোঝার জন্য এখানে একটি সহজ উদাহরণ প্রোগ্রাম।

এখানে আপনি দেখতে পারেন printf ফাংশন দিয়ে আমি ব্যবহারকারীকে পূর্ণসংখ্যার সংখ্যা লিখতে বলছি। আমরা i এবং n এর উপরে দুটি ভেরিয়েবল ঘোষণা করেছি। পরিবর্তনশীল n হল সেই জায়গা যেখানে আমরা ব্যবহারকারীর প্রবেশ করা নম্বর সংরক্ষণ করব। এর পরে, আমাদের malloc ফাংশন আছে; আমরা চাই malloc n পূর্ণসংখ্যার আকারের সমতুল্য আকার বরাদ্দ করতে। আমরা যদি n এর সাথে int দিয়ে সাইজ গুন করি; এটি আমাদের n পূর্ণসংখ্যার আকার দেবে। এর পরে, malloc একটি অকার্যকর পয়েন্টার ফিরিয়ে দেবে, এবং আমরা এটি একটি পূর্ণসংখ্যা পয়েন্টার টাইপকাস্ট করছি, এবং আমরা ঠিকানাটি ptr পয়েন্টারের মধ্যে সংরক্ষণ করছি। টাইপকাস্টিং গুরুত্বপূর্ণ কারণ এটি একটি ভাল অনুশীলন।

এখন, যদি পয়েন্টারটিতে NULL থাকে, তার মানে মেমরি পাওয়া যায় না। সুতরাং আমরা কেবল প্রস্থান ব্যর্থতার অবস্থা সহ প্রোগ্রাম থেকে প্রস্থান করব। যদি এটি না হয়, আমরা সহজেই একটি লুপ চালাতে পারি।

লুপটি 0 থেকে n-1 পর্যন্ত চলবে এবং আমরা ব্যবহারকারীকে প্রতিবার একটি করে পূর্ণসংখ্যা লিখতে বলব। স্ক্যানফ ফাংশনের মধ্যে, একটি জিনিস ptr+i লেখা আছে যেমন আমরা জানি যে ptr মেমরির প্রথম বাইটের ঠিকানা রয়েছে। ধরা যাক যে ঠিকানাটি এখানে 1000 আমি প্রথমে শূন্যের সমান তাই 1000+0 হল 1000 তাই সেই ঠিকানার মধ্যে আমাদের প্রথম পূর্ণসংখ্যা সংরক্ষণ করা হবে তারপর তার পরে যখন আমি 1 হয়ে যাই 1000+1 যা অভ্যন্তরীণভাবে ব্যাখ্যা করা হয়েছে (1000) +1 *4 যদি আমি অনুমান করি যে পূর্ণসংখ্যার আকার 4 বাইট, এবং এটি 1004 এর সমান হবে, তাই পরবর্তী পূর্ণসংখ্যা 1004 অবস্থানের মধ্যে সংরক্ষণ করা হবে। এবং এটি এভাবে চলতে থাকবে ঠিকানাগুলো হল 1000, 1004, 1008 ইত্যাদি। আমরা ptr+i এর আগে আম্পারস্যান্ড ব্যবহার করছি না কারণ আমরা যখন ptr লিখি তখন ptr ইতিমধ্যেই আমাদের ঠিকানা দিচ্ছে, যা কেবল একটি পয়েন্টার, এবং এতে ঠিকানা আছে, মান নয়, তাই এর আগে ampersand লাগানোর কোন প্রয়োজন নেই, এবং এই ধারণাটি পরিষ্কার হওয়া উচিত।

এখানে এই লুপে, আমরা কেবল একটি কাজ করছি যা আমরা পর্দায় সমস্ত পূর্ণসংখ্যা মুদ্রণ করছি; স্পষ্টতই, আমরা ptr+i ব্যবহার করছি, কিন্তু এখানে, এই ক্ষেত্রে, আমরা এটিকে ডিফারেন্স করছি কারণ ptr+i একটি ঠিকানা প্রতিনিধিত্ব করে, তাই আমাদের এটিকে ডিফারেন্স করতে হবে। যদি আমি 0 এর সমান, এটি 1000 হবে কারণ আমরা ধরে নিচ্ছি যে প্রথম ঠিকানাটি 1000 হবে, তাই আমরা এটিকে ডিফারেন্স করছি; আমরা প্রথম পূর্ণসংখ্যা পাব তারপর আমি 1 এর সমান, এবং এটি 1001 হয়ে যাবে কিন্তু পূর্ণসংখ্যার আকার 4 হলে 1004 হিসাবে ব্যাখ্যা করা হবে। আবার। আমরা এটিকে ডিফারেন্স করছি, তাই এটি আমাদের 2 দেবেndপূর্ণসংখ্যা এই ভাবে, সবকিছু কাজ করে।

সুতরাং, এটি মূলত একটি সহজ প্রোগ্রাম যা ব্যবহারকারীদের n পূর্ণসংখ্যা লিখতে বলছে, এবং তারপর আমরা কেবল পর্দায় সেই পূর্ণসংখ্যা প্রদর্শন করছি। প্রোগ্রামটি চালানোর পরে, এটি প্রদর্শিত হবে।

প্রথমত, আমরা ব্যবহারকারীকে পূর্ণসংখ্যার সংখ্যা লিখতে বলছি, এবং তারপর ব্যবহারকারী পূর্ণসংখ্যা প্রবেশ করছে, এবং আমরা কেবল পর্দায় তাদের প্রদর্শন করছি।

উপসংহার:

উপরের প্রোগ্রামে কোন ভুল নেই যতক্ষণ না আমরা এটিকে দীর্ঘদিন ধরে চালিয়ে যাচ্ছি এখানে আমরা গাদা থেকে মেমরি ধার করছি, কিন্তু আমরা মেমরিটি কখনই ফেরত দিচ্ছি না এটি কেবল সেই ক্ষেত্রেই ঘটে যেখানে প্রোগ্রাম/অ্যাপ্লিকেশন আছে ২ duration ঘণ্টার মতো দীর্ঘ সময় ধরে চালানো। তারা আবার malloc ফাংশন কল করবে, এবং আবার এর মানে হল যে তারা প্রতিবার গাদা থেকে মেমরি ধার করছে এবং কখনই ফিরে আসছে না, এটি খারাপ প্রোগ্রামিং, তাই আমাদের ফিরে আসার আগে বিনামূল্যে (মেমরির ঠিকানা যা প্রকাশ করা উচিত) লিখতে হবে। তাই যখনই malloc ফ্রি ব্যবহার করা গুরুত্বপূর্ণ। সুতরাং, malloc ব্যবহার করে, আমরা মেমরি সংরক্ষণ করেছি, এবং malloc মেমরি বরাদ্দ করে যত বড় আপনি এটি জিজ্ঞাসা করেন।

শুভ গতিশীল মেমরি বরাদ্দ!