قبل فهم وظائف malloc () و calloc () دعونا أولاً نفهم معنى تخصيص الذاكرة الديناميكية. تخصيص الذاكرة هو إجراء تعيين ذاكرة الكمبيوتر لتنفيذ البرامج والعمليات. نستخدم تقنيات التخصيص الديناميكي عندما لا يكون معروفًا مسبقًا كم مساحة الذاكرة المطلوبة للبرنامج والعملية.
ينشأ توزيع الذاكرة الديناميكية بسبب المشاكل المرتبطة بتخصيص الذاكرة الثابتة مثل إذا تم تخزين عدد أقل من العناصر ، ثم يتم إهدار باقي الذاكرة دون داعٍ. لذلك ، فإنه يتغلب على مشاكل تخصيص الذاكرة الثابتة حيث يتم تخصيص الذاكرة فقط عندما تكون مطلوبة.
رسم بياني للمقارنة
أساس المقارنة | malloc () | calloc () |
---|---|---|
لا من الكتل | يعيّن كتلة واحدة من الذاكرة المطلوبة. | يعيّن عدة كتل من الذاكرة المطلوبة. |
بناء الجملة | void * malloc (size_t size)؛ | void * calloc (size_t num، size_t size)؛ |
التهيئة | malloc () لا مسح وتهيئة الذاكرة المخصصة. | تتم تهيئة الذاكرة المخصصة إلى صفر باستخدام calloc (). |
طريقة التخصيص | دالة malloc () يخصص ذاكرة حجم "الحجم" من كومة الذاكرة المؤقتة. | دالة calloc () يخصص الذاكرة التي يساوي حجمها حجم num *. |
سرعة | بسرعة | بطيئة نسبيا. |
تعريف malloc ()
تقوم وظيفة malloc بتعيين كتلة من الذاكرة بالبايت . يجب أن يعطي المستخدم صراحة حجم الكتلة ، فإنه يتطلب للاستخدام.
من خلال برنامج وظيفة malloc يطلب ذاكرة الوصول العشوائي من النظام لتخصيص الذاكرة ، إذا تم قبول الطلب (أي أن الدالة malloc تقول ناجحة في تخصيص الذاكرة) ، فإنها ترجع مؤشر إلى أول كتلة من الذاكرة. تقوم بإرجاع نوع void للمؤشر ، مما يعني أنه يمكن تعيين أي نوع من المؤشر.
على الرغم من ذلك ، تقوم بإرجاع قيمة فارغة (NULL) ، إذا كانت وظائف malloc غير قادرة على تخصيص مقدار الذاكرة المطلوبة. يمكن الوصول إلى وظيفة malloc في TURBO C ، أو header file alloc.h
أو stdlib.h
، وعلى UNIX ستكون متوفرة في ملف الرأس .
بناء الجملة
بناء جملة هذه الوظيفة هو كما يلي:
malloc(number of elements * size of each element);
فمثلا، int *ptr;
ptr=malloc(10*sizeof (int))
حيث يمثل الحجم حجم الذاكرة المطلوبة بالبايت (أي عدد مواقع الذاكرة المجاورة التي سيتم تخصيصها).
ولكن كما ذكرنا من قبل ، فإن الدالة malloc ترجع مؤشر فراغ ، وبالتالي فإن مشغل المصبوب مطلوب لتغيير نوع المؤشر المرتد على أساس حاجتنا ، يمكن تقديم الإعلان أعلاه بالشكل التالي:
ptr_var=(type_cast* ) malloc (size)
عندما يكون ptr_var
هو اسم المؤشر الذي يحتفظ بعنوان بدء كتلة الذاكرة المخصصة ، فإن type_cast
هو نوع البيانات الذي يجب تحويل المؤشر type_cast
(أو نوع الفراغ) فيه ، ويصف الحجم حجم كتلة الذاكرة المخصصة بالبايت .
فمثلا: int *ptr;
ptr=(int*) malloc (10 * size of (int));
تحتوي الذاكرة المخصصة بواسطة الدالة malloc على قيمة للقمامة .
ﻻﺣ Note أﻧﻪ ﻟﻠﺘﺤﻘﻖ ﻣﻦ أﻧﻪ إذا ﺗﻢ إﻧﺸﺎء اﻟﻄﻠﺐ اﻟﻤﻘﺎﺑﻞ ﻣﻦ ﻗﺒﻞ malloc ﻟﺘﺨﺼﻴﺺ اﻟﺬاآﺮة اﻟﻤﻤﻨﻮﺣﺔ ﻣﻦ ﻗﺒﻞ ﻧﻈﺎم RAM ، أو ﺗﻢ رﻓﻀﻪ (ﻓﻲ ﺣﺎﻟﺔ إذا ﻟﻢ ﺗﻜﻦ اﻟﻤﺴﺎﺣﺔ اﻟﻤﻄﻠﻮﺑﺔ ﻣﺘﻮﻓﺮة). يمكننا الاستفادة من الخاصية التي يتم فيها تعيين مقدار الذاكرة المطلوبة غير الدالة malloc تقوم بإرجاع قيمة خالية (NULL).
تعريف calloc ()
تعمل وظيفة calloc تمامًا مثل وظيفة malloc باستثناء حقيقة أنها تتطلب وسيطتين كما في حالة malloc () هناك حاجة إلى وسيطة واحدة فقط.
فمثلا: int*ptr;
ptr = (int*)calloc(10, 2);
يحدد هنا 2 حجم نوع البيانات في بايت الذي نريد إجراء التخصيص له ، وهذا هو الحالة 2 للأعداد الصحيحة. و 10 تعني عدد العناصر التي يجب تخصيصها.
تذكر أن الوسيطة التي تم تمريرها إلى الدالة malloc كانت (n * 10) ، فهي عبارة عن وسيطة واحدة لا يمكن الخلط بسبب فصل الوسيطات المتعددة دائمًا. لا تحتوي الوسيطة (n * 10) على فواصل بينهما. ومن ثم فهي حجة واحدة ، وإن لم تكن بسيطة ولكنها تعبير.
عند الرجوع إلى البيان أعلاه ، بعد تنفيذ العبارة أعلاه ، يتم تخصيص كتلة ذاكرة من 20 بايت لبرنامج الطلب ويتم تعيين عنوان الكتلة الأولى إلى برنامج الطلب ، ويتم تعيين عنوان الكتلة الأولى إلى المؤشر PTR.
الذاكرة المخصصة بواسطة الدالة calloc تحتوي على كافة الأصفار. يمكن الحصول على وظيفة calloc أيضًا في ملف الرأس أو
في TURBO C.
الاختلافات الرئيسية بين malloc و calloc
الاختلافات الأساسية بين وظائف malloc و calloc هي:
- يتم تعيين كتلة واحدة من الذاكرة المطلوبة في malloc بينما يتم تخصيص كتل متعددة من الذاكرة المطلوبة بواسطة calloc.
- لا تعمل وظيفة malloc على مسح وتهيئة الذاكرة المخصصة. يحتوي على قيمة garbage ولا يمكن تغيير عنصر الذاكرة المخصصة. في المقابل ، تهيئة calloc الذاكرة المخصصة إلى صفر.
- malloc أسرع من calloc بسبب الحاجة إلى خطوات إضافية للتهيئة في calloc ولكن الفرق لا يكاد يذكر.
- فرق آخر بين هذين هو أن calloc هو memoc + mallset ، يخصص memset الصفحات الفعلية في الذاكرة بينما malloc فقط يعين الذاكرة من كومة الذاكرة المؤقتة في العنوان الظاهري.
استنتاج:
وتستخدم كل من وظائف malloc و calloc لتخصيص الذاكرة ولها ميزة معينة ، وعيب مثل malloc سريع مقارنة بال calloc. علاوة على ذلك ، تسهل استخدام malloc لأنه يأخذ وسيطة واحدة فقط لأن calloc يقوم بتخصيص الذاكرة وتهيئة منطقة الذاكرة بـ ZERO. ولكنك تفضل استخدام calloc عندما تكون التهيئة المتغيرة أكثر أهمية بالنسبة لك.