Calloc против Malloc

когда calloc используется для выделения блока памяти, выделенная область инициализируется нулями. Напротив, таНос не касается содержимого выделенного блока памяти, что означает, что он содержит значения мусора. Это потенциально может быть угрозой безопасности, поскольку содержимое памяти непредсказуемо, а ошибки программирования могут привести к утечке этого содержимого..

Сравнительная таблица

Отличия - сходства - Сравнительная таблица calloc и malloc
callocтаНос
функция выделяет область памяти, достаточно большую, чтобы вместить «n элементов» байтов «size» каждый. Инициализирует содержимое памяти на нули. выделяет «размер» байтов памяти.
Количество аргументов 2 1
Синтаксис void * calloc (number_of_blocks, size_of_each_block_in_bytes); void * malloc (size_in_bytes);
Содержимое выделенной памяти Выделенный регион инициализируется нулем. Содержимое выделенной памяти не изменяется. то есть память содержит непредсказуемые или мусорные значения. Это представляет риск.
Возвращаемое значение пустой указатель (void *). Если выделение выполнено успешно, возвращается указатель на блок памяти. Если выделение памяти не удается, возвращается указатель NULL. пустой указатель (void *). Если выделение выполнено успешно, возвращается указатель на блок памяти. Если выделение памяти не удается, возвращается указатель NULL.

Содержание: calloc против malloc

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

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

таНос ()

void * malloc (size_t size); 

выделяет размер байты памяти. Если выделение выполнено успешно, возвращается указатель на выделенную память. В противном случае ЗНАЧЕНИЕ NULL возвращается Пример:

/ * Выделить память для массива с 15 элементами типа ИНТ. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * Не удалось выделить память, поэтому выведите ошибку и выйдите. * / fprintf (stderr, "Не удалось выделить память \ n"); Выход (EXIT_FAILURE);  / * Распределение выполнено успешно. * / 

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

calloc ()

void * calloc (size_t nelements, size_t bytes); 

выделяет непрерывный блок памяти, достаточно большой для хранения nelements размера байтов каждый. Выделенная область инициализируется нулем. В приведенном выше примере:

/ * Выделить место для массива с 15 элементами типа ИНТ и инициализировать в нули. * / int * ptr = calloc (15, sizeof (int)); if (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 справочная страница
  • таНос справочная страница