تخصيص مصفوفة
احجز ذاكرة الكومة
تخصيص مصفوفة درس مجاني في C Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
لماذا المصفوفات الديناميكية؟
للمصفوفة العادية حجم ثابت يُحدد وقت الترجمة. لكنكم غالبًا لا تعرفون عدد العناصر التي تحتاجون إليها حتى يعمل البرنامج.
تحل المصفوفات الديناميكية هذه المشكلة: إذ تطلبون من نظام التشغيل كتلة من الذاكرة وقت التشغيل باستخدام malloc، وتحددون الحجم باستخدام متغير.
تعرّفوا على malloc
توجد malloc، أي تخصيص الذاكرة، في <stdlib.h>. تمررون إليها عدد البايتات، فتعيد مؤشرًا إلى تلك الكتلة، أو NULL إذا فشلت.
تأتي الذاكرة من الكومة وتظل موجودة حتى تحرروها.
int *p = malloc(10 * sizeof(int));تحديد الحجم باستخدام sizeof
لا تكتبوا أعداد البايتات بشكل ثابت. استخدموا sizeof حتى يظل كودكم صحيحًا على المنصات المختلفة.
لتخصيص مساحة لعدد n من الأعداد الصحيحة، اضربوا n في sizeof(int). ومن الصيغ الشائعة n * sizeof(*p)، إذ تستخدم نوع المؤشر نفسه.
int *p = malloc(n * sizeof(*p));تحققوا دائمًا من NULL
إذا نفدت الذاكرة من النظام، تعيد malloc القيمة NULL. ويؤدي إلغاء الإشارة إلى مؤشر NULL إلى انهيار البرنامج.
تحققوا من النتيجة قبل استخدامها. تمنع هذه العادة البسيطة كثيرًا من حالات الفشل صعبة التتبع.
int *p = malloc(n * sizeof(*p));
if (p == NULL) {
fprintf(stderr, "out of memory\n");
return 1;
}تخصيص كامل
إليكم برنامجًا كاملًا يخصص مساحة لخمسة أعداد صحيحة، ويملؤها، ثم يطبعها.
لاحظوا التناظر: استخدام malloc في البداية وfree في النهاية.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 5;
int *a = malloc(n * sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) a[i] = i * i;
for (int i = 0; i < n; i++) printf("%d\n", a[i]);
free(a);
return 0;
}لا تصفّر malloc الذاكرة
الذاكرة التي تعيدها malloc غير مهيّأة؛ فهي تحتوي على أي قيم عشوائية كانت موجودة من قبل.
تؤدي قراءتها قبل الكتابة إليها إلى قيم غير متوقعة. أسندوا قيمة إلى كل عنصر دائمًا قبل قراءته.
int *a = malloc(3 * sizeof(*a));
/* a[0], a[1], a[2] hold garbage here */
a[0] = 10;تصفّر calloc الذاكرة تلقائيًا
تخصص calloc(count, size) مساحة لـ count من العناصر، بحجم size بايت لكل عنصر، وتضبط كل بايت على الصفر.
استخدموها عندما تريدون مصفوفة نظيفة مملوءة بالأصفار. كما أنها تحمي من تجاوز السعة أثناء عملية الضرب.
int *a = calloc(5, sizeof(*a));
/* every element is now 0 */استخدام calloc عمليًا
يستخدم هذا البرنامج calloc ويتحقق من أن المصفوفة تبدأ بالأصفار قبل تغييرها.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 4;
int *a = calloc(n, sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) printf("%d\n", a[i]);
free(a);
return 0;
}فهرسة الكتلة
يتصرف المؤشر إلى كتلة في الكومة مثل اسم المصفوفة تمامًا. يمكنكم استخدام a[i] لقراءة أي عنصر وكتابته من 0 إلى n-1.
وتحت الغطاء، يعادل a[i] الصيغة *(a + i).
int *a = malloc(3 * sizeof(*a));
a[0] = 1;
*(a + 1) = 2; /* same as a[1] = 2 */
a[2] = 3;انتبهوا إلى الحدود
إذا خصصتم n من العناصر، فالفهارس الصحيحة هي من 0 إلى n-1. أما الكتابة إلى a[n] فهي سلوك غير معرّف.
لا تتحقق C من الحدود نيابة عنكم، ولذلك قد يؤدي خطأ تجاوز الحد بواحد إلى إفساد الذاكرة دون ظهور واضح.
int *a = malloc(3 * sizeof(*a));
a[2] = 99; /* OK, last valid index */
/* a[3] = 0; BUG: out of bounds */قراءة الحجم وقت التشغيل
تكمن القوة الحقيقية في إمكانية الحصول على الحجم من إدخال أو ملف أو عملية حسابية. فالكود نفسه يستطيع تخصيص عنصرين أو مليوني عنصر.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 6; /* could be scanf'd */
long *a = malloc(n * sizeof(*a));
if (!a) return 1;
long sum = 0;
for (int i = 0; i < n; i++) { a[i] = i + 1; sum += a[i]; }
printf("%ld\n", sum);
free(a);
return 0;
}تحقق سريع
اختبروا فهمكم لتخصيص الذاكرة.
مراجعة
تخصصون مصفوفة ديناميكية باستخدام malloc(n * sizeof(*p))، أو تخصصونها مملوءة بالأصفار باستخدام calloc(n, sizeof(*p)).
تحققوا دائمًا من NULL، وتذكروا أن malloc تترك قيمًا عشوائية، وأن الفهرسة تمتد من 0 إلى n-1، وأن تقرنوا كل عملية تخصيص باستدعاء free. ستتعلمون بعد ذلك تغيير حجم كتلة مع الحفاظ على بياناتها.
الأسئلة الشائعة
هل درس «تخصيص مصفوفة» مجاني؟
نعم — نص درس «تخصيص مصفوفة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «تخصيص مصفوفة»؟
احجز ذاكرة الكومة تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تخصيص مصفوفة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.