Malloc () срещу calloc (): Основни разлики, обяснени с примери

Съдържание:

Anonim

Преди да научим разликата между malloc и calloc, нека научим-

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

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

Какво е malloc ()?

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

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

В този урок ще научите:

  • Какво е динамично разпределение на паметта?
  • Какво е malloc ()?
  • Какво е calloc ()?
  • Защо да използвам malloc ()?
  • Защо да използвам calloc ()?
  • Синтаксис на malloc ()
  • Синтаксис на calloc ()
  • Пример за malloc () в C
  • Пример за calloc () в C
  • Разлика между calloc () и malloc ()

Какво е calloc ()?

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

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

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

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

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

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

  • Когато трябва да настроите разпределената памет на нула.
  • Можете да използвате calloc, който връща указател, за да получите достъп до купчината памет.
  • Използва се, когато трябва да инициализирате елементите до нула, за да върне указател към паметта.
  • За да се предотврати преливането, което е възможно с 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#includeint 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 #include 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

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

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

malloc () calloc ()
Функцията Malloc () ще създаде единичен блок памет с размер, посочен от потребителя. Функцията Calloc () може да присвоява множество блокове памет за променлива.
Функцията Malloc съдържа стойност за боклук. Блокът памет, разпределен от функция calloc, винаги се инициализира до нула.
Броят на аргументите е 2. Броят на аргументите е 1.
Calloc е по-бавен от malloc. Malloc е по-бърз от calloc.
Той не е сигурен в сравнение с calloc. Той е сигурен за използване в сравнение с malloc.
Ефективността във времето е по-висока от calloc (). Ефективността във времето е по-ниска от malloc ().
Функцията Malloc () връща само началния адрес и не го прави нула. Преди да разпредели адреса, функцията Calloc () връща началния адрес и го прави нула.
Той не извършва инициализиране на паметта. Извършва инициализация на паметта.

КЛЮЧОВИ РАЗЛИКИ:

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