عند استخدام مصفوفة char في C لتخزين سلسلة نصوص (string)، يجب أن تحتوي المصفوفة على مساحة كافية لتخزين النص بالكامل بما في ذلك الحرف النهائي المؤشر عليه بواسطة \0
(والذي يُعرف أيضًا باسم نهاية السلسلة أو null terminator). عندما تعلن char s[1];
، فإنك في الواقع تنشئ مصفوفة تحتوي على حرف واحد فقط، ولكن عندما تحاول استنساخ السلسلة "hello"
إلى s
باستخدام strcpy(s, "hello");
، يتم نسخ الحروف 'h', 'e', 'l', 'l', 'o'
بدون مشكلة، ولكن الحرف النهائي \0
لا يُمكن تخزينه لأن المصفوفة s
لا تحتوي على مساحة كافية لهذا الحرف. هذا يعني أن s
ليست سلسلة نصية صحيحة من وجهة نظر C، ولكن الدوال puts
و strlen
لا تعلم ذلك وتواصل عملها بشكل طبيعي، لأنها تعتمدان على الحرف النهائي \0
لتحديد نهاية السلسلة.
المزيد من المعلومات
-
تحديث كفاءة القراءة من ملفات في C11/03/2024
-
قراءة أسطر معينة في ملف التكوين باستخدام C12/04/2024
-
فهم فارق تصريح المصفوفات في C27/03/2024
-
فهم استخدام المؤشرات في C24/03/2024
عندما تقوم بنسخ سلسلة نصية إلى مصفوفة char باستخدام strcpy
، يجب أن تتأكد من أن المصفوفة الهدف لديها مساحة كافية لتخزين السلسلة النصية بأكملها بما في ذلك الحرف النهائي \0
، وإلا فإنه سيحدث تجاوز لحدود المصفوفة وهو ما يعرف بـ “buffer overflow” ويمكن أن يتسبب في سلوك غير محدد للبرنامج.
عند استخدام sizeof(s)
، فإنه يُرجع حجم المصفوفة s
بالبايت، وهذا يشمل الحرف النهائي \0
بالإضافة إلى أي حروف أخرى تم تخزينها في المصفوفة. لذلك، في حالتك، حجم المصفوفة هو 1 بايت.
أما strlen(s)
، فإنها تحسب عدد الحروف في سلسلة النصية حتى تصل إلى الحرف النهائي \0
، وليس حجم المصفوفة. لذلك، في حالتك، تم حساب 5 حروف ('h', 'e', 'l', 'l', 'o'
) بالإضافة إلى الحرف النهائي \0
، مما يجعل الناتج 5.
وأخيرًا، عند طباعة s[4]
، فإنه يتم الوصول إلى الحرف في الموضع الرابع في المصفوفة s
، وهو الحرف 'o'
في حالتك.