Почему calloc принимает два аргумента, а malloc - только один?
IMO достаточно, почему calloc
требуется разбить его на два аргумента?
Ответы
Ответ 1
Я бы предположил, что это, вероятно, история и предшествует временам, когда у C были прототипы для функций. В это время без прототипа аргументы в основном должны были быть int
, typedef
size_t
, вероятно, еще не изобрели. Но тогда INTMAX
- это самый большой кусок, который вы могли бы выделить с помощью malloc
, а разделение его на два просто дает вам большую гибкость и позволяет выделять действительно большие массивы. Даже в то время существовали методы получения больших страниц из системы, которые по умолчанию были обнулены, поэтому эффективность не была проблемой с calloc
, чем для malloc
.
В настоящее время с size_t
и прототипом функции, это просто ежедневное напоминание о богатой истории C.
Ответ 2
Имена параметров документируют это достаточно хорошо:
void *malloc(size_t size);
void *calloc(size_t nelem, size_t elsize);
Последняя форма позволяет аккуратно распределять массивы, предоставляя количество элементов и размер элемента. Такое же поведение может быть достигнуто с помощью malloc
путем умножения.
Однако calloc
также инициализирует выделенную память до 0. malloc
не инициализирует, поэтому значение undefined. malloc
может быть быстрее, теоретически, из-за того, что не задана вся память; это может быть отмечено только в больших количествах.
В этом вопросе предлагается calloc
clear-alloc и malloc
- mem-alloc.