English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل تعليمي أساسي بلغة C

تحكم في العملية في لغة C

الوظائف في لغة C

المسافات في لغة C

المراجع في لغة C

السلاسل في لغة C

بنية لغة C

ملفات لغة C

C أخرى

دليل مرجع لغة C

التخصيص الدديناميكي للذاكرة في لغة C

في هذا الدليل، ستتعلم كيفية استخدام وظائف مكتبة المعايير: malloc()، calloc()، free() و realloc() لتخصيص الذاكرة بشكل ديناميكي في برامج لغة C.

كما تعلم، تكون المصفوفات مجموعات من القيم الثابتة. بعد إعلان حجم المصفوفة، لا يمكنك تغييره.

في بعض الأحيان، قد لا يكون حجم الصف الذي أعلنته كافيًا. لحل هذه المشكلة، يمكنك تخصيص الذاكرة يدويًا عند تشغيل البرنامج. هذا يُسمى بتخصيص الذاكرة بشكل ديناميكي في برمجة لغة C.

يمكن استخدام وظائف مكتبة المعايير malloc()، calloc()، realloc() و free() للتحكم في الذاكرة بشكل ديناميكي. وتُحدد هذه الدوال في ملف التعريف <stdlib.h>.

C malloc()

الاسم "malloc" يعني تخصيص الذاكرة.

تُسَلِّم دالة malloc() كتلة من الذاكرة بكمية بايت معينة. وتُعيد دالة voidالإشارةيمكن تحويلها إلى أي شكل من أشكال الإشارات.

جملة malloc()

ptr = (castType*) malloc(size);

مثال

ptr = (float*) malloc(100 * sizeof(float));

تُسَلِّم الجملة السابقة 400 بايت من الذاكرة. لأن حجم عدد العناصر float هو 4 بايت. وإشارة ptr تحفظ عنوان أول بايت من المساحة المُسَلَّمة.

إذا لم يتم تخصيص الذاكرة، فإن التعبير سينتج عنه دالة NULL.

C calloc()

الاسم "calloc" يعني تخصيص متتابعة.

تُسَلِّم دالة malloc() الذاكرة وتحافظ على الذاكرة غير المُسَلَّمة. بينما تُسَلِّم دالة calloc() الذاكرة وتُسَلِّم جميع الأجزاء إلى الصفر.

جملة calloc()

ptr = (castType*) calloc(n, size);

مثال:

ptr = (float*) calloc(25, sizeof(float));

الجملة السابقة تُسَلِّم مساحة متصالبة في الذاكرة لأربعة وعشرون عنصرًا من نوع float.

C free()

الذاكرة المُسَلَّمة باستخدام calloc() أو malloc() لا تُفرِج نفسها. يجب استخدام free() بوضوح لإطلاق المساحة.

نحوية free()

free(ptr);

هذا الجملة تحرر المساحة المخصصة في الذاكرة التي يشير إليها ptr.

مثال 1: malloc() و free()

// برنامج لحساب مجموع n من الأرقام المقدمة من المستخدم
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, i, *ptr, sum = 0;
    printf("أدخل عدد العناصر: ");
    scanf("%d", &n);
    ptr = (int*) malloc(n * sizeof(int));
 
    // إذا لم يتم تخصيص الذاكرة
    if(ptr == NULL)                     
    {
        printf("خطأ! لم يتم تخصيص الذاكرة.");
        exit(0);
    }
    printf("أدخل العنصر: ");
    for(i = 0; i < n; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }
    printf("جمع = %d", sum);
  
    // تحرير الذاكرة
    free(ptr);
    return 0;
}

في هذا، قمنا بتخصيص ذاكرة لـ n من int.

مثال 2: calloc() و free()

// برنامج لحساب مجموع n من الأرقام المقدمة من المستخدم
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int n, i, *ptr, sum = 0;
    printf("أدخل عدد العناصر: ");
    scanf("%d", &n);
    ptr = (int*) calloc(n, sizeof(int));
    if(ptr == NULL)
    {
        printf("خطأ! لم يتم تخصيص الذاكرة.");
        exit(0);
    }
    printf("أدخل العنصر: ");
    for(i = 0; i < n; ++i)
    {
        scanf("%d", ptr + i);
        sum += *(ptr + i);
    }
    printf("جمع = %d", sum);
    free(ptr);
    return 0;
}

realloc() في C

يمكن استخدام دالة realloc() لتغيير حجم الذاكرة المخصصة السابقة إذا كانت الذاكرة المخصصة غير كافية أو أكبر من الحجم المطلوب.

نحوية realloc()

ptr = realloc(ptr, x);

في هذا، تم إعادة تخصيص ptr إلى حجم جديد x.

مثال 3: realloc()

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int *ptr, i, n1, n2;
    printf("أدخل الحجم: ");
    scanf("%d", &n1);
    ptr = (int*)malloc(n1 * sizeof(int));
    printf("عنوان الذاكرة المخصصة سابقًا: ");
    for (i = 0; i < n1; ++i)
        printf("睵n", ptr + i);
    printf("\nأدخل الحجم الجديد: ");
    scanf("%d", &n2);
    // إعادة تخصيص الذاكرة
    ptr = realloc(ptr, n2 * sizeof(int));
    printf("جديد تخصيص العنوان الارشادي: ");
    for (i = 0; i < n2; ++i)
        printf("睵n", ptr + i);
    free(ptr);
    return 0;
}

الخروج من البرنامج هو:

إدخال الحجم: 3
عنوان الذاكرة المُتاح السابق: 7452312
7452316
7452320
إدخال الحجم الجديد: 5
عنوان الذاكرة المُتاح الجديد: 7452312
7452316
7452320
7452324
7452328