الدرس 22: الذاكرة الديناميكية — stack وheap وmalloc
حتى الآن كانت جميع متغيراتنا تعيش على المكدس (stack): تُنشأ تلقائيًا، وحجمها ثابت مسبقًا، وتختفي عند انتهاء الدالة. أحيانًا لا يكفي ذلك — على سبيل المثال عندما تريد مصفوفة يُعرف حجمها فقط في وقت التشغيل. هذا هو الغرض من الكومة (heap): تطلب الذاكرة باستخدام malloc(sizeof(int)) من الترويسة stdlib.h، و
المكدس (stack) يشبه صينية الكافتيريا: تحصل عليها تلقائيًا وتُؤخذ منك في نهاية الوجبة دون سؤال. الكومة (heap) تشبه منشأة تأجير مخازن: تطلب وحدة بأي حجم تختاره (malloc)، وتحصل على مفتاح (المؤشر)، والوحدة ملكك — حتى تُعيد المفتاح (free). إذا فقدت المفتاح دون إعادته، تبقى الوحدة مشغولة.
- المكدس (stack)
- منطقة ذاكرة تلقائية: تعيش فيها المتغيرات المحلية وتختفي عند انتهاء الدالة. يجب أن يكون حجمها ثابتًا مسبقًا.
- الكومة (heap)
- منطقة ذاكرة تطلب منها كتلًا في وقت التشغيل. ما طلبته، أنت مسؤول عن تحريره باستخدام free.
- malloc(size)
- تطلب كتلة بحجم size بايت من الكومة وتُعيد عنوانها، أو NULL عند الفشل. تتطلب #include <stdlib.h>.
- free(p)
- تُعيد الكتلة التي يشير إليها p إلى الكومة. كل malloc يحتاج free واحدًا عند الانتهاء.
- فحص NULL
- مباشرة بعد malloc، تحقق من if (p == NULL) — عندما لا تكون هناك ذاكرة حرة كافية، تُعيد malloc قيمة NULL ويجب عدم استخدام المؤشر.