Коли calloc використовується для виділення блоку пам'яті, виділена область ініціалізується до нулів. У контрасті, малок не торкається вмісту виділеного блоку пам'яті, а значить, він містить значення сміття. Це потенційно може становити загрозу безпеці, оскільки вміст пам'яті непередбачувано, а помилки програмування можуть призвести до витоку цього вмісту.
calloc | малок | |
---|---|---|
Функція | виділяє область пам'яті, достатньо велику, щоб вмістити "n елементів" розміру "байт" кожен. Також ініціалізує вміст пам'яті до нулів. | виділяє "розмір" байтів пам'яті. |
Кількість аргументів | 2 | 1 |
Синтаксис | пустота * calloc (число_обігу_блоків, розмір_обігу_блок_в_байт); | void * malloc (size_in_bytes); |
Зміст виділеної пам'яті | Виділена область ініціалізується до нуля. | Зміст виділеної пам'яті не змінюється. тобто пам’ять містить непередбачувані або сміттєві значення. Це становить ризик. |
Повернене значення | void pointer (void *). Якщо розподіл вдається, повертається покажчик на блок пам'яті. Якщо розподіл пам'яті не вдається, повертається покажчик NULL. | void pointer (void *). Якщо розподіл вдається, повертається покажчик на блок пам'яті. Якщо розподіл пам'яті не вдається, повертається покажчик NULL. |
void * malloc (розмір_t розмір);
виділяє розмір
байти пам'яті. Якщо розподіл вдалося, повертається покажчик на виділену пам'ять. Інакше НУЛЬ
повертається. Приклад:
/ * Виділити пам'ять для масиву з 15 елементами типу int. * / int * ptr = malloc (15 * sizeof (int)); якщо (ptr == NULL) / * Не вдалося виділити пам'ять, тому надрукуйте помилку та закрийте. * / fprintf (stderr, "Не вдалося виділити пам'ять \ n"); вихід (EXIT_FAILURE); / * Виділення вдалося. * /
Зауважте, що малок
вимагає, щоб ми обчислили потрібні нам байти пам'яті і передали це як аргумент malloc.
void * calloc (розмір_t невизначення, розмір_t байтів);
виділяє суміжний блок пам'яті, достатньо великий для зберігання недоліки
розміру байт
кожен. Виділена область ініціалізується до нуля. У наведеному вище прикладі:
/ * Виділіть простір для масиву з 15 елементами типу int і ініціалізувати до нулів. * / int * ptr = calloc (15, sizeof (int)); якщо (ptr == NULL) / * Не вдалося виділити пам'ять, тому надрукуйте помилку та закрийте. * / fprintf (stderr, "Не вдалося виділити пам'ять \ n"); вихід (EXIT_FAILURE); / * Виділення вдалося. * /
calloc (m, n) те саме, що
p = малок (m * n); if (p) мемсет (p, 0, m * n);
Цей відео-посібник пояснює функції розподілу пам'яті малок
, calloc
і realloc
, а також функція розмежування пам'яті безкоштовно
:
Це, як правило, хороша ідея calloc
над малок
. Коли ви використовуєте malloc, вміст виділеної пам'яті непередбачувано. Помилки програмування можуть призвести до того, що цей вміст пам’яті просочиться ненавмисно, але дуже вразливо. Хорошим прикладом такого витоку є вразливість Heartbleed у OpenSSL, основний механізм якої пояснюється в цьому коміксі XKCD, а деякі додаткові технічні деталі містяться в цій публікації блогу.
calloc - це трохи повільніше, ніж malloc через додатковий крок ініціалізації виділеної області пам'яті. Однак на практиці різниця у швидкості дуже мала і їх можна ігнорувати.