C вопросник, связанный с calloc vs malloc

Я следую этому учебник (http://theocacao.com/document.page/234). Я смущен этим абзацем, главным образом, строками, относящимися к calloc:

Мы также можем использовать вариацию функции malloc, называемую calloc. Функция calloc принимает два аргумента, количество значений и размер базового значения. Он также очищает память перед возвратом указателя, что полезно для предотвращения непредсказуемого поведения и сбоев в определенных случаях:

Эта последняя строка меня смущает. Что значит очистить память?

Ответ 1

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

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

Foo* pFoo = calloc(1, sizeof(Foo));

против.

Foo* pFoo = malloc(sizeof(Foo));
pFoo->Value1 = 0;
pFoo->Value2 = 0;

Нулевая проверка опущена для ясности.

Ответ 2

Чтобы быть точным:

что полезно избегать непредсказуемое поведение и сбои в некоторые случаи

следует читать:

который полезен в HIDING непредсказуемое поведение и сбои в некоторые случаи

Ответ 3

"Чтобы очистить память" в этом случае означает заполнить ее физическим шаблоном с полным нолем. Обратите внимание, что с формальной точки зрения такая инициализация необработанной памяти гарантируется только с интегральными типами. То есть объекты интегральных типов гарантированно получат начальные значения нуля. Будут ли какие-либо другие типы осмысленно инициализированы этим, это определяется реализацией. (Для обеспечения дополнительных гарантий требуется дополнительные стандарты, выходящие за пределы стандарта C). POSIX, IEEE 754 и т.д.)

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

Ответ 4

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

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

Не: Как использовать функцию malloc() качестве calloc()?

Функция malloc() может использоваться как функция calloc() с помощью функции memset() библиотеки string.h как string.h ниже.

int *ptr;
ptr=malloc(size);
memset(ptr,0,size);