التخصيص الديناميكي - malloc()
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 32 من 63.
الآن ستتعلم عن malloc()، وهي الدالة الأساسية لطلب الذاكرة من الـ heap أثناء تنفيذ البرنامج. ترمز الدالة malloc() إلى "تخصيص الذاكرة" (memory allocation) وتسمح لك بتخصيص الذاكرة ديناميكيًا عندما تحتاج إليها، بدلاً من التصريح عن متغيرات ذات حجم ثابت في وقت التجميع (compile time).
تأخذ الدالة malloc() وسيطًا واحدًا: وهو عدد البايتات التي تريد تخصيصها. وهي تعيد مؤشر void إلى كتلة الذاكرة المخصصة، أو NULL إذا فشل التخصيص. وبما أنها تعيد مؤشر void، يجب عليك تحويله إلى نوع البيانات المناسب.
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // تخصيص ذاكرة لعدد صحيح واحد
// ptr يشير الآن إلى موقع في الذاكرة يمكنه استيعاب عدد صحيحالميزة الأساسية لـ
malloc()هي المرونة - حيث يمكنك طلب مقدار الذاكرة الذي تحتاجه بالضبط في وقت التشغيل، وتظل هذه الذاكرة متاحة حتى تقوم بتحريرها بشكل صريح. وهذا مفيد بشكل خاص عندما لا تعرف مقدار الذاكرة التي ستحتاجها حتى يبدأ برنامجك في العمل.
تذكر تضمين <stdlib.h> لاستخدام malloc()، وقم دائمًا بتحويل مؤشر void المرتجع ليطابق نوع البيانات الذي تعمل معه.
التحدي
سهلاكتب برنامجاً بلغة C يوضح التخصيص الديناميكي للذاكرة باستخدام malloc() لإنشاء والتعامل مع عدد صحيح واحد في الـ heap. يجب أن يقوم برنامجك بما يلي:
- استخدام
malloc()لتخصيص ذاكرة ديناميكياً لعدد صحيح واحد - تحويل مؤشر void المرتجع إلى مؤشر عدد صحيح (integer pointer)
- قراءة قيمة عدد صحيح من مدخلات المستخدم
- تخزين القيمة المدخلة في الذاكرة المخصصة ديناميكياً باستخدام عامل إلغاء المرجعية (dereference operator)
- طباعة القيمة المخزنة بالتنسيق التالي:
Stored value: [value] - حساب وتخزين مربع القيمة في نفس موقع الذاكرة
- طباعة القيمة المربعة بالتنسيق التالي:
Squared value: [value]
تذكر تضمين الترويسة <stdlib.h> لاستخدام malloc(). يجب أن يوضح برنامجك سير العمل الأساسي لتخصيص الذاكرة الديناميكي: طلب الذاكرة من الـ heap، واستخدامها لتخزين البيانات ومعالجتها، والتعامل مع الذاكرة المخصصة من خلال عمليات المؤشرات.
على سبيل المثال، إذا أدخل المستخدم 7، يجب أن يكون مخرجك:
Stored value: 7
Squared value: 49يقدم لك هذا التحدي المفهوم الأساسي لتخصيص الذاكرة الديناميكي، حيث يتم طلب الذاكرة في وقت التشغيل (runtime) بدلاً من أن تكون ثابتة في وقت التجميع (compile time)، مما يمنح برامجك مرونة أكبر في استخدام الذاكرة.
ورقة مرجعية
تقوم الدالة malloc() بتخصيص الذاكرة ديناميكيًا من الذاكرة الحرة (heap) أثناء تنفيذ البرنامج. وهي تأخذ عدد البايتات المراد تخصيصها وتعيد مؤشرًا من النوع void إلى كتلة الذاكرة المخصصة، أو NULL في حالة فشل التخصيص.
قم بتضمين <stdlib.h> لاستخدام malloc():
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // تخصيص ذاكرة لعدد صحيح واحدنقاط رئيسية:
- قم دائمًا بتحويل المؤشر void المرتجع إلى نوع البيانات المناسب
- تظل الذاكرة متاحة حتى يتم تحريرها صراحةً
- توفر المرونة لطلب كميات محددة من الذاكرة في وقت التشغيل
- استخدم
sizeof()لتحديد العدد الصحيح من البايتات المطلوبة
جرّب بنفسك
#include <stdio.h>
#include <stdlib.h>
int main() {
// قراءة المدخلات
int input_value;
scanf("%d", &input_value);
// TODO: اكتب كودك أدناه
// 1. استخدم malloc() لتخصيص ذاكرة لعدد صحيح واحد
// 2. قم بتحويل المؤشر المرتجع إلى *int
// 3. قم بتخزين قيمة المدخلات في الذاكرة المخصصة
// 4. اطبع القيمة المخزنة
// 5. احسب المربع وقم بتخزينه في نفس الموقع
// 6. اطبع القيمة المربعة
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية6إدارة الذاكرة
ذاكرة Stack مقابل Heapالتخصيص الديناميكي - malloc()استخدام sizeof() للتخصيصالتحقق من فشل التخصيصتحرير الذاكرة باستخدام free()التخصيص باستخدام calloc()ملخص: المصفوفة الديناميكية