পয়েন্টার কেন গুরুত্বপূর্ণ তা বোঝার জন্য আপনাকে গাদা বরাদ্দ এবং স্ট্যাক বরাদ্দের মধ্যে পার্থক্য বুঝতে হবে।
নীচে স্ট্যাক বরাদ্দের উদাহরণ:
struct Foo {
int bar, baz
};
void foo(void) {
struct Foo f;
}
স্ট্যাক বরাদ্দ করা অবজেক্টগুলি কেবল বর্তমান ফাংশন সম্পাদনের সময়কালের জন্য বিদ্যমান exist কলটি যখন fooসুযোগের বাইরে চলে যায় তখন চলকটি হয় f।
আপনি যখন কোনও ফাংশন থেকে অবিচ্ছেদ্য ধরণের ব্যতীত অন্য কোনও কিছু ফেরত নিতে চান তখন একটি সমস্যা এটি হয়ে যায় (উদাহরণস্বরূপ উপরের উদাহরণ থেকে ফু কাঠামো) oo
উদাহরণস্বরূপ, নিম্নলিখিত ফাংশনটির ফলে তথাকথিত "অপরিজ্ঞাত আচরণ" হবে in
struct Foo {
int bar, baz
};
struct Foo *foo(void) {
struct Foo f;
return &f;
}
আপনি যদি struct Foo *কোনও ফাংশন থেকে এমন কিছু ফিরিয়ে দিতে চান যা আপনার সত্যিই প্রয়োজন তা হ'ল একটি বরাদ্দ:
struct Foo {
int bar, baz
};
struct Foo *foo(void) {
return malloc(sizeof(struct Foo));
}
ফাংশনটি mallocহিপগুলিতে একটি বস্তু বরাদ্দ করে এবং সেই বস্তুকে একটি পয়েন্টার দেয় returns নোট করুন যে "অবজেক্ট" শব্দটি এখানে lyিলে .ালাভাবে ব্যবহৃত হয়, যার অর্থ বস্তু-ভিত্তিক প্রোগ্রামিংয়ের অর্থে অবজেক্টের চেয়ে "কিছু"।
হিপ-বরাদ্দ হওয়া সামগ্রীর আজীবন প্রোগ্রামার দ্বারা নিয়ন্ত্রিত হয়। প্রোগ্রামার এটিকে মুক্ত না করা, অর্থাত্ ফোন করে free()বা প্রোগ্রামটি প্রস্থান না হওয়া অবধি এই অবজেক্টের স্মৃতি মজুদ থাকবে।
সম্পাদনা : আমি এই প্রশ্নটি C ++ প্রশ্ন হিসাবে ট্যাগ করা আছে তা লক্ষ্য করতে ব্যর্থ হয়েছি। সি ++ অপারেটর newএবং new[]একই ফাংশন সম্পাদন করে malloc। অপারেটরগুলি deleteএবং delete[]এর সাথে সাদৃশ্যপূর্ণ free। যদিও newএবং deleteসি ++ অবজেক্টগুলি বরাদ্দ এবং বিনামূল্যে করার জন্য একচেটিয়াভাবে ব্যবহার করা উচিত, তবে সি ++ কোডে ব্যবহার mallocএবং freeএটি পুরোপুরি আইনী।