التحقق من فشل التخصيص
جزء من قسم المنطق وتدفق التنفيذ في رحلة 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 الاحترافية دائمًا هذه الفحوصات لمنع التعطلات وتوفير معالجة سلسة للأخطاء.
التحدي
سهلاكتب program بلغة C يوضّح التعامل السليم مع error عند استخدام malloc() من أجل تخصيص memory ديناميكية. يجب أن يقوم program بما يلي:
- قراءة
integernمن المستخدم، يمثّل عدد قيمintegersالمطلوب تخزينها - استخدام
malloc()معsizeof()لتخصيصmemoryديناميكيًا من أجلarrayمنnقيمintegers - التحقق من نجاح تخصيص
memoryباختبار ما إذا كان المؤشر المُعاد هوNULL - إذا فشل التخصيص، اطبع
Memory allocation failed!وأنهِ program - إذا نجح التخصيص، اطبع
Memory allocation successful! - اقرأ
nقيمintegersمن المستخدم وخزّنها فيarrayالمخصّصة - احسب واطبع مجموع all values بالتنسيق:
Sum: [value] - اطبع إجمالي عدد
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;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسيةتدرّب بنفسك: مترجم C عبر الإنترنت