2015-08-08 5 views
35

Студент задал вопрос, и я не знал точно.Что означает первый «c» в «calloc»?

Предположений включают в себя: «насчитали», «очистка», «фрагментированный», «полным», ...

документация стандартной библиотеки не говорит, что это означает и не будет названо так же функции что указывает на шаблон. Кто-нибудь знает настоящую этимологию и, возможно, имеет авторитетную ссылку на ее поддержку?

+3

Моя ставка по теме "смежная". Выделите смежные блоки 'nmemb'' size'. (http://stackoverflow.com/a/31889465/694576) – alk

+0

Взято из 'man 3 calloc':' void * calloc (size_t nmemb, size_t size); '- функция' calloc() 'выделяет память для массива элементов 'nmemb' байтов размера каждый и возвращает указатель на выделенную память. Память установлена ​​равной нулю. Если 'nmemb' или size равно 0, то' calloc() 'возвращает либо NULL, либо уникальное значение указателя, которое впоследствии может быть успешно передано' free() '. – gengisdave

+2

Это просто пятая буква «выделения». О, вы имеете в виду * first * c? – Jens

ответ

46

Согласно выписке из книги Linux System Programming (автор Robert Love), официальные источники не существуют по этимологии calloc.


некоторых правдоподобных кандидатов кажутся:

  1. графа или подсчитываются, потому что calloc занимает отдельное количество аргументов.
  2. Очистить, поскольку он обеспечивает очистку возвращенного фрагмента памяти.

    • Брайан Керниган, как сообщается, считает, что «с» означает ясный (хотя он признал, что он не уверен).
    • (см комментарии.) Ранний calloc.c, кажется, содержит прямую ссылку на слово ясно в исходном коде комментарий (но не ссылки на слова счета или к любому другому кандидату). В другом комментарии к исходному коду в файле malloc.c снова появляется слово clear, ссылаясь на слово calloc.
  3. C, как на языке С.

    • (См alk's answer и комментарии.) Возможно соглашение об именах для набора функций, которые были введены примерно в то же время.
+15

V7 (версия, которая добавила исходный код 'malloc()' и 'calloc()' в Unix) [использует сообщение clear в комментарии] (https://github.com/dspinellis/unix-history-repo/ blob/Research-V7/usr/src/libc/gen/calloc.c) и фактически очищает выделенный блок памяти. – cremno

+2

@cremno Вау, это чрезвычайно полезный справочный репозиторий. И это, вероятно, приближает нас к ответу, который мы можем получить. Я отредактировал ответ, чтобы включить вашу ссылку. –

+3

И для чего же стоит 'c' в' cfree() '? : -S – alk

1

calloc = смежное распределение памяти.

Это означает, что в соответствии с синтаксисом calloc()

т.е.
void *calloc (size_t number_of_blocks, size_t size_of_each_block_in_bytes); 

он получает два параметра: нет. блоков и размера одного блока, поэтому он выделяет массив памяти для no. блоков, которые вы предоставите.

+8

Но 'malloc' и' realloc' также выделяют смежную область памяти. Было бы очень странно назвать что-то после того, как оно делится со всеми другими подобными вещами. –

3

Я не думаю, что кто-нибудь знает. Но описание вызова calloc() с семантикой, что память должна быть очищена, в отличие от malloc (memory allocate), которая возвращает любой случайный мусор, оставшийся от предыдущей операции free(), является полезным modus operandi для студентов, что полезно в том, что он напоминает пользователю, что malloc() возвращает небезопасное значение.

7

Я сделал некоторые исследования и обнаружили следующее "[email protected] TIME-SHARING SYSTEM: UNIX PROGRAMMER'S MANUAL. Seventh Edition, Volume 2", chapter "PROGRAMMING" (Курсив мной):

char *malloc(num); 

выделяет num байт. Возвращаемый указатель достаточно хорошо выровнен для использования в любых целях. NULL возвращается, если пространство не доступно.

char *calloc(num, size); 

выделяет пространство для num элементов, каждая из которых size размера. Предполагается, что пространство будет установлено равным 0, а указатель достаточно хорошо выровнен для использования в любых целях. NULL возвращается, если пространство не доступно.

cfree(ptr) char *ptr; 

Пространство возвращается в бассейн, используемый calloc. Неисправности можно ожидать, если указатель не получен от calloc.

  • Последнее предложение является ясным доказательством того, что calloc() определенно (значит быть?) больше различных от malloc() затем просто путем очистки из памяти.

    Интересный достаточно там нет ссылки на free() на любой из этих нескольких сотен страниц ... :-)

  • Кроме того UNIX V6 уже calloc() который вызывает alloc(). Источник (связанный) не показывает никакого подхода к обнулению любой памяти.

Заключительное от обоих фактов выше, я категорически возражаю теорию о том, что ведущий «с» в calloc() стендами для «ясно».

+0

Возможно, это изначально предназначалось для чего-то другого, но оно было определенно переназначено (как и остальная часть iolib, которая стала Vst libstdio). Думаю, будет сложно получить окончательный ответ (однако мистер Леск, похоже, все еще жив). К сожалению, уже есть принятый ответ. Btw. как насчет «подсчета»? – cremno

+0

@cremno: Я не буду спекулировать в ответе. Однако в данный момент я бы поставил ставку на «* coalesce *» или «* compact *». – alk

+0

Я не следую вашему заключению о последнем предложении документации как о «четком доказательстве» чего-либо, кроме того, что он позволяет реализовать «calloc», чтобы сделать что-то другое, чем «malloc» и обнулить (например , давая память из предварительно обнуленного источника). –