سی میں میلوک فنکشن کا استعمال کیسے کریں

How Use Malloc Function C



میلوک ایک بلٹ ان فنکشن ہے جس کا اعلان ہیڈر فائل میں کیا گیا ہے۔ میلوک 'میموری مختص' کا مختصر نام ہے اور اسے مخصوص سائز کے مطابق متحرک میموری کے ایک بڑے بلاک کو متحرک طور پر مختص کرنے کے لیے استعمال کیا جاتا ہے۔ دو طرح کی میموری مختص کی جاتی ہیں جامد اور متحرک۔ جامد میموری مختص تالیف کے وقت کیا جاتا ہے ، اور یہ رن ٹائم کے وقت تبدیل نہیں ہوتا ہے۔ متحرک میموری مختص اس کے لیے رن ٹائم پر میموری مختص کر رہا ہے۔ ہم malloc استعمال کرتے ہیں۔ اب نقطہ یہ ہے کہ یہ میموری کہاں سے آرہی ہے ، لہذا سی میں تمام متحرک تقاضے ڈھیر میموری سے پورے ہوتے ہیں۔ بنیادی طور پر ، ہماری درخواست/پروگرام میں 3 قسم کی میموری ہوگی۔

  • اسٹیک میموری ہر طریقہ کے لیے مقامی ہے ، اور جب طریقہ واپس آجائے تو ، اسٹیک خود بخود صاف ہوجاتا ہے۔
  • عالمی میموری علاقہ تمام عالمی متغیرات کے لیے میموری مختص کرتا ہے۔ یہ میموری ایریا پروگرام کے آغاز میں بنایا گیا ہے ، اور آخر میں ، یہ خود بخود میموری ایریا کو صاف کرتا ہے۔
  • ہیپ میموری ہمیشہ دشمن ہے جو پروگرام/ایپلیکیشن کی تمام متحرک ضروریات کو پورا کرتا ہے۔ جب بھی ہم میلوک فنکشن کو استعمال کرنے جارہے ہیں ، یہ ڈھیر سے کچھ میموری ادھار لے گا اور ہمیں اس کی طرف اشارہ دے گا۔

نحو:







malloc کا نحو (void*) malloc (size_t size) ہے۔ تو نحو کہتا ہے کہ میلوک کو ایک سائز کی ضرورت ہوتی ہے ، یہ پوائنٹر کو بنیادی طور پر ایک باطل پوائنٹر لوٹائے گا اور سائز ٹی کو بغیر دستخط شدہ عدد کے طور پر بیان کیا گیا ہے۔ میلوک فنکشن صرف ڈھیر میں بتائے گئے سائز کے مطابق ایک میموری بلاک مختص کرتا ہے جیسا کہ آپ نحو میں دیکھ سکتے ہیں کہ سائز کو مخصوص کرنے کی ضرورت ہے اور ، کامیابی پر ، یہ مختص شدہ میموری کے پہلے بائٹ کی طرف اشارہ کرتے ہوئے ایک پوائنٹر لوٹاتا ہے۔ . لہذا ، میلوک کا کام رن ٹائم پر میموری مختص کرنا ہے۔



کیوں باطل پوائنٹر:

میلوک کو اندازہ نہیں ہے کہ یہ کس چیز کی طرف اشارہ کر رہا ہے۔ اس کا سیدھا مطلب ہے کہ یہ نہیں جانتا کہ اس میموری لوکیشن میں کون سا ڈیٹا سٹور ہوگا۔ یہ صرف میموری کے اندر ذخیرہ کیے جانے والے ڈیٹا کی قسم کو جانے بغیر صارف کی درخواست کردہ میموری کو مختص کرتا ہے۔ یہی وجہ ہے کہ یہ ایک باطل پوائنٹر لوٹ رہا ہے۔



میلوک صرف میموری مختص کرتا ہے اس کے بعد صارف کی ذمہ داری ہوتی ہے کہ وہ مناسب قسم پر ٹائپ کاسٹ کرے تاکہ اسے پروگرام میں صحیح طریقے سے استعمال کیا جاسکے۔ باطل پوائنٹر ایک پوائنٹر ہے جو کسی بھی قسم کے ڈیٹا کی نشاندہی کر سکتا ہے۔





