تخطَّ إلى المحتوى

sizeof

عامل قياس الحجم بالبايت sizeof

sizeof عامل (وليس دالة) يُرجع حجم نوع أو متغيّر بالبايت وقت الترجمة — أساسي مع malloc وحساب عدد عناصر المصفوفات.

sizeof يُحسب وقت الترجمة (compile time) في أغلب الحالات، لذلك لا تكلفة أداء لاستخدامه، ويُرجع قيمة من نوع size_t (عدد صحيح غير سالب) يُطبع بمحدّد %zu. يُستخدم مع اسم نوع sizeof(int) أو مع تعبير sizeof(x) دون الحاجة لأقواس بالحالة الثانية تقنيًا، لكن الأقواس أوضح دائمًا.

الفخّ الأشهر: sizeof(array)/sizeof(array[0]) يعطي عدد العناصر الصحيح فقط داخل النطاق الذي عُرِّفت فيه المصفوفة (مثل main). لو مررت المصفوفة كمعامل لدالة، تتحوّل (decay) إلى مجرّد مؤشّر، وsizeof داخل الدالة يُرجع حجم المؤشّر (عادة 8 بايت) لا حجم المصفوفة الأصلية.

الصياغة

sizeof(expression)
sizeof(TypeName)

📄 مثال

int arr[5] = {1, 2, 3, 4, 5};
printf("%zu\n", sizeof(arr));           // 20 (5 * 4 بايت)
printf("%zu\n", sizeof(arr) / sizeof(arr[0])); // 5 عناصر

void printSize(int a[]) {
    printf("%zu\n", sizeof(a)); // 8 (حجم مؤشر) وليس 20!
}

أهم النقاط

العنصرالوظيفة
sizeof(Type)حجم نوع معروف مثل int أو struct Point
sizeof(variable)حجم متغيّر بناءً على نوعه الفعلي
sizeof(array)الحجم الكلي فقط داخل النطاق الأصلي — يتحوّل لحجم مؤشّر بعد تمريره لدالة

💡 نصائح عملية

  • مرّر عدد العناصر كمعامل منفصل للدوال التي تعمل على مصفوفات بدل الاعتماد على sizeof داخلها
  • استخدم sizeof(*ptr) بدل تكرار اسم النوع عند malloc — أقل عرضة للخطأ لو تغيّر النوع لاحقًا

⚠️ أخطاء شائعة

  • افتراض أن sizeof(array)/sizeof(array[0]) يعمل داخل دالة استلمت المصفوفة كمعامل
  • طباعة نتيجة sizeof بـ %d بدل %zu (نوعها size_t غير موقّع)

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار C الكامل بالعربي.