Подтвердить что ты не робот

C - calloc() v. Malloc()

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

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

Другой разница между malloc() и Функции calloc() - это то, что память выделено функцией malloc() содержит значения мусора, а память выделено функцией calloc() содержит все нули.

Источник (программирование "C", Салим Я. Амдани)

Спасибо

4b9b3361

Ответ 1

От http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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.

Ответ 4

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

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