Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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

جزء من قسم Logic & Flow في رحلة 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() لجعل تخصيص الذاكرة الديناميكي الخاص بك قابلاً للنقل (portable) وسهل الصيانة، حيث يقوم تلقائياً بحساب العدد الصحيح من البايتات المطلوبة لأي نوع بيانات على أي نظام.

جرّب بنفسك

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

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

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

جميع دروس Logic & Flow