"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا ينتج عن "strlen" و"sizeof" نتائج مختلفة للسلاسل المستندة إلى المؤشر والسلاسل المستندة إلى المصفوفة في لغة C؟

لماذا ينتج عن "strlen" و"sizeof" نتائج مختلفة للسلاسل المستندة إلى المؤشر والسلاسل المستندة إلى المصفوفة في لغة C؟

تم النشر بتاريخ 2024-11-16
تصفح:450

Why do `strlen` and `sizeof` produce different results for pointer-based and array-based strings in C?

المخرجات المميزة في حسابات طول وحجم السلسلة لتهيئة السلسلة المستندة إلى المؤشر والمصفوفة

فهم النتائج

عند إنشاء سلسلة قائمة على المؤشر str1 وسلسلة قائمة على المصفوفة str2 بنفس القيمة، تنتج الدالتان strlen وsizeof نتائج مختلفة. على وجه التحديد، بالنسبة للإعلانات:

char *str1 = "Sanjeev";
char str2[] = "Sanjeev";

strlen تُرجع 7 لكل من str1 وstr2 نظرًا لأنها تقيس طول تسلسل الأحرف، باستثناء الفاصل الفارغ (\0) في النهاية.

ومع ذلك، sizeof يعطي قيمًا مختلفة:

  • يرجع sizeof(str1) 4 لأنه يقيم حجم متغير المؤشر، والذي عادة ما يكون 4 بايت (أنظمة 32 بت).
  • sizeof(str2) تُرجع 8 لأنها تحدد حجم المصفوفة، والتي تتضمن فاصل فارغ، مما يؤدي إلى 8 بايت (7 أحرف 1 فاصل فارغ).

الفرق الأساسي: نوع البيانات مقابل تخصيص الذاكرة

يقيس حجم نوع البيانات، بينما يقيس strlen طول تسلسل الأحرف. في حالة str1، فهو مؤشر إلى char، لذا يُرجع sizeof حجم المؤشر. بالنسبة إلى str2، فهي عبارة عن مصفوفة من الأحرف، لذا يُرجع sizeof حجم المصفوفة بأكملها، بما في ذلك المُنهي الخالي.

نظرة أقرب

لتوضيح التمييز أفضل، ضع في اعتبارك:

char str2[8];
strncpy(str2, "Sanjeev", 7);
char *str1 = str2;

الآن، يشير كل من str1 وstr2 إلى نفس المصفوفة. قيمها strlen هي 7، لكن قيم حجمها تختلف:

  • sizeof (str1) هو 4 (حجم المؤشر)
  • sizeof (str2) هو 8 (حجم الصفيف مع فاصل فارغ )

يوضح هذا كيف يعتمد تقييم الحجم على بنية البيانات الأساسية.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3