C - calloc () v. Malloc () [дубликат]

Возможный дубликат:
c разница между malloc и calloc

Пожалуйста, объясните значение этого оператора,

Еще одно различие между malloc () и calloc () функций заключается в том, что память , выделенная функцией malloc () , содержит значения мусора, а память , выделенная функцией calloc () , содержит все нули.

Источник ( Программирование на «C» , Салим Ю. Амдани)

Спасибо

32
задан Community 23 May 2017 в 12:02
поделиться

4 ответа

Из http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory

malloc () работает быстрее, поскольку calloc () инициализирует выделенную память, чтобы содержать все нули . Поскольку вы обычно хотите использовать и инициализировать память самостоятельно, в этом дополнительном преимуществе calloc () может не оказаться необходимости.

39
ответ дан 27 November 2019 в 20:17
поделиться

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 .

8
ответ дан 27 November 2019 в 20:17
поделиться

calloc инициализирует память перед ее использованием, а malloc - нет.

Обратитесь к по этой ссылке:

Функция calloc () должна выделить неиспользуемое пространство для массива nelem элементы, размер каждого из которых в байтах это elsize. Пространство должно быть инициализируется всеми битами 0.

С malloc , если вы хотите гарантировать тот же эффект, вам придется вызвать что-то вроде memset для сброса памяти, например

char* buffer = (char*)malloc(100);
memset(buffer,0,100);

calloc избавит вас от лишнего шага. Значение инициализации памяти состоит в том, что вы переводите переменную в известное состояние, а не в неизвестное. Итак, если вы проверяете переменную, скажем, элемент массива, на предмет ожидаемого значения, то, предварительно инициализировав переменную заранее, вы можете быть уверены, что проверяемое значение не является мусором. Другими словами, вы можете различать мусор и допустимые значения.

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

24
ответ дан 27 November 2019 в 20:17
поделиться

Это просто означает, что если вы выделяете память с помощью calloc (), все, что вы выделяете, равно 0. т.е. если вы выделили место для массива целых чисел, все они будут установлены в 0, тогда как с malloc () память никак не инициализируется.

Вы можете использовать calloc в ситуациях, когда вы в любом случае собираетесь просто установить в память memset, равный 0.

3
ответ дан 27 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: