Возможный дубликат:
c разница между malloc и calloc
Пожалуйста, объясните значение этого оператора,
Еще одно различие между malloc () и calloc () функций заключается в том, что память , выделенная функцией malloc () , содержит значения мусора, а память , выделенная функцией calloc () , содержит все нули.
Источник ( Программирование на «C» , Салим Ю. Амдани)
Спасибо
Из http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory
malloc ()
работает быстрее, поскольку calloc ()
инициализирует выделенную память, чтобы содержать все нули . Поскольку вы обычно хотите использовать и инициализировать память самостоятельно, в этом дополнительном преимуществе calloc ()
может не оказаться необходимости.
calloc (...)
в основном malloc
+ memset
(если вы хотите 0 инициализировать память)
ptr = malloc(sizeof(struct fubar));
memset(ptr, 0, sizeof (struct fubar)); //here we could use some different value instead of 0 whereas calloc always 0 initialises.
Когда вы используете malloc
для выделения некоторой памяти, предыдущее содержимое не очищается (т.е. не инициализируется). Вы можете получить случайные значения, которые были установлены при загрузке машины, или вы можете увидеть часть памяти, которая принадлежала ранее запущенным программам, но осталась не очищенной после выделения и выхода из программы. Сам
calloc
работает медленнее, чем malloc
, потому что вам нужно потратить некоторое время на очистку содержимого выделенной памяти. Так что, если вам просто нужно выделить немного памяти, а затем скопировать туда что-то, вы можете использовать malloc
.
calloc
инициализирует память перед ее использованием, а malloc
- нет.
Обратитесь к по этой ссылке:
Функция calloc () должна выделить неиспользуемое пространство для массива nelem элементы, размер каждого из которых в байтах это elsize. Пространство должно быть инициализируется всеми битами 0.
С malloc
, если вы хотите гарантировать тот же эффект, вам придется вызвать что-то вроде memset для сброса памяти, например
char* buffer = (char*)malloc(100);
memset(buffer,0,100);
calloc
избавит вас от лишнего шага.
Значение инициализации памяти состоит в том, что вы переводите переменную в известное состояние, а не в неизвестное. Итак, если вы проверяете переменную, скажем, элемент массива, на предмет ожидаемого значения, то, предварительно инициализировав переменную заранее, вы можете быть уверены, что проверяемое значение не является мусором. Другими словами, вы можете различать мусор и допустимые значения.
Например, если вы просто оставляете мусор в переменной и проверяете какое-то значение, скажем 42, тогда у вас нет возможности узнать, действительно ли значение было установлено вашей программой на 42, или это просто какой-то мусор. остаток, потому что вы не инициализировали его.
Это просто означает, что если вы выделяете память с помощью calloc (), все, что вы выделяете, равно 0. т.е. если вы выделили место для массива целых чисел, все они будут установлены в 0, тогда как с malloc () память никак не инициализируется.
Вы можете использовать calloc в ситуациях, когда вы в любом случае собираетесь просто установить в память memset, равный 0.