یہاں ہم میلوک سے کہہ رہے ہیں کہ اب 6 بائٹس میموری مختص کریں اگر یہ کامیاب میلوک ایک باطل پوائنٹر لوٹائے گا۔ اس صورت میں ، ہمیں اسے ایک انٹیجر ٹائپ پوائنٹر پر ٹائپ کاسٹ کرنا ہوگا کیونکہ ہم اس میموری میں ایک انٹیجر اسٹور کرنا چاہتے ہیں۔ یہاں میلوک ایک ڈھیر میں 6 بائٹ میموری مختص کرتا ہے ، اور پہلے بائٹ کا پتہ پوائنٹر پی ٹی آر میں محفوظ ہوتا ہے۔



مثال کے پروگرام:

مولوک کے تصور کو مناسب طریقے سے سمجھنے کے لیے یہاں ایک سادہ مثال پروگرام ہے۔

یہاں آپ پرنٹف فنکشن کے ساتھ دیکھ سکتے ہیں میں صارف سے عدد کی تعداد درج کرنے کو کہہ رہا ہوں۔ ہم نے i اور n کے اوپر دو متغیرات کا اعلان کیا ہے۔ متغیر n وہ جگہ ہے جہاں ہم صارف کے درج کردہ نمبر کو محفوظ کریں گے۔ اس کے بعد ، ہمارے پاس malloc فنکشن ہے۔ ہم چاہتے ہیں کہ میلوک سائز کو این انٹیجرز کے سائز کے برابر مختص کرے۔ ہم سائز کو ضرب دے رہے ہیں اگر int n کے ساتھ؛ یہ ہمیں 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+i ایک پتے کی نمائندگی کرتا ہے ، لہذا ہمیں اس کا حوالہ دینے کی ضرورت ہے۔ اگر میں 0 کے برابر ہوں تو یہ 1000 ہو گا کیونکہ ہم فرض کر رہے ہیں کہ پہلا پتہ 1000 ہو گا ، اس لیے ہم اس کا حوالہ دے رہے ہیں۔ ہمیں پہلا عدد ملے گا پھر میں 1 کے برابر ہوں گا ، اور یہ 1001 ہو جائے گا لیکن 1004 سے تعبیر کی جائے گی اگر عدد کا سائز 4 ہے۔ ہم اس کا حوالہ دے رہے ہیں ، لہذا یہ ہمیں 2 دے گا۔این ڈیعدد اس طرح ، سب کچھ کام کرتا ہے۔

لہذا ، یہ بنیادی طور پر ایک سادہ پروگرام ہے جو صارفین کو n انٹیجر داخل کرنے کے لیے کہہ رہا ہے ، اور پھر ہم صرف ان انٹیجرز کو اسکرین پر ڈسپلے کر رہے ہیں۔ پروگرام پر عمل کرنے کے بعد ، یہ ظاہر ہوگا۔

پہلے ، ہم صارف سے عدد کی تعداد درج کرنے کے لیے کہہ رہے ہیں ، اور پھر صارف عدد میں داخل ہو رہا ہے ، اور ہم انہیں صرف اسکرین پر ظاہر کر رہے ہیں۔

نتیجہ:

مذکورہ پروگرام میں کوئی حرج نہیں ہے جب تک کہ ہم اسے بہت لمبے عرصے تک جاری رکھتے ہیں یہاں ہم ڈھیر سے میموری ادھار لے رہے ہیں ، لیکن ہم میموری کو کبھی ڈھیر کرنے کے لیے واپس نہیں کر رہے ہیں یہ صرف اسی صورت میں ہوتا ہے جہاں پروگرام/ایپلیکیشن ہو 24 گھنٹے کی طرح طویل عرصے تک چلائیں۔ وہ دوبارہ میلوک فنکشن کو کال کریں گے ، اور پھر اس کا مطلب ہے کہ جب بھی وہ ڈھیر سے میموری ادھار لیتے ہیں اور کبھی واپس نہیں آتے ، یہ برا پروگرامنگ ہے ، لہذا ہمیں لوٹنے سے پہلے مفت (میموری کا پتہ جو جاری ہونا چاہیے) لکھنا چاہیے۔ لہذا جب بھی malloc مفت استعمال کرنا ضروری ہے۔ تو ، malloc کا استعمال کرتے ہوئے ، ہمارے پاس محفوظ میموری ہے ، اور malloc میموری کو اتنا ہی مختص کرتا ہے جتنا آپ پوچھتے ہیں۔

خوشگوار متحرک میموری مختص!