Рекомендуємо, 2024

Вибір Редакції

Різниця між malloc і calloc

Принципова відмінність між функцією malloc і calloc полягає в тому, що calloc () потребує двох аргументів замість одного аргументу, що вимагається malloc () . Як malloc (), так і calloc () є функціями, якими забезпечує мова програмування C для динамічного виділення пам'яті та де-виділення під час виконання.

Перед розумінням функцій malloc () і calloc () спочатку зрозуміємо значення динамічного розподілу пам'яті. Виділення пам'яті - це процедура призначення пам'яті комп'ютера для виконання програм і процесів. Ми використовуємо динамічні методи розподілу, коли невідомо до того, скільки простору пам'яті потрібно для програми та процесу.

Динамічне виділення пам'яті виникає внаслідок проблем, пов'язаних з виділенням статичної пам'яті, наприклад, якщо зберігається менше елементів, то решта пам'яті невиправдано витрачається даремно. Тому він долає проблеми виділення статичної пам'яті, де пам'ять виділяється тільки тоді, коли вона потрібна.

Діаграма порівняння

Основа порівнянняmalloc ()calloc ()
Блоків немаєПризначає єдиний блок необхідної пам'яті.
Призначає кілька блоків запитаної пам'яті.
Синтаксисvoid * malloc (розмір size_t);void * calloc (size_t num, size_t size);
Ініціалізаціяmalloc () не очищає і ініціалізує виділену пам'ять.Виділена пам'ять ініціалізується до нуля за допомогою calloc ().
Спосіб розподілуФункція malloc () виділяє пам'ять розміру 'size' з купи.Функція calloc () виділяє пам'ять, розмір якої дорівнює num * size.
ШвидкістьШвидкоПорівняно повільно.

Визначення malloc ()

Функція malloc призначає блок пам'яті в байтах . Користувач повинен чітко вказати розмір блоку, який він вимагає для використання.

За допомогою функції malloc програма запитує RAM системи для виділення пам'яті, якщо запит поступається (тобто функція malloc говорить про успішне виділення пам'яті), вона повертає покажчик на перший блок пам'яті. Вона повертає тип покажчика void, тобто будь-який тип покажчика може бути призначений.

Хоча, він повертає NULL, якщо функції malloc не в змозі виділити необхідну кількість пам'яті. Функція malloc доступна в TURBO C, заголовному файлі alloc.h або stdlib.h, а на UNIX вона буде доступна в заголовному файлі .

SYNTAX

Синтаксис цієї функції такий:

malloc(number of elements * size of each element);

наприклад,
int *ptr;
ptr=malloc(10*sizeof (int))

Де розмір являє собою розмір необхідної пам'яті в байтах (тобто кількість суміжних місць пам'яті, які необхідно виділити).

Але, як згадувалося раніше, функція malloc повертає покажчик void, отже, оператор cast вимагає змінити тип повернутого покажчика на підставі нашої потреби, вищезгадана декларація може бути представлена ​​у такому вигляді:

ptr_var=(type_cast* ) malloc (size)

Де ptr_var є ім'ям покажчика, який зберігає початкову адресу блоку пам'яті, type_cast - це тип даних, в який повертається покажчик (або тип void), а розмір описує розмір блоку пам'яті, що виділяється, в байтах .

Наприклад:
int *ptr;
ptr=(int*) malloc (10 * size of (int));

Пам'ять, виділена функцією malloc, містить сміттєве значення .

Зверніть увагу, що для перевірки того, що відповідний запит генерується malloc для виділення пам'яті, наданої системною пам'яттю, або відхиленої (у випадку, якщо необхідний простір не доступний). Ми можемо використовувати властивість, в якій необхідна кількість пам'яті не присвоєно функції 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 є:

  1. Один блок необхідної пам'яті призначається в malloc, тоді як декілька блоків запитаної пам'яті виділяються calloc.
  2. Функція malloc не очищає і ініціалізує виділену пам'ять. Він містить сміттєве значення і елемент виділеної пам'яті не може бути змінений. Навпаки, calloc ініціалізує виділену пам'ять до нуля.
  3. malloc швидше, ніж calloc через вимоги додаткових кроків ініціалізації в calloc, але різниця незначна.
  4. Іншою відмінністю між цими двома є те, що calloc є malloc + memset, memset виділяє фізичні сторінки в пам'яті, тоді як malloc присвоює пам'ять тільки з віртуального адреси.

Висновок:

Функції malloc і calloc використовуються для розподілу пам'яті і мають певну перевагу, а недолік, як malloc, є швидким порівняно з calloc. Більш того, malloc легше використовувати, оскільки він приймає лише один аргумент, оскільки calloc виділяє пам'ять і ініціалізує область пам'яті за допомогою ZERO. Але ви вважаєте за краще використовувати calloc, коли ініціалізація змінної важливіша для вас.

Top