logo

Різниця між malloc() і calloc() із прикладами

Функції malloc() і calloc() це бібліотечні функції, які динамічно розподіляють пам'ять. Динамічний означає, що пам’ять виділяється під час виконання (виконання програми) із сегмента купи.

Ініціалізація

malloc() виділяє блок пам'яті заданого розміру (у байтах) і повертає покажчик на початок блоку. malloc() не ініціалізує виділену пам’ять. Якщо ви спробуєте прочитати з виділеної пам’яті без попередньої її ініціалізації, ви викличете невизначену поведінку, що зазвичай означає, що значення, які ви читаєте, будуть значеннями сміття.



масиви bash

calloc() виділяє пам’ять, а також ініціалізує кожен байт у виділеній пам’яті рівним 0. Якщо ви спробуєте прочитати значення виділеної пам’яті без її ініціалізації, ви отримаєте 0, оскільки його вже було ініціалізовано до 0 за допомогою calloc().

Параметри

malloc() приймає один аргумент, який є кількість байтів для виділення.

На відміну від malloc(), calloc() приймає два аргументи:



  1. Кількість блоків для виділення.
  2. Розмір кожного блоку в байтах.

Повернене значення

Після успішного розподілу в 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() додає додаткову пам’ять

Схожі статті