الفرق بين malloc() و calloc()

الاختلافات الرئيسية بين malloc() و calloc()

  • تقوم الدالة malloc() بإرجاع عنوان البداية فقط ولا تجعله صفرًا، من ناحية أخرى، تقوم الدالة calloc() بإرجاع عنوان البداية وتجعله صفرًا.
  • في دالة malloc، عدد الوسائط هو 1، بينما في دالة calloc، عدد الوسائط هو 2.
  • كفاءة الوقت malloc() أعلى من calloc()، في حين أن malloc() ليست آمنة بالمقارنة مع calloc()
  • لا يقوم malloc بتهيئة الذاكرة، بينما يقوم calloc بتهيئة الذاكرة.
مالوك () مقابل كالوك ()
مالوك () مقابل كالوك ()

ما هو تخصيص الذاكرة الديناميكية؟

تخصيص الذاكرة الديناميكية هي عملية تخصيص الذاكرة في وقت التشغيل. هناك أربعة إجراءات مكتبة، calloc()، free()، realloc ()و malloc() والتي يمكن استخدامها لتخصيص الذاكرة وتحريرها أثناء تنفيذ البرنامج. يتم تعريف هذه الإجراءات في ملف الرأس المسمى stdlib.h.

ما هو مالوك ()؟

إنها وظيفة تُستخدم لتخصيص كتلة من الذاكرة ديناميكيًا. يقوم بحجز مساحة ذاكرة بالحجم المحدد ويعيد المؤشر الفارغ الذي يشير إلى موقع الذاكرة.

المؤشر الذي تم إرجاعه عادة ما يكون من النوع الفارغ. هذا يعني أنه يمكننا تعيين وظيفة malloc لأي مؤشر. الشكل الكامل لـ malloc هو تخصيص الذاكرة.

ما هو كالوك ()؟

وظيفة كالوك (). يستخدم لتخصيص كتل متعددة من الذاكرة. إنها وظيفة تخصيص الذاكرة الديناميكية التي تستخدم لتخصيص الذاكرة لـ complex هياكل البيانات مثل المصفوفات والهياكل. إذا فشلت هذه الوظيفة في تخصيص مساحة كافية كما هو محدد، فإنها ترجع مؤشرًا فارغًا. الشكل الكامل لوظيفة calloc هو التخصيص المتجاور.

الفرق بين malloc() و calloc()

فيما يلي فرق مهم بين malloc() و calloc():

مالوك () calloc ()
ستقوم وظيفة Malloc() بإنشاء كتلة واحدة من الذاكرة بالحجم المحدد من قبل المستخدم. يمكن لوظيفة Calloc() تعيين كتل متعددة من الذاكرة لمتغير.
تحتوي وظيفة Malloc على قيمة غير مرغوب فيها. تتم دائمًا تهيئة كتلة الذاكرة المخصصة بواسطة دالة calloc إلى الصفر.
عدد الوسيطة هو 1. عدد الوسائط 2.
Calloc أبطأ من malloc. مالوك أسرع من كالوك.
أنها ليست آمنة بالمقارنة مع calloc. إنه آمن للاستخدام مقارنة بـ malloc.
كفاءة الوقت أعلى من calloc(). كفاءة الوقت أقل من malloc().
تقوم الدالة Malloc() بإرجاع عنوان البداية فقط ولا تجعله صفراً. قبل تخصيص العنوان، تقوم الدالة Calloc() بإرجاع عنوان البداية وجعله صفرًا.
لا يؤدي تهيئة الذاكرة. ينفذ تهيئة الذاكرة.

بناء جملة malloc()

هنا بناء جملة malloc ()

ptr = (cast_type *) malloc (byte_size);

في بناء الجملة أعلاه، ptr هو مؤشر cast_type. تقوم الدالة malloc بإرجاع مؤشر إلى الذاكرة المخصصة لـ byte_size.

Example: ptr = (int *) malloc (50)

عند تنفيذ هذا البيان بنجاح، يتم حجز مساحة ذاكرة قدرها 50 بايت. يتم تعيين عنوان البايت الأول من المساحة المحجوزة للمؤشر "ptr" من النوع int.

بناء جملة calloc()

هنا بناء جملة malloc ()

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

يتم استخدام بناء الجملة أعلاه لتخصيص كتل الذاكرة n من نفس الحجم. بعد تخصيص مساحة الذاكرة، تتم تهيئة كافة البايتات إلى الصفر. يتم إرجاع المؤشر الموجود حاليًا عند البايت الأول من مساحة الذاكرة المخصصة.

مثال على malloc() في C

في الكود التالي، يتم استخدام sizeof(*ptr) لتخصيص كتلة ذاكرة مكونة من 15 عددًا صحيحًا. في بيان printf، نقوم بإيجاد قيمة العدد الصحيح السادس.

#include<stdlib.h>
#include<stdio.h>
int main(){
int *ptr;
ptr = malloc(15 * sizeof(*ptr)); 
    if (ptr != NULL) {
      *(ptr + 5) = 480; 
      printf("Value of the 6th integer is %d",*(ptr + 5));
    }
}

الإخراج:

قيمة العدد الصحيح السادس هي 6

مثال على calloc() في C

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

تُستخدم حلقة for لتكرار قيمة المتغير "i" وطباعة المجموع. وأخيرًا، يتم استخدام الوظيفة المجانية لتحرير المؤشر.

#include <stdio.h>
#include <stdlib.h>
    int main() {
        int i, * ptr, sum = 0;
        ptr = calloc(10, sizeof(int));
        if (ptr == NULL) {
            printf("Error! memory not allocated.");
            exit(0);
        }
        printf("Building and calculating the sequence sum of the first 10 terms \n");
        for (i = 0; i < 10; ++i) { * (ptr + i) = i;
            sum += * (ptr + i);
        }
        printf("Sum = %d", sum);
        free(ptr);
        return 0;
    }

الإخراج:

بناء وحساب مجموع التسلسل لأول 10 حدود n Sum = 45

لماذا استخدام malloc ()؟

فيما يلي أسباب استخدام malloc()

  • يجب عليك استخدام malloc() عندما يتعين عليك تخصيص الذاكرة في وقت التشغيل.
  • يجب عليك استخدام malloc عندما يتعين عليك تخصيص كائنات يجب أن تكون موجودة خارج نطاق تنفيذ كتلة الذاكرة الحالية.
  • انتقل إلى malloc() إذا كنت بحاجة إلى تخصيص ذاكرة أكبر من حجم تلك المكدس.
  • يقوم بإرجاع المؤشر إلى البايت الأول من المساحة المخصصة.
  • فهو يمكّن المطورين من تخصيص الذاكرة حسب الحاجة وبالقدر المحدد.
  • تقوم هذه الوظيفة بتخصيص حجم كتلة الذاكرة بالبايتات من الكومة.

لماذا نستخدم calloc() ؟

فيما يلي أسباب استخدام calloc()

  • عندما يتعين عليك ضبط الذاكرة المخصصة على الصفر.
  • يمكنك استخدام calloc الذي يُرجع مؤشرًا للوصول إلى كومة الذاكرة.
  • يُستخدم عندما تحتاج إلى تهيئة العناصر إلى الصفر لإرجاع مؤشر إلى الذاكرة.
  • لمنع التجاوز الممكن مع malloc()
  • استخدم calloc() لطلب صفحة من المعروف أنها صفرت بالفعل.