Почему 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.