كيفية استخدام وظيفة MALLOC في لغة C

How Use Malloc Function C



Malloc هي وظيفة مضمنة تم الإعلان عنها في ملف الرأس. Malloc هو الاسم المختصر لـ 'تخصيص الذاكرة' ويستخدم لتخصيص كتلة واحدة كبيرة من الذاكرة المتجاورة ديناميكيًا وفقًا للحجم المحدد. هناك نوعان من تخصيص الذاكرة ثابت وديناميكي. يتم تخصيص الذاكرة الثابتة في وقت الترجمة ، ولا يتغير في وقت التشغيل. تخصيص الذاكرة الديناميكي هو تخصيص الذاكرة في وقت التشغيل لهذا الغرض ؛ نستخدم malloc. الآن النقطة هي من أين تأتي هذه الذاكرة ، لذلك يتم استيفاء جميع المتطلبات الديناميكية في C من ذاكرة الكومة. في الأساس ، سيحتوي التطبيق / البرنامج الخاص بنا على 3 أنواع من الذاكرة

  • تكون ذاكرة المكدس محلية لكل طريقة ، وعندما تعود الطريقة ، يمسحها المكدس تلقائيًا.
  • تخصص منطقة الذاكرة العالمية ذاكرة لجميع المتغيرات العامة. يتم إنشاء منطقة الذاكرة هذه في بداية البرنامج ، وفي النهاية ، تقوم تلقائيًا بمسح منطقة الذاكرة.
  • تعد ذاكرة الكومة دائمًا عدوًا يلبي جميع المتطلبات الديناميكية للبرنامج / التطبيق. عندما سنستخدم وظيفة malloc ، فسوف تستعير بعض الذاكرة من الكومة وتعطينا المؤشر إليها.

بناء الجملة:







صيغة malloc هي (باطل *) malloc (size_t size). لذا فإن الصيغة تقول أن malloc يتطلب حجمًا ، وسيعيد المؤشر أساسًا مؤشر فارغ ويتم تعريف الحجم t على أنه عدد صحيح بدون إشارة. تقوم وظيفة Malloc ببساطة بتخصيص كتلة ذاكرة وفقًا للحجم المحدد في الكومة كما ترون في بناء الجملة أن الحجم يحتاج إلى تحديد ، وعند النجاح ، تقوم بإرجاع مؤشر يشير إلى البايت الأول من الذاكرة المخصصة ، وإلا فإنه يُرجع NULL . لذا ، فإن وظيفة malloc هي تخصيص الذاكرة في وقت التشغيل.



لماذا المؤشر باطل:

مالوك ليس لديه فكرة عما يشير إليه ، هذا يعني ببساطة أنه لا يعرف البيانات التي سيتم تخزينها في موقع الذاكرة هذا. إنه يخصص فقط الذاكرة التي يطلبها المستخدم دون معرفة نوع البيانات المراد تخزينها داخل الذاكرة. هذا هو السبب في أنها تقوم بإرجاع مؤشر الفراغ.



تقوم Malloc فقط بتخصيص الذاكرة بعد ذلك تقع على عاتق المستخدم مسؤولية التلبيس إلى النوع المناسب بحيث يمكن استخدامه بشكل صحيح في البرنامج. مؤشر الفراغ هو مؤشر يمكن أن يشير إلى أي نوع من البيانات يقوم malloc بإرجاع مؤشر الفراغ لأنه لا يعرف نوع البيانات التي سيتم تخزينها داخل تلك الذاكرة.





نحن هنا نطلب من malloc تخصيص 6 بايت من الذاكرة الآن إذا نجحت malloc في إرجاع مؤشر الفراغ. في هذه الحالة ، يتعين علينا كتابتها إلى مؤشر نوع صحيح لأننا نريد تخزين عدد صحيح في تلك الذاكرة. هنا يخصص malloc 6 بايت من الذاكرة في كومة ، ويتم تخزين عنوان البايت الأول في المؤشر ptr.



برنامج مثال:

فيما يلي مثال بسيط لبرنامج لفهم مفهوم malloc بطريقة صحيحة.

هنا يمكنك أن ترى مع وظيفة printf أنا أطلب من المستخدم إدخال عدد الأعداد الصحيحة. لقد أعلنا عن متغيرين أعلاه i و n. المتغير n هو المكان الذي سنخزن فيه الرقم الذي أدخله المستخدم. بعد ذلك ، لدينا وظيفة malloc ؛ نريد من malloc تخصيص الحجم المكافئ لحجم الأعداد الصحيحة n. نقوم بضرب الحجم إذا كان int مع n ؛ هذا سيعطينا حجم الأعداد الصحيحة n. بعد ذلك ، سيعيد malloc مؤشر الفراغ ، ونقوم بتلبيسه إلى مؤشر عدد صحيح ، ونقوم بتخزين العنوان داخل مؤشر ptr. يعد التلبيس أمرًا مهمًا لأنه ممارسة جيدة.

