Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التخصيص الديناميكي - malloc()

جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 32 من 63.

الآن ستتعلم عن malloc()، وهي الوظيفة الأساسية لطلب الذاكرة من الكومة (heap) أثناء تنفيذ البرنامج. ترمز الوظيفة malloc() إلى "تخصيص الذاكرة" (memory allocation) وتسمح لك بتخصيص الذاكرة ديناميكيًا عند حاجتك إليها، بدلاً من التصريح عن متغيرات ذات أحجام ثابتة في وقت التجميع (compile time).

تأخذ الدالة malloc() وسيطاً واحداً: وهو عدد البايتات التي تريد تخصيصها. وهي تعيد void pointer إلى كتلة الذاكرة المخصصة، أو NULL إذا فشل التخصيص. وبما أنها تعيد void pointer، يمكنك تعيينه مباشرة إلى مؤشر ذو نوع (typed pointer)؛ حيث أن عملية التحويل (casting) اختيارية في لغة C (على عكس لغة C++ التي تتطلب ذلك).

#include <stdlib.h>

int *ptr = (int*)malloc(sizeof(int));  // تخصيص ذاكرة لعدد صحيح واحد
// يشير ptr الآن إلى موقع في الذاكرة يمكنه استيعاب عدد صحيح

الميزة الأساسية لـ malloc() هي المرونة - يمكنك طلب مقدار الذاكرة الذي تحتاجه بالضبط في وقت التشغيل، وتظل هذه الذاكرة متاحة حتى تقوم بتحريرها صراحةً. هذا مفيد بشكل خاص عندما لا تعرف مقدار الذاكرة الذي ستحتاجه حتى يتم تشغيل برنامجك.

تذكر تضمين <stdlib.h> لاستخدام malloc()، فإن تحويل نوع مؤشر void المرتجع اختياري في لغة C، حيث يتم تحويله تلقائياً إلى النوع الذي تخصصه له.

challenge icon

التحدي

سهل

اكتب برنامجاً بلغة C يوضح التخصيص الديناميكي للذاكرة باستخدام malloc() لإنشاء والتعامل مع عدد صحيح واحد في الذاكرة الحيوية (heap). يجب أن يقوم برنامجك بما يلي:

  1. استخدام malloc() لتخصيص ذاكرة ديناميكياً لعدد صحيح واحد
  2. تحويل مؤشر void المرتجع إلى مؤشر عدد صحيح (integer pointer)
  3. قراءة قيمة عدد صحيح من مدخلات المستخدم
  4. تخزين القيمة المدخلة في الذاكرة المخصصة ديناميكياً باستخدام عامل إلغاء المرجعية (dereference operator)
  5. طباعة القيمة المخزنة بالتنسيق التالي: Stored value: [value]
  6. حساب وتخزين مربع القيمة في نفس موقع الذاكرة
  7. طباعة القيمة المربعة بالتنسيق التالي: Squared value: [value]

تذكر تضمين ملف الترويسة <stdlib.h> لاستخدام malloc(). يجب أن يوضح برنامجك سير العمل الأساسي لتخصيص الذاكرة الديناميكي: طلب الذاكرة من الـ heap، واستخدامها لتخزين البيانات ومعالجتها، والتعامل مع الذاكرة المخصصة من خلال عمليات المؤشرات.

على سبيل المثال، إذا أدخل المستخدم 7، يجب أن يكون مخرجك:

Stored value: 7
Squared value: 49

يقدم لك هذا التحدي المفهوم الأساسي لتخصيص الذاكرة الديناميكي، حيث يتم طلب الذاكرة أثناء وقت التشغيل بدلاً من أن تكون ثابتة في وقت الترجمة، مما يمنح برامجك مرونة أكبر في استخدام الذاكرة.

جرّب بنفسك

#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;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow