Menu
CoddyTech

استخدام sizeof() للتخصيص

جزء من قسم المنطق وتدفق التنفيذ في رحلة C على Coddy. الدرس 33 من 63.

مع أن malloc() تتيح لك تخصيص الذاكرة ديناميكيًا، فهناك ممارسة مهمة تُحسّن قابلية نقل الشيفرة وصيانتها: استخدام العامل sizeof() لتحديد عدد البايتات المراد تخصيصها.

يعيد العامل sizeof() عدد البايتات المطلوبة لتخزين نوع بيانات معيّن على نظامك. بدلًا من ترميز أحجام البايتات بشكل ثابت، يمكنك ترك sizeof() يحسب المقدار الصحيح تلقائيًا:

// بدلًا من تخمين الأحجام بالبايت:
int *ptr = (int*)malloc(4);  // يفترض أن int حجمه 4 بايت

// استخدم sizeof() لضمان قابلية النقل:
int *ptr = (int*)malloc(sizeof(int));  // صحيح دائمًا

يصبح هذا النهج مفيدًا بشكل خاص عند تخصيص مصفوفات. لتخصيص مساحة لعدة عناصر، اضرب عدد العناصر في حجم كل عنصر:

// احجز مساحة لـ 10 أعداد صحيحة
int *arr = (int*)malloc(10 * sizeof(int));

// احجز مساحة لـ 5 قيم من نوع double
double *values = (double*)malloc(5 * sizeof(double));

يضمن استخدام sizeof() عمل شفرتك بشكل صحيح على الأنظمة المختلفة، حيث قد تختلف أحجام أنواع البيانات، كما يوضح بجلاء قصدك بتخصيص مساحة لعدد محدد من العناصر من نوع معين.

challenge icon

التحدي

سهل

اكتب برنامجًا بلغة C يوضّح الاستخدام الصحيح لـ sizeof() مع malloc() لتخصيص الذاكرة ديناميكيًا. ينبغي أن يقوم برنامجك بما يلي:

  1. قراءة عدد صحيح n من المستخدم يمثّل عدد العناصر المطلوب تخصيصها
  2. استخدام malloc() مع sizeof() لتخصيص الذاكرة ديناميكيًا لمصفوفة تحتوي على n قيم من النوع double
  3. تحويل مؤشر void المُعاد إلى مؤشر double
  4. قراءة n قيمة من النوع double من المستخدم وتخزينها في المصفوفة المخصّصة
  5. حساب إجمالي الذاكرة المخصّصة بالبايت وطباعته بالتنسيق: Memory allocated: [bytes] bytes
  6. حساب متوسط جميع القيم وطباعته بدقتين عشريتين بالضبط بالتنسيق: Average: [value]
  7. العثور على أكبر قيمة وطباعتها بدقتين عشريتين بالضبط بالتنسيق: Largest: [value]

تذكّر تضمين الترويسة <stdlib.h> لاستخدام malloc(). ينبغي أن يوضّح برنامجك كيف تضمن sizeof() تخصيص الذاكرة بشكل صحيح بغض النظر عن أحجام أنواع البيانات في النظام.

على سبيل المثال، إذا كان الإدخال:

3
2.5 7.8 4.1

فينبغي أن يكون الناتج:

Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80

يعزّز هذا التحدي أهمية استخدام sizeof() لجعل تخصيص الذاكرة الديناميكي قابلًا للنقل وسهل الصيانة، إذ يحسب تلقائيًا العدد الصحيح من البايتات اللازمة لأي نوع بيانات على أي نظام.

جرّب بنفسك

#include <stdio.h>
#include <stdlib.h>

int main() {
    // اقرأ عدد العناصر
    int n;
    scanf("%d", &n);
    
    // TODO: اكتب الكود الخاص بك أدناه
    // 1. خصّص ذاكرة لـ n من القيم من النوع double باستخدام malloc() وsizeof()
    // 2. حوّل المؤشر المُعاد إلى النوع double*
    // 3. اقرأ n من القيم من النوع double وخزّنها في المصفوفة المخصّصة
    // 4. احسب حجم الذاكرة المخصّصة بالبايت واطبعه
    // 5. احسب المتوسط واطبعه بمنزلتين عشريتين
    // 6. اعثر على أكبر قيمة واطبعها بمنزلتين عشريتين
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم C عبر الإنترنت