IMO одного достаточно, почему calloc
требуется разделить его на два аргумента?
Почему calloc принимает два аргумента, а malloc — только один?
Ответы (2)
Я предполагаю, что это, вероятно, история и предшествует временам, когда C имел прототипы для функций. В те времена без прототипа аргументы в основном должны были быть int
, typedef
size_t
, вероятно, еще даже не были изобретены. Но тогда INTMAX
— это самый большой кусок, который вы можете выделить с помощью malloc
, и разделение его на две части просто дает вам больше гибкости и позволяет вам выделять действительно большие массивы. Даже в то время существовали методы получения больших страниц из системы, которые по умолчанию обнулялись, поэтому эффективность была не такой большой проблемой для calloc
, чем для malloc
.
В настоящее время, когда под рукой есть size_t
и прототип функции, это просто ежедневное напоминание о богатой истории C.
calloc
указатель, который они не могли впоследствии realloc
произвольно или на котором они не могли использовать, например. memset
или memcpy
? Не стесняйтесь раздражаться на мою педантичность, но было бы разумно сказать что-нибудь о возврате sizeof() без знака и выделении массивов немного больше, чем INT_MAX
.
- person Jeff Hammond; 20.04.2015
int
. И long int
существовал, так что было решение более крупной проблемы, чем int
, даже если size_t
еще не было.
- person Jeff Hammond; 20.04.2015
int
, не предоставляет прототипов. Они были представлены в C89. Что касается несоответствия с malloc
и realloc
, вы, вероятно, правы, и это странный выбор интерфейса. Но, к сожалению, это одна из немногих вещей, которые остались и с которыми мы сейчас застряли.
- person Jens Gustedt; 20.04.2015
int
, не предоставляет прототипов. Они были представлены в C89. Что касается несоответствия с malloc
и realloc
, вы, вероятно, правы, и это странный выбор интерфейса. Но, к сожалению, это одна из немногих вещей, которые остались и с которыми мы сейчас застряли.
- person Jens Gustedt; 20.04.2015
Имена параметров документируют это достаточно хорошо:
void *malloc(size_t size);
void *calloc(size_t nelem, size_t elsize);
Последняя форма позволяет аккуратно размещать массивы, указывая количество элементов и размер элемента. Такого же поведения можно добиться с помощью malloc
путем умножения.
Однако calloc
также инициализирует выделенную память значением 0. malloc
не выполняет инициализацию, поэтому значение не определено. malloc
теоретически может быть быстрее из-за того, что не выделяется вся память; это можно заметить только при больших количествах.
В этом вопросе предполагается, что calloc
— это clear-alloc, а malloc
— память-аллок.
malloc
(хотя, если вы выделяете объекты такого размера, который может переполниться, вы можете делать это неправильно).
- person Chris Lutz; 24.09.2011
cccalloc
, который принимает 6 аргументов и выделяет a*b + c*d + e*f
байта с проверкой переполнения для всех подвыражений... ;-)
- person R.. GitHub STOP HELPING ICE; 24.09.2011
malloc
.
- person Jens Gustedt; 24.09.2011
calloc
очищают память. Это, по крайней мере, хорошая часть ответа.
- person ssube; 24.09.2011
a * b + (c + d) * e + f
пространство. ;)
- person Chris Lutz; 25.09.2011
char *s, size_t l
примерно так же ясно, как я иногда делаю вещи.
- person Chris Lutz; 25.09.2011
l
ever только потому, что их шрифты отстой. ;-) Мне кажется, что как только ваша функция станет настолько большой, что однобуквенные имена переменных сбивают с толку, вероятно, пришло время реорганизовать...
- person R.. GitHub STOP HELPING ICE; 25.09.2011
#define calloc(x) (calloc)(x, 1)
должно работать. - person Chris Lutz   schedule 24.09.2011calloc
имеет преимущество в том, что может выделять болееSIZE_MAX
байтов; хотя некоторые распространенные реализации перепутали это и умножили аргументы с точностьюsize_t
- person M.M   schedule 13.03.2015