0Pricing
C Academy · درس

calloc وrealloc

ذاكرة مملوءة بالأصفار ومعاد تحجيمها

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

ما بعد malloc

إلى جانب malloc، توفر المكتبة القياسية calloc للذاكرة المصفّرة وrealloc لتغيير حجم كتلة موجودة.

توجد كلتاهما في <stdlib.h>.

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

int main(void) {
    int *p = calloc(3, sizeof(int));
    printf("%d %d %d\n", p[0], p[1], p[2]);
    free(p);
    return 0;
}

‏calloc يصفّر الذاكرة

تخصّص calloc(count, size) مساحة لـ count من العناصر، حجم كل منها size من البايتات، وتضبط كل بايت على الصفر.

يكون هذا مفيدًا عندما تحتاج إلى بداية نظيفة.

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

int main(void) {
    int *a = calloc(5, sizeof(int));
    int sum = 0;
    for (int i = 0; i < 5; i++) sum += a[i];
    printf("sum of zeroed array = %d\n", sum);
    free(a);
    return 0;
}

‏calloc له وسيطان

بخلاف malloc، يأخذ calloc عدد العناصر وحجم العنصر كلًّا على حدة.

كما يحمي من تجاوز السعة عند ضرب العدد في الحجم.

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

int main(void) {
    double *d = calloc(4, sizeof(double));
    d[2] = 1.5;
    printf("%f %f\n", d[0], d[2]);
    free(d);
    return 0;
}

‏malloc مقابل calloc

استخدم malloc عندما ستستبدل محتوى كل بايت على أي حال، واستخدم calloc عندما تعتمد على بدء الذاكرة بالقيمة صفر.

تستهلك calloc تكلفة إضافية بسيطة بسبب عملية التصفير.

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

int main(void) {
    int *m = malloc(2 * sizeof(int));
    int *c = calloc(2, sizeof(int));
    m[0] = 5; m[1] = 6;
    printf("malloc: %d %d\n", m[0], m[1]);
    printf("calloc: %d %d\n", c[0], c[1]);
    free(m); free(c);
    return 0;
}

التوسيع باستخدام realloc

يغيّر realloc(ptr, newsize) حجم كتلة، مع الحفاظ على محتواها الموجود حتى أصغر الحجمين القديم والجديد.

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

int main(void) {
    int *a = malloc(2 * sizeof(int));
    a[0] = 1; a[1] = 2;
    a = realloc(a, 4 * sizeof(int));
    a[2] = 3; a[3] = 4;
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    free(a);
    return 0;
}

قد تنقل realloc الكتلة

قد تعيد realloc عنوانًا مختلفًا إذا نقلت الكتلة للعثور على مساحة كافية.

أسند النتيجة دائمًا مجددًا، ولا تواصل استخدام المؤشر القديم.

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

int main(void) {
    int *a = malloc(sizeof(int));
    a[0] = 42;
    int *bigger = realloc(a, 100 * sizeof(int));
    printf("first element still %d\n", bigger[0]);
    free(bigger);
    return 0;
}

نمط realloc الآمن

إذا فشلت realloc، فإنها تعيد NULL لكنها تُبقي الكتلة الأصلية سليمة.

أسند النتيجة إلى متغير مؤقت أولًا حتى لا تفقد المؤشر القديم عند الفشل.

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

int main(void) {
    int *a = malloc(2 * sizeof(int));
    int *tmp = realloc(a, 8 * sizeof(int));
    if (tmp == NULL) {
        free(a);
        return 1;
    }
    a = tmp;
    a[7] = 99;
    printf("%d\n", a[7]);
    free(a);
    return 0;
}

تقليص كتلة

يمكن لـ realloc أيضًا تصغير كتلة. تُحافَظ على العناصر الأولى، وتُحرَّر المساحة المتبقية.

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

int main(void) {
    int *a = malloc(6 * sizeof(int));
    for (int i = 0; i < 6; i++) a[i] = i;
    a = realloc(a, 3 * sizeof(int));
    printf("%d %d %d\n", a[0], a[1], a[2]);
    free(a);
    return 0;
}

مخزن متنامٍ

يضاعف نمط شائع السعة عندما تمتلئ المصفوفة، مما يوزّع تكلفة التوسّع.

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

int main(void) {
    int cap = 2, len = 0;
    int *a = malloc(cap * sizeof(int));
    for (int v = 0; v < 5; v++) {
        if (len == cap) {
            cap *= 2;
            a = realloc(a, cap * sizeof(int));
        }
        a[len++] = v;
    }
    printf("len=%d cap=%d last=%d\n", len, cap, a[len-1]);
    free(a);
    return 0;
}

‏realloc مع NULL

تتصرف realloc(NULL, size) تمامًا مثل malloc(size).

يتيح ذلك لدالة التوسعة التعامل مع أول تخصيص بالطريقة نفسها.

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

int main(void) {
    int *a = realloc(NULL, 3 * sizeof(int));
    a[0] = 7;
    printf("%d\n", a[0]);
    free(a);
    return 0;
}

دمجها معًا

يمكنك البدء باستخدام calloc لإنشاء مخزن مصفّر، ثم توسيعه لاحقًا باستخدام realloc. لا تكون البايتات الجديدة بعد التوسعة مصفّرة.

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

int main(void) {
    int *a = calloc(2, sizeof(int));
    a = realloc(a, 4 * sizeof(int));
    a[2] = 0; a[3] = 0;
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
    free(a);
    return 0;
}

تحقّق سريع

اختبر معلوماتك عن calloc وrealloc.

مراجعة

تعلّمت أداتي تخصيص إضافيتين:

  • تخصّص calloc(count, size) ذاكرة مصفّرة وتحمي من تجاوز السعة الناتج عن الضرب.
  • تغيّر realloc(ptr, newsize) حجم كتلة، وقد تنقلها.
  • أسند دائمًا نتيجة realloc إلى متغير مؤقت لتجنب تسرّب الذاكرة عند الفشل.
  • تتصرف realloc(NULL, size) مثل malloc.

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

هل درس «calloc وrealloc» مجاني؟

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

ماذا ستتعلم في «calloc وrealloc»؟

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

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

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

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

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

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

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

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

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