الآن ، إذا كان المؤشر يحتوي على NULL ، فهذا يعني أن الذاكرة غير متوفرة. لذلك سنخرج ببساطة من البرنامج بحالة فشل الخروج. إذا لم يكن الأمر كذلك ، فيمكننا بسهولة تشغيل حلقة for.

سيتم تشغيل الحلقة من 0 إلى n-1 ، وسنطلب من المستخدم إدخال عدد صحيح واحدًا تلو الآخر في كل مرة. داخل وظيفة scanf ، يوجد شيء واحد مكتوب ptr + i كما نعلم أن ptr يحتوي على عنوان البايت الأول من الذاكرة. لنفترض أن العنوان هو 1000 هنا i يساوي صفرًا في البداية ، لذا فإن 1000 + 0 يساوي 1000 ، لذلك سيتم تخزين أول عدد صحيح داخل هذا العنوان ، ثم بعد ذلك عندما أصبح 1 ، وبالتالي فإن 1000 + 1 تم تفسيره داخليًا على أنه (1000) +1 * 4 إذا افترضت أن حجم العدد الصحيح هو 4 بايت ، وسيكون مساويًا لـ 1004 ، لذلك سيتم تخزين العدد الصحيح التالي في موقع 1004. وسيستمر هذا بهذه الطريقة تكون العناوين مثل 1000 و 1004 و 1008 وما إلى ذلك. نحن لا نستخدم علامة العطف قبل ptr + i لأن ptr يعطينا العنوان بالفعل عندما نكتب ptr ، وهو مجرد مؤشر ، ويحتوي على العنوان وليس القيمة ، لذلك لا يوجد شرط لوضع علامة العطف قبله ، و يجب أن يكون هذا المفهوم واضحا.

هنا في هذه الحلقة ، نقوم ببساطة بعمل شيء واحد وهو طباعة جميع الأعداد الصحيحة على الشاشة ؛ من الواضح أننا نستخدم ptr + i ، ولكن هنا ، في هذه الحالة ، نقوم بإلغاء الإشارة إليه لأن ptr + i يمثل عنوانًا ، لذلك نحتاج إلى إلغاء الإشارة إليه. إذا كان i يساوي 0 ، فسيكون 1000 لأننا نفترض أن العنوان الأول سيكون 1000 ، لذلك نقوم بإلغاء الإشارة إليه ؛ سنحصل على العدد الصحيح الأول ثم i يساوي 1 ، وسيصبح 1001 ولكن سيتم تفسيره على أنه 1004 إذا كان حجم العدد الصحيح هو 4. مرة أخرى. نحن نقوم بإلغاء الإشارة إليه ، لذلك سوف يعطينا 2اختصار الثانيعدد صحيح. بهذه الطريقة ، كل شيء يعمل.

لذلك ، هذا في الأساس برنامج بسيط يطلب من المستخدمين إدخال عدد صحيح ، ثم نقوم ببساطة بعرض هذه الأعداد الصحيحة على الشاشة. بعد تنفيذ البرنامج ، سيتم عرض هذا.

أولاً ، نطلب من المستخدم إدخال عدد الأعداد الصحيحة ، ثم يقوم المستخدم بإدخال الأعداد الصحيحة ، ونحن ببساطة نعرضها على الشاشة.

استنتاج:

لا يوجد شيء خاطئ في البرنامج أعلاه طالما أننا نواصله لفترة طويلة جدًا هنا ، فإننا نستعير الذاكرة من الكومة ، لكننا لا نعيد الذاكرة مرة أخرى إلى كومة يحدث فقط في هذه الحالة التي يكون فيها البرنامج / التطبيق للتشغيل لمدة طويلة مثل 24 ساعة. سوف يتصلون بوظيفة malloc مرة أخرى ، ومرة ​​أخرى هذا يعني أنه في كل مرة يستعيرون ذاكرة من الكومة ولا يعودون أبدًا ، فهذه برمجة سيئة ، لذلك يجب أن نكتب مجانًا (عنوان الذاكرة الذي يجب تحريره) قبل العودة. لذلك كلما كان استخدام malloc free أمرًا مهمًا. لذلك ، باستخدام malloc ، قمنا بحفظ الذاكرة ، ويقوم malloc بتخصيص ذاكرة كبيرة كما تطلبها.

تخصيص ذاكرة ديناميكي سعيد!