calloc срещу malloc

Кога calloc се използва за разпределяне на блок памет, разпределеният регион се инициализира до нули. За разлика, изчистване не докосва съдържанието на разпределения блок памет, което означава, че съдържа стойности за боклук. Това потенциално може да представлява риск за сигурността, тъй като съдържанието на паметта е непредсказуемо и грешките в програмирането могат да доведат до изтичане на това съдържание.

Сравнителна диаграма

Разлики - прилики - calloc спрямо malloc сравнителна диаграма
callocизчистване
функция разпределя област от паметта достатъчно голяма, за да побере "n елементи" от "размер" байтове всеки. Също така инициализира съдържанието на паметта до нули. разпределя "размер" байтове на паметта.
Брой аргументи 2 1
Синтаксис void * calloc (number_of_blocks, size_of_each_block_in_bytes); void * malloc (size_in_bytes);
Съдържание на разпределената памет Определеният регион се инициализира до нула. Съдържанието на разпределената памет не се променя. т.е. паметта съдържа непредсказуеми или стойности за боклук. Това представлява риск.
Възвратна стойност void pointer (void *). Ако разпределението успее, се връща показалец към блока памет. Ако разпределението на паметта не успее, се връща NULL показалец. void pointer (void *). Ако разпределението успее, се връща показалец към блока памет. Ако разпределението на паметта не успее, се връща NULL показалец.

Съдържание: calloc спрямо malloc

  • 1 Синтаксис и примери
    • 1.1 malloc ()
    • 1,2 calloc ()
  • 2 Видео, обясняващо Calloc, Malloc и Realloc
  • 3 Съображения за сигурност
  • 4 Скорост на изпълнение
  • 5 Позовавания

Синтаксис и примери

изчистване ()

void * malloc (размер_t размер); 

Разпределя размер байтове памет. Ако разпределението успее, се връща указател към разпределената памет. В противен случай НУЛА се връща. Пример:

/ * Отделете памет за масив с 15 елемента от типа инт. * / int * ptr = malloc (15 * sizeof (int)); ако (ptr == NULL) / * Паметта не може да бъде разпределена, така че отпечатайте грешка и излезте. * / fprintf (stderr, "Не можа да разпределя памет \ n"); изход (EXIT_FAILURE);  / * Разпределението е успешно. * / 

Отбележи, че изчистване изисква да изчислим необходимите ни байтове на паметта и да ги предадем като аргумент на malloc.

calloc ()

void * calloc (размер_t зависимости, размер_t байтове); 

разпределя непрекъснат блок памет, достатъчно голям, за да побере nelements на размер байта всеки. Определеният регион се инициализира до нула. В горния пример:

/ * Отделете място за масив с 15 елемента от типа инт и се инициализира до нули. * / int * ptr = calloc (15, sizeof (int)); ако (ptr == NULL) / * Паметта не може да бъде разпределена, така че отпечатайте грешка и излезте. * / fprintf (stderr, "Не можа да разпределя памет \ n"); изход (EXIT_FAILURE);  / * Разпределението е успешно. * / 

calloc (m, n) е същото като

p = malloc (m * n); if (p) memset (p, 0, m * n); 

Видео, обясняващо Calloc, Malloc и Realloc

Този видео урок обяснява функциите за разпределение на паметта изчистване, calloc и презаделяне, както и функцията за разделяне на паметта Безплатно:

Съображения за сигурност

Като цяло е добра идея да се използва calloc над изчистване. Когато използвате malloc, съдържанието на разпределената памет е непредсказуемо. Грешките в програмирането могат да доведат до изтичане на съдържанието на тази памет по непредвидени, но силно уязвими начини. Добър пример за такъв теч е уязвимостта на Heartbleed в OpenSSL, основният механизъм на който е обяснен в този комикс на XKCD, а някои повече технически подробности са в тази публикация в блога.

Скорост на изпълнение

calloc е малко по-бавен от malloc поради допълнителната стъпка на инициализиране на разпределения регион на паметта. На практика обаче разликата в скоростта е много малка и може да се игнорира.

Препратки

  • calloc man страница
  • изчистване man страница