Різниця між malloc() і calloc()
Ключові відмінності між malloc() і calloc()
- Функція malloc() повертає лише початкову адресу і не робить її нульовою, з іншого боку, функція calloc() повертає початкову адресу та робить її нульовою.
- У функції malloc кількість аргументів дорівнює 1, тоді як у функції calloc кількість аргументів дорівнює 2.
- Ефективність 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(), щоб запитати сторінку, про яку відомо, що вона вже обнулена.