calloc vs. malloc

Коли calloc використовується для виділення блоку пам'яті, виділена область ініціалізується до нулів. У контрасті, малок не торкається вмісту виділеного блоку пам'яті, а значить, він містить значення сміття. Це потенційно може становити загрозу безпеці, оскільки вміст пам'яті непередбачувано, а помилки програмування можуть призвести до витоку цього вмісту.

Порівняльна діаграма

Відмінності - схожість - діаграма порівняння calloc проти malloc
callocмалок
Функція виділяє область пам'яті, достатньо велику, щоб вмістити "n елементів" розміру "байт" кожен. Також ініціалізує вміст пам'яті до нулів. виділяє "розмір" байтів пам'яті.
Кількість аргументів 2 1
Синтаксис пустота * calloc (число_обігу_блоків, розмір_обігу_блок_в_байт); void * malloc (size_in_bytes);
Зміст виділеної пам'яті Виділена область ініціалізується до нуля. Зміст виділеної пам'яті не змінюється. тобто пам’ять містить непередбачувані або сміттєві значення. Це становить ризик.
Повернене значення void pointer (void *). Якщо розподіл вдається, повертається покажчик на блок пам'яті. Якщо розподіл пам'яті не вдається, повертається покажчик NULL. void pointer (void *). Якщо розподіл вдається, повертається покажчик на блок пам'яті. Якщо розподіл пам'яті не вдається, повертається покажчик NULL.

Зміст: calloc vs. malloc

  • 1 Синтаксис та приклади
    • 1,1 малок ()
    • 1,2 calloc ()
  • 2 Відео, що пояснює Calloc, Malloc та Realloc
  • 3 міркування безпеки
  • 4 Швидкість виконання
  • 5 Список літератури

Синтаксис та приклади

malloc ()

void * malloc (розмір_t розмір); 

виділяє розмір байти пам'яті. Якщо розподіл вдалося, повертається покажчик на виділену пам'ять. Інакше НУЛЬ повертається. Приклад:

/ * Виділити пам'ять для масиву з 15 елементами типу int. * / int * ptr = malloc (15 * sizeof (int)); якщо (ptr == NULL) / * Не вдалося виділити пам'ять, тому надрукуйте помилку та закрийте. * / fprintf (stderr, "Не вдалося виділити пам'ять \ n"); вихід (EXIT_FAILURE);  / * Виділення вдалося. * / 

Зауважте, що малок вимагає, щоб ми обчислили потрібні нам байти пам'яті і передали це як аргумент malloc.

calloc ()

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, Malloc та Realloc

Цей відео-посібник пояснює функції розподілу пам'яті малок, calloc і realloc, а також функція розмежування пам'яті безкоштовно:

Міркування щодо безпеки

Це, як правило, хороша ідея calloc над малок. Коли ви використовуєте malloc, вміст виділеної пам'яті непередбачувано. Помилки програмування можуть призвести до того, що цей вміст пам’яті просочиться ненавмисно, але дуже вразливо. Хорошим прикладом такого витоку є вразливість Heartbleed у OpenSSL, основний механізм якої пояснюється в цьому коміксі XKCD, а деякі додаткові технічні деталі містяться в цій публікації блогу.

Швидкість виконання

calloc - це трохи повільніше, ніж malloc через додатковий крок ініціалізації виділеної області пам'яті. Однак на практиці різниця у швидкості дуже мала і їх можна ігнорувати.

Список літератури

  • calloc сторінка man
  • малок сторінка man