когда calloc используется для выделения блока памяти, выделенная область инициализируется нулями. Напротив, таНос не касается содержимого выделенного блока памяти, что означает, что он содержит значения мусора. Это потенциально может быть угрозой безопасности, поскольку содержимое памяти непредсказуемо, а ошибки программирования могут привести к утечке этого содержимого..
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. |
void * malloc (size_t size);
выделяет размер
байты памяти. Если выделение выполнено успешно, возвращается указатель на выделенную память. В противном случае ЗНАЧЕНИЕ NULL
возвращается Пример:
/ * Выделить память для массива с 15 элементами типа ИНТ. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * Не удалось выделить память, поэтому выведите ошибку и выйдите. * / fprintf (stderr, "Не удалось выделить память \ n"); Выход (EXIT_FAILURE); / * Распределение выполнено успешно. * /
Обратите внимание, что таНос
требует, чтобы мы вычислили нужные нам байты памяти и передали это в качестве аргумента в malloc.
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
и перераспределить
, а также функция выделения памяти свободно
:
Как правило, это хорошая идея для использования calloc
над таНос
. Когда вы используете malloc, содержимое выделенной памяти непредсказуемо. Ошибки программирования могут привести к утечке содержимого памяти непреднамеренным, но очень уязвимым образом. Хорошим примером такой утечки является уязвимость Heartbleed в OpenSSL, основной механизм которой описан в этом комиксе XKCD, а некоторые технические подробности содержатся в этом сообщении в блоге..
calloc немного медленнее, чем malloc, из-за дополнительного шага инициализации выделенной области памяти. Однако на практике разница в скорости очень мала и ее можно игнорировать.