مؤشرات NULL
جزء من قسم Logic & Flow في رحلة C على Coddy — الدرس 5 من 63.
أحيانًا تحتاج إلى التصريح عن مؤشر (pointer) ولكن ليس لديك عنوان ذاكرة صالح لتعيينه إليه على الفور. في هذه الحالات، من المهم تهيئة المؤشر إلى قيمة خاصة تسمى NULL.
مؤشر NULL هو مؤشر لا يشير إلى أي عنوان ذاكرة صالح. في لغة C، يتم تعريف NULL عادةً على أنه 0 أو (void*)0. عندما تقوم بتهيئة مؤشر إلى NULL، فأنت تصرح صراحةً بأنه لا يشير حالياً إلى أي شيء مفيد.
int *ptr = NULL; // تهيئة المؤشر إلى NULL
printf("%p", ptr); // سيقوم هذا بطباعة 0 أو (nil)تعتبر تهيئة المؤشرات إلى NULL ممارسة برمجية جيدة لأنها تمنع المؤشر الخاص بك من احتواء قيم عشوائية. قد يحتوي المؤشر غير المهيأ على أي عنوان ذاكرة عشوائي، مما قد يؤدي إلى سلوك غير متوقع إذا حاولت استخدامه عن طريق الخطأ.
يمكنك التحقق مما إذا كان المؤشر NULL قبل استخدامه، مما يساعد في منع الانهيارات ويجعل الكود الخاص بك أكثر قوة. يصبح فحص السلامة هذا مهمًا بشكل خاص مع زيادة تعقيد برامجك.
التحدي
سهلاكتب برنامجاً بلغة C يوضح كيفية تهيئة مؤشر NULL والتحقق منه بشكل صحيح. يجب أن يقوم برنامجك بما يلي:
- الإعلان عن مؤشر لنوع صحيح (integer) باسم
safe_ptrوتهيئته بالقيمة NULL - الإعلان عن مؤشر لنوع حرف (character) باسم
char_ptrوتهيئته بالقيمة NULL - التحقق مما إذا كان
safe_ptrهو NULL باستخدام جملة if وطباعة "safe_ptr is NULL" إذا كان كذلك - التحقق مما إذا كان
char_ptrهو NULL باستخدام جملة if وطباعة "char_ptr is NULL" إذا كان كذلك - طباعة عنوان الذاكرة المخزن في
safe_ptrباستخدامprintfمع محدد التنسيق%p - طباعة عنوان الذاكرة المخزن في
char_ptrباستخدامprintfمع محدد التنسيق%p
يجب أن يعرض مخرج البرنامج النتائج بالتنسيق التالي:
safe_ptr is NULL
char_ptr is NULL
safe_ptr address: [address]
char_ptr address: [address]ستظهر عناوين الذاكرة الفعلية كـ 0، أو (nil)، أو تمثيل NULL مشابه اعتماداً على نظامك، ولكن يجب أن يتطابق التنسيق والتسميات تماماً كما هو موضح أعلاه.
ورقة مرجعية
إنّ مؤشر NULL هو مؤشر لا يشير إلى أي عنوان ذاكرة صالح. في لغة C، يتم تعريف NULL عادةً على أنه 0 أو (void*)0.
قم بتهيئة المؤشرات إلى NULL لمنع قيم القمامة (garbage values) العشوائية:
int *ptr = NULL; // تهيئة المؤشر إلى NULL
printf("%p", ptr); // سيطبع هذا 0 أو (nil)تحقق مما إذا كان المؤشر NULL قبل استخدامه لمنع حدوث أعطال (crashes):
if (ptr == NULL) {
// من الآمن التعامل مع حالة NULL
}جرّب بنفسك
#include <stdio.h>
int main() {
// TODO: اكتب كودك هنا
// قم بتعريف وتهيئة المؤشرات (pointers) الخاصة بك
// تحقق مما إذا كانت المؤشرات فارغة (NULL)
// اطبع المخرجات المطلوبة
return 0;
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1أساسيات المؤشرات
ما هو المؤشر؟الإعلان عن المؤشراتعامل العنوان (&)عامل إلغاء المرجعية (*)مؤشرات NULLمراجعة: أساسيات المؤشرات4مشروع: أداة نصوص بسيطة
نظرة عامة على المشروععد الأحرف2المؤشرات والمصفوفات
أسماء المصفوفات كمؤشراتعناصر المصفوفة - المؤشراتالعمليات الحسابية على المؤشراتمقارنة المؤشراتمراجعة: التنقل في المصفوفة باستخدام المؤشرات5المؤشرات والدوال
التمرير بالقيمةتمرير المؤشرات إلى الدوالتعديل المتغيرات عبر المؤشراتمثال كلاسيكي: التبديلتمرير المصفوفات إلى الدوالملخص: وسائط المؤشرات في الدوال8الهياكل والمؤشرات
المؤشرات إلى الهياكلعامل السهم (->)تمرير الهياكل بالقيمةتمرير مؤشرات الهياكلالتخصيص الديناميكي للهياكلمراجعة: تعديل الهياكل باستخدام المؤشرات11تحديات المراجعة النهائية
مراجعة: دمج السلاسل النصية الديناميكيمراجعة: مصفوفة من الـ Structsمراجعة: عداد تكرار الكلمات3مصفوفات الأحرف والسلاسل النصية
السلاسل النصية كمصفوفات charالمُنهي الصفري (Null Terminator)إدخال السلاسل النصية باستخدام scanfاستخدام strlen()استخدام strcpy()استخدام strcat()استخدام strcmp()مراجعة: دوال السلاسل النصية الأساسية