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

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

جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 32 من 63.

الآن ستتعلّم عن malloc()، وهي الدالة الأساسية لطلب memory من الـ heap أثناء تنفيذ البرنامج. تمثّل الدالة malloc() المصطلح "memory allocation"، وتتيح لك إجراء allocate ديناميكيًا لـ memory عند الحاجة إليها، بدلًا من التصريح عن متغيرات ذات حجم ثابت أثناء الترجمة.

تأخذ الدالة malloc() وسيطًا واحدًا: عدد وحدات البايت التي تريد allocateها. وتُرجع void pointer إلى كتلة الذاكرة allocated، أو NULL إذا فشلت عملية التخصيص. وبما أنها تُرجع void pointer، يمكنك إسنادها مباشرةً إلى pointer من نوع محدد؛ ويُعد إجراء التحويل الاختياري في C (بخلاف C++، الذي يتطلبه).

#include <stdlib.h>

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

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

تذكّر أن include <stdlib.h> لاستخدام malloc()؛ ويُعدّ تحويل المؤشر void returned اختياريًا في C، إذ يُحوَّل تلقائيًا إلى النوع الذي تُسنِده إليه.

challenge icon

التحدي

سهل

اكتب برنامج C يوضّح dynamic memory allocation باستخدام malloc() لإنشاء والعمل مع integer واحد في heap. يجب أن يقوم برنامجك بما يلي:

  1. استخدم malloc() لإجراء dynamic allocation لـ memory من أجل integer واحد
  2. حوّل void pointer المُعاد إلى integer pointer
  3. اقرأ قيمة integer من user input
  4. store قيمة input في memory المُخصّصة ديناميكيًا باستخدام dereference operator
  5. اطبع القيمة stored بالتنسيق: Stored value: [value]
  6. احسب square للقيمة وstore النتيجة في same memory location
  7. اطبع القيمة squared بالتنسيق: Squared value: [value]

تذكّر أن include ترويسة <stdlib.h> لاستخدام malloc(). يجب أن يوضّح برنامجك workflow الأساسي لـ dynamic memory allocation: طلب memory من heap، واستخدامها لتخزين البيانات ومعالجتها، والعمل مع memory المُخصّصة من خلال pointer operations.

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

Stored value: 7
Squared value: 49

يعرّفك هذا التحدي على المفهوم الأساسي لـ dynamic memory allocation، حيث يتم طلب memory أثناء runtime بدلًا من تثبيتها أثناء compile time، مما يمنح برامجك مرونة أكبر في استخدام memory.

جرّب بنفسك

#include <stdio.h>
#include <stdlib.h>

int main() {
    // اقرأ الإدخال
    int input_value;
    scanf("%d", &input_value);
    
    // TODO: اكتب الكود الخاص بك أدناه
    // 1. استخدم malloc() لتخصيص ذاكرة لعدد صحيح واحد
    // 2. حوّل المؤشر المُرجع إلى int*
    // 3. خزّن قيمة الإدخال في الذاكرة المخصصة
    // 4. اطبع القيمة المخزنة
    // 5. احسب وخزّن المربع في نفس الموقع
    // 6. Print the squared value
    
    return 0;
}
quiz iconاختبر نفسك

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

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم C عبر الإنترنت