Я следую этому учебному руководству (http://theocacao.com/document.page/234). Я смущен этим абзацем, главным образом строки, касающиеся calloc:
Мы можем также использовать изменение функции malloc, вызванной calloc. calloc функция берет два аргумента, количество значения и основной размер значения. Это также очищает память прежде, чем возвратить указатель, который полезен в предотвращении непредсказуемого поведения и катастрофических отказов в определенных случаях:
Та последняя строка смущает меня. Что означает очистить память?
Функция calloc гарантирует, что все байты в возвращаемой памяти будут установлены на 0. malloc таких гарантий не дает. Возвращаемые им данные могут и будут состоять из, казалось бы, случайных данных.
Различие очень полезно для инициализации членов данных. Если 0 является хорошим значением по умолчанию для всех значений в структуре, то calloc может упростить создание структуры.
Foo* pFoo = calloc(1, sizeof(Foo));
vs.
Foo* pFoo = malloc(sizeof(Foo));
pFoo->Value1 = 0;
pFoo->Value2 = 0;
Для наглядности пропущена нулевая проверка.
Чтобы быть точным:
который полезен для того, чтобы избежать непредсказуемое поведение и аварии в некоторых случаях
следует читать:
что полезно при ХАЙДИНГЕ непредсказуемое поведение и аварии certain cases
«Очистить память» в этом case означает заполнить его физическим битовым шаблоном полностью нулевого значения. Обратите внимание, что с формальной точки зрения такая инициализация необработанной памяти гарантированно работает только с целыми типами. Т.е. объекты целочисленных типов гарантированно получат начальные значения нуля. Будет ли это значимо инициализироваться какими-либо другими типами, определяется реализацией. (Для предоставления дополнительных гарантий требуются дополнительные стандарты, которые выходят за рамки стандарта C. POSIX, IEEE 754 и т. Д.)
Фактически делает ли использование calloc
для «предотвращения сбоев», как описано в цитате, смысл другой вопрос. Я бы сказал, что это действительно может улучшить стабильность кода, написанного ленивыми программистами, в том смысле, что он свяжет все возможные неожиданные поведения, вызванные различными значениями мусора, в одно конкретное неожиданное поведение, запускаемое значениями, полностью равными нулю.