ذاكرة Stack مقابل Heap
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 31 من 63.
عندما يتم تشغيل برنامج C الخاص بك، فإنه يستخدم منطقتين متميزتين من الذاكرة: المكدس (stack) والكومة (heap). إن فهم الفرق بين منطقتي الذاكرة هاتين أمر بالغ الأهمية لبرمجة C الفعالة، خاصة عند العمل مع المؤشرات وتخصيص الذاكرة الديناميكي.
يُستخدم **المكدس (stack)** لتخصيص الذاكرة الثابت. هذا هو المكان الذي يتم فيه تخزين متغيراتك المحلية، ومعلمات الدوال، ومعلومات استدعاء الدوال. تتم إدارة المكدس تلقائيًا بواسطة النظام - فعندما تعلن عن متغير محلي، يتم تخصيص ذاكرة في المكدس، وعندما يخرج المتغير عن النطاق، يتم تحرير تلك الذاكرة تلقائيًا.
void function() {
int x = 10; // يتم تخصيصه في المكدس (stack)
char arr[100]; // يتم تخصيصه أيضاً في المكدس (stack)
// يتم تحرير الذاكرة تلقائياً عند انتهاء الدالة
}تُستخدم الـ heap لتخصيص الذاكرة الديناميكي. هذا تجمع أكبر من الذاكرة يمكنك طلبه أثناء تنفيذ البرنامج.
على عكس المكدس (stack)، تتطلب الكومة (heap) إدارة يدوية - يجب عليك طلب الذاكرة صراحةً ثم تحريرها لاحقاً عند الانتهاء منها. يمنحك هذا تحكماً أكبر ولكن أيضاً مسؤولية أكبر.
الفرق الجوهري يكمن في الإدارة: ذاكرة المكدس (stack memory) تلقائية ومحدودة الحجم، بينما ذاكرة الكومة (heap memory) يدوية وأكبر بكثير. في الدروس القادمة، ستتعلم كيفية التعامل مع ذاكرة الكومة باستخدام دوال مثل malloc() و free().
ورقة مرجعية
تستخدم برامج C منطقتين متميزتين من الذاكرة:
المكدس (Stack): يُستخدم لتخصيص الذاكرة الثابت. يقوم بتخزين المتغيرات المحلية، ومعاملات الدوال، ومعلومات استدعاء الدوال. تتم إدارة الذاكرة تلقائيًا - حيث يتم تخصيصها عند التصريح عن المتغيرات وتحريرها عندما تخرج عن نطاق العمل (scope).
void function() {
int x = 10; // تم تخصيصها في المكدس (stack)
char arr[100]; // تم تخصيصها أيضًا في المكدس (stack)
// يتم تحرير الذاكرة تلقائيًا عند انتهاء الدالة
}الكومة (Heap): تُستخدم لتخصيص الذاكرة الديناميكي. وهي عبارة عن تجمع أكبر من الذاكرة يتطلب إدارة يدوية - يجب عليك طلب الذاكرة وتحريرها صراحةً باستخدام دوال مثل malloc() و free().
الفرق الرئيسي: ذاكرة المكدس (Stack) تلقائية ومحدودة الحجم، بينما ذاكرة الكومة (Heap) يدوية وأكبر بكثير.
جرّب بنفسك
لا يتضمّن هذا الدرس تحدّيًا برمجيًا.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية