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

التحقق من فشل التخصيص

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

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

هذا يعني أنه في كل مرة تستخدم فيها malloc()، يجب أن تتحقق مما إذا كان قد نجح قبل محاولة استخدام المؤشر المُعاد. سيؤدي استخدام مؤشر NULL إلى تعطل program الخاص بك مع حدوث خطأ تجزئة.

int *ptr = (int*)malloc(sizeof(int));

if (ptr == NULL) {
    printf("Memory allocation failed!\n");
    return -1;  // اخرج من البرنامج أو تعامل مع الخطأ
}

// من الآمن استخدام ptr هنا
*ptr = 42;

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

challenge icon

التحدي

سهل

اكتب program بلغة C يوضّح التعامل السليم مع error عند استخدام malloc() من أجل تخصيص memory ديناميكية. يجب أن يقوم program بما يلي:

  1. قراءة integern من المستخدم، يمثّل عدد قيم integers المطلوب تخزينها
  2. استخدام malloc() مع sizeof() لتخصيص memory ديناميكيًا من أجل array من n قيم integers
  3. التحقق من نجاح تخصيص memory باختبار ما إذا كان المؤشر المُعاد هو NULL
  4. إذا فشل التخصيص، اطبع Memory allocation failed! وأنهِ program
  5. إذا نجح التخصيص، اطبع Memory allocation successful!
  6. اقرأ n قيم integers من المستخدم وخزّنها في array المخصّصة
  7. احسب واطبع مجموع all values بالتنسيق: Sum: [value]
  8. اطبع إجمالي عدد bytes المخصّصة بالتنسيق: Bytes allocated: [value]

تذكّر تضمين ترويسة <stdlib.h> لاستخدام malloc(). يجب أن يوضّح program الممارسة الأساسية المتمثلة في التحقق من فشل التخصيص قبل محاولة استخدام memory المخصّصة.

على سبيل المثال، إذا كان الإدخال هو:

4
10 20 30 40

فيجب أن يكون الإخراج:

Memory allocation successful!
Sum: 100
Bytes allocated: 16

يركّز هذا التحدي على الأهمية البالغة للبرمجة الدفاعية عند العمل مع تخصيص memory ديناميكية، بما يضمن تعامل programs مع حالات فشل تخصيص memory المحتملة بسلاسة بدلًا من التوقف بشكل غير متوقع.

جرّب بنفسك

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

int main() {
    // اقرأ عدد الأعداد الصحيحة
    int n;
    scanf("%d", &n);
    
    // TODO: اكتب الكود الخاص بك هنا
    // - استخدم malloc() لتخصيص ذاكرة لـ n من الأعداد الصحيحة
    // - تحقق مما إذا كان التخصيص ناجحًا
    // - تعامل مع حالتي النجاح والفشل
    // - اقرأ الأعداد الصحيحة وخزّنها
    // - Calculate the sum and bytes allocated
    
    return 0;
}
quiz iconاختبر نفسك

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

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

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