Разлика между malloc() и calloc()

Ключови разлики между malloc() срещу calloc()

  • Функцията malloc() връща само началния адрес и не го прави нула, от друга страна, функцията calloc() връща началния адрес и го прави нула.
  • Във функцията malloc броят на аргументите е 1, докато във функцията calloc броят на аргументите е 2.
  • времевата ефективност на malloc() е по-висока от calloc(), докато malloc() не е защитен в сравнение с calloc()
  • malloc не инициализира паметта, докато calloc извършва инициализация на паметта.
malloc() срещу calloc()
malloc() срещу calloc()

Какво е динамично разпределение на паметта?

Динамично разпределение на паметта е процес на разпределяне на памет по време на изпълнение. Има четири библиотечни процедури, calloc(), free(), realloc()и malloc(), които могат да се използват за разпределяне на памет и освобождаването й по време на изпълнение на програмата. Тези процедури са дефинирани в заглавния файл, наречен stdlib.h.

Какво е malloc()?

Това е функция, която се използва за динамично разпределяне на блок памет. Той запазва място в паметта с определен размер и връща нулевия указател, сочещ към мястото в паметта.

Върнатият указател обикновено е от тип void. Това означава, че можем да присвоим функция malloc на всеки указател. Пълната форма на malloc е разпределение на паметта.

Какво е calloc()?

Функция Calloc(). се използва за разпределяне на множество блокове памет. Това е функция за динамично разпределение на паметта, която се използва за разпределяне на паметта към сложни структури от данни като масиви и структури. Ако тази функция не успее да задели достатъчно място, както е посочено, тя връща нулев указател. Пълната форма на функцията calloc е непрекъснато разпределение.

Разлика между malloc() и calloc()

Ето важната разлика между malloc() срещу calloc():

malloc () calloc()
Функцията Malloc() ще създаде единичен блок памет с размер, зададен от потребителя. Функцията Calloc() може да присвоява множество блокове памет за една променлива.
Функцията Malloc съдържа стойност за боклук. Блокът памет, разпределен от функция calloc, винаги се инициализира на нула.
Броят на аргументите е 1. Броят на аргументите е 2.
Calloc е по-бавен от malloc. Malloc е по-бърз от calloc.
Не е сигурно в сравнение с 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 намираме стойността на 6-то цяло число.

#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-то цяло число е 480

Пример за calloc() в C

Програмата на езика C по-долу изчислява сумата от първите десет члена. Ако стойността на указателя е нула, тогава пространството в паметта няма да бъде разпределено.

Цикълът for се използва за повторение на стойността на променлива „i“ и отпечатване на сумата. И накрая, функцията free се използва за освобождаване на показалеца.

#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 Сума = 45

Защо да използвате malloc()?

Ето причините да използвате malloc()

  • Трябва да използвате malloc(), когато трябва да разпределите памет по време на изпълнение.
  • Трябва да използвате malloc, когато трябва да разпределите обекти, които трябва да съществуват извън изпълнението на текущия блок памет.
  • Изберете malloc(), ако трябва да разпределите памет, по-голяма от размера на този стек.
  • Връща указателя към първия байт от разпределеното пространство.
  • Позволява на разработчиците да разпределят памет според нуждите в точния размер.
  • Тази функция разпределя размер на блок памет от байтове от купчината.

Защо да използвате calloc()?

Ето причините да използвате calloc()

  • Когато трябва да зададете разпределената памет на нула.
  • Можете да използвате calloc, който връща указател, за да получите достъп до паметта.
  • Използва се, когато трябва да инициализирате елементите до нула, за да върнете указател към паметта.
  • За да предотвратите препълване, което е възможно с malloc()
  • Използвайте calloc(), за да поискате страница, за която е известно, че вече е нулирана.