0Pricing
C Academy · درس

malloc وfree

التخصيص في الكومة

malloc وfree درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.

الكومة

حتى الآن، كانت المتغيرات تعيش في المكدس طوال مدة ثابتة. تتيح لك الكومة طلب الذاكرة أثناء التشغيل والاحتفاظ بها للمدة التي تحتاج إليها.

تدير ذاكرة الكومة بنفسك باستخدام دوال <stdlib.h>.

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

int main(void) {
    int *p = malloc(sizeof(int));
    *p = 99;
    printf("%d\n", *p);
    free(p);
    return 0;
}

استدعاء malloc

تحجز malloc(size) عدد size من البايتات وتعيد مؤشرًا إليها، أو تعيد NULL عند الفشل.

الذاكرة غير مهيّأة، أي إن محتواها غير محدد.

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

int main(void) {
    int *p = malloc(sizeof(int));
    *p = 7;
    printf("value = %d\n", *p);
    free(p);
    return 0;
}

تحديد الحجم باستخدام sizeof

حدّد حجم عمليات التخصيص دائمًا باستخدام sizeof حتى تكون الشفرة صحيحة على أي منصة.

يربط استخدام sizeof(*p) الحجم بنوع المؤشر تلقائيًا.

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

int main(void) {
    double *p = malloc(sizeof(*p));
    *p = 3.14;
    printf("%f\n", *p);
    free(p);
    return 0;
}

تحقق دائمًا من NULL

إذا فشلت عملية التخصيص، تعيد malloc القيمة NULL. وسيؤدي إلغاء الإشارة إليها إلى تعطّل البرنامج.

تحقق من النتيجة قبل استخدامها.

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

int main(void) {
    int *p = malloc(sizeof(int));
    if (p == NULL) {
        printf("allocation failed\n");
        return 1;
    }
    *p = 5;
    printf("ok: %d\n", *p);
    free(p);
    return 0;
}

تخصيص مصفوفة

لاحتواء العديد من العناصر، اضرب حجم العنصر في العدد.

ينشئ malloc(n * sizeof(int)) مساحة تكفي لـ n من الأعداد الصحيحة.

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

int main(void) {
    int n = 5;
    int *arr = malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) arr[i] = i * i;
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\n");
    free(arr);
    return 0;
}

تستخدم مصفوفات الكومة فهرسة المؤشرات

يُوصَل إلى مصفوفة الكومة عبر مؤشرها باستخدام الصيغة المألوفة arr[i]، وهي مكافئة لـ *(arr + i).

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

int main(void) {
    int *arr = malloc(3 * sizeof(int));
    arr[0] = 10;
    *(arr + 1) = 20;
    arr[2] = 30;
    printf("%d %d %d\n", arr[0], arr[1], arr[2]);
    free(arr);
    return 0;
}

تحرير الذاكرة

تعيد free(p) الكتلة إلى مخصّص الذاكرة. بعد ذلك، يجب ألا تستخدم p للوصول إلى تلك الذاكرة.

كل استدعاء ناجح لـ malloc يحتاج إلى استدعاء free مطابق.

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

int main(void) {
    char *buf = malloc(16);
    if (buf) {
        buf[0] = 'A';
        printf("%c\n", buf[0]);
        free(buf);
    }
    return 0;
}

‏free(NULL) آمن

لا يؤدي استدعاء free على مؤشر يساوي NULL إلى أي شيء، وهو مسموح تمامًا.

يُبسّط هذا شفرة التنظيف التي قد تُنفَّذ قبل نجاح التخصيص.

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

int main(void) {
    int *p = NULL;
    free(p);
    printf("free(NULL) was safe\n");
    return 0;
}

إعادة ذاكرة الكومة

بخلاف متغيرات المكدس، تبقى ذاكرة الكومة بعد عودة الدالة. يتيح ذلك للدالة تخصيص مخزن وإعادته.

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

int *make_range(int n) {
    int *a = malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) a[i] = i;
    return a;
}

int main(void) {
    int *r = make_range(4);
    printf("%d %d\n", r[0], r[3]);
    free(r);
    return 0;
}

لا تُحوّل malloc في C

في C، تعيد malloc قيمة من النوع void * تتحول تلقائيًا إلى أي نوع من المؤشرات.

لذلك لا حاجة إلى تحويل النوع، وقد يخفي التحويل فقدان تضمين <stdlib.h>.

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

int main(void) {
    long *p = malloc(sizeof(long));
    *p = 1234567L;
    printf("%ld\n", *p);
    free(p);
    return 0;
}

لا تحرر الذاكرة مرتين

يُعد استدعاء free على المؤشر نفسه مرتين سلوكًا غير معرّف، وقد يؤدي إلى إفساد الكومة.

اضبط المؤشر على NULL بعد التحرير لجعل إعادة استخدامه عن طريق الخطأ غير ضارة.

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

int main(void) {
    int *p = malloc(sizeof(int));
    *p = 1;
    free(p);
    p = NULL;
    free(p);
    printf("no double free\n");
    return 0;
}

تحقّق سريع

اختبر معلوماتك عن malloc وfree.

مراجعة

تعلّمت أساسيات تخصيص الكومة:

  • تحجز malloc(size) بايتات غير مهيّأة، وتعيد NULL عند الفشل.
  • تحقق دائمًا من النتيجة والحجم باستخدام sizeof.
  • تعيد free(p) الذاكرة؛ وكل malloc يحتاج إلى free واحد.
  • ‏free(NULL) آمن، أما التحرير المزدوج فسلوك غير معرّف.

الأسئلة الشائعة

هل درس «malloc وfree» مجاني؟

نعم — نص درس «malloc وfree» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.

ماذا ستتعلم في «malloc وfree»؟

التخصيص في الكومة تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟

لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «malloc وfree»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟

نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. malloc وfree
  2. calloc وrealloc
  3. تسرّبات الذاكرة
  4. المؤشرات المتدلية
← العودة إلى C Academy