Функції malloc() і calloc() це бібліотечні функції, які динамічно розподіляють пам'ять. Динамічний означає, що пам’ять виділяється під час виконання (виконання програми) із сегмента купи.
Ініціалізація
malloc() виділяє блок пам'яті заданого розміру (у байтах) і повертає покажчик на початок блоку. malloc() не ініціалізує виділену пам’ять. Якщо ви спробуєте прочитати з виділеної пам’яті без попередньої її ініціалізації, ви викличете невизначену поведінку, що зазвичай означає, що значення, які ви читаєте, будуть значеннями сміття.
масиви bash
calloc() виділяє пам’ять, а також ініціалізує кожен байт у виділеній пам’яті рівним 0. Якщо ви спробуєте прочитати значення виділеної пам’яті без її ініціалізації, ви отримаєте 0, оскільки його вже було ініціалізовано до 0 за допомогою calloc().
Параметри
malloc() приймає один аргумент, який є кількість байтів для виділення.
На відміну від malloc(), calloc() приймає два аргументи:
- Кількість блоків для виділення.
- Розмір кожного блоку в байтах.
Повернене значення
Після успішного розподілу в malloc() і calloc() повертається покажчик на блок пам’яті, інакше повертається NULL, що вказує на помилку.
приклад
Наведений нижче код C демонструє різницю між функціями malloc і calloc для виділення динамічної пам’яті.
C
// C code that demonstrates the difference> // between calloc and malloc> #include> #include> int> main()> {> > // Both of these allocate the same number of bytes,> > // which is the amount of bytes that is required to> > // store 5 int values.> > // The memory allocated by calloc will be> > // zero-initialized, but the memory allocated with> > // malloc will be uninitialized so reading it would be> > // undefined behavior.> > int> * allocated_with_malloc => malloc> (5 *> sizeof> (> int> ));> > int> * allocated_with_calloc => calloc> (5,> sizeof> (> int> ));> > // As you can see, all of the values are initialized to> > // zero.> > printf> (> 'Values of allocated_with_calloc: '> );> > for> (> size_t> i = 0; i <5; ++i) {> > printf> (> '%d '> , allocated_with_calloc[i]);> > }> > putchar> (> '
'> );> > // This malloc requests 1 terabyte of dynamic memory,> > // which is unavailable in this case, and so the> > // allocation fails and returns NULL.> > int> * failed_malloc => malloc> (1000000000000);> > if> (failed_malloc == NULL) {> > printf> (> 'The allocation failed, the value of '> > 'failed_malloc is: %p'> ,> > (> void> *)failed_malloc);> > }> > // Remember to always free dynamically allocated memory.> > free> (allocated_with_malloc);> > free> (allocated_with_calloc);> }> |
>
>Вихід
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>
Різниця між malloc() і calloc() у C
Розглянемо відмінності у вигляді таблиці:
Так ні. | malloc() | calloc() |
---|---|---|
1. | malloc() — це функція, яка створює один блок пам’яті фіксованого розміру. | calloc() — це функція, яка призначає певну кількість блоків пам’яті одній змінній. |
2. | malloc() приймає лише один аргумент | calloc() приймає два аргументи. |
3. оператор java if | malloc() швидше ніж calloc. | calloc() повільніший ніж malloc() |
4. | malloc() має високу часову ефективність | calloc() має низьку часову ефективність |
5. | malloc() використовується для вказівки розподілу пам'яті | calloc() використовується для вказівки безперервного розподілу пам’яті |
6. | Синтаксис: void* malloc(size_t size); | Синтаксис: void* calloc(size_t num, size_t size); |
8. | malloc() не ініціалізує пам'ять до нуля | calloc() ініціалізує пам'ять до нуля |
9. | malloc() не додає додаткових витрат пам’яті | calloc() додає додаткову пам’ять |