English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدليل، ستتعلم كيفية استخدام وظائف مكتبة المعايير: malloc()، calloc()، free() و realloc() لتخصيص الذاكرة بشكل ديناميكي في برامج لغة C.
كما تعلم، تكون المصفوفات مجموعات من القيم الثابتة. بعد إعلان حجم المصفوفة، لا يمكنك تغييره.
في بعض الأحيان، قد لا يكون حجم الصف الذي أعلنته كافيًا. لحل هذه المشكلة، يمكنك تخصيص الذاكرة يدويًا عند تشغيل البرنامج. هذا يُسمى بتخصيص الذاكرة بشكل ديناميكي في برمجة لغة C.
يمكن استخدام وظائف مكتبة المعايير malloc()، calloc()، realloc() و free() للتحكم في الذاكرة بشكل ديناميكي. وتُحدد هذه الدوال في ملف التعريف <stdlib.h>.
الاسم "malloc" يعني تخصيص الذاكرة.
تُسَلِّم دالة malloc() كتلة من الذاكرة بكمية بايت معينة. وتُعيد دالة voidالإشارةيمكن تحويلها إلى أي شكل من أشكال الإشارات.
ptr = (castType*) malloc(size);
مثال
ptr = (float*) malloc(100 * sizeof(float));
تُسَلِّم الجملة السابقة 400 بايت من الذاكرة. لأن حجم عدد العناصر float هو 4 بايت. وإشارة ptr تحفظ عنوان أول بايت من المساحة المُسَلَّمة.
إذا لم يتم تخصيص الذاكرة، فإن التعبير سينتج عنه دالة NULL.
الاسم "calloc" يعني تخصيص متتابعة.
تُسَلِّم دالة malloc() الذاكرة وتحافظ على الذاكرة غير المُسَلَّمة. بينما تُسَلِّم دالة calloc() الذاكرة وتُسَلِّم جميع الأجزاء إلى الصفر.
ptr = (castType*) calloc(n, size);
مثال:
ptr = (float*) calloc(25, sizeof(float));
الجملة السابقة تُسَلِّم مساحة متصالبة في الذاكرة لأربعة وعشرون عنصرًا من نوع float.
الذاكرة المُسَلَّمة باستخدام calloc() أو malloc() لا تُفرِج نفسها. يجب استخدام free() بوضوح لإطلاق المساحة.
free(ptr);
هذا الجملة تحرر المساحة المخصصة في الذاكرة التي يشير إليها ptr.
// برنامج لحساب مجموع 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.
// برنامج لحساب مجموع 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() لتغيير حجم الذاكرة المخصصة السابقة إذا كانت الذاكرة المخصصة غير كافية أو أكبر من الحجم المطلوب.
ptr = realloc(ptr, x);
في هذا، تم إعادة تخصيص ptr إلى حجم جديد x.
#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