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 الكامل بالعربي.