Почему calloc принимает два аргумента, а malloc только один? - PullRequest
8 голосов
/ 24 сентября 2011

ИМО достаточно, почему calloc требует разбить его на два аргумента?

Ответы [ 2 ]

7 голосов
/ 24 сентября 2011

Я предполагаю, что это, вероятно, история, предшествующая временам, когда у С были прототипы для функций.В те времена без прототипа аргументы в основном должны были быть int, typedef size_t, вероятно, даже не были изобретены.Но тогда INTMAX - это самый большой кусок, который вы можете выделить с помощью malloc, а разделение его на две части просто дает вам большую гибкость и позволяет вам выделять действительно большие массивы.Даже в то время существовали методы получения больших страниц из системы, которые по умолчанию обнулялись, поэтому эффективность была не столько проблемой с calloc, сколько для malloc.

В настоящее время с size_t и прототип функции под рукой, это всего лишь ежедневное напоминание о богатой истории C.

3 голосов
/ 24 сентября 2011

Имена параметров достаточно хорошо документируют:

void *malloc(size_t size);
void *calloc(size_t nelem, size_t elsize);

Последняя форма позволяет аккуратно распределять массивы, предоставляя количество элементов и размер элемента. Такое же поведение может быть достигнуто с помощью malloc, умножением.

Однако calloc также инициализирует выделенную память равной 0. malloc не инициализирует, поэтому значение не определено. malloc теоретически может быть быстрее из-за не установки всей памяти; это может быть отмечено только в больших количествах.

В этом вопросе предполагается, что calloc - clear-alloc и malloc - mem-alloc.

...