C учебный вопрос, касающийся calloc по сравнению с malloc

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

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

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

10
задан Jonathan Leffler 6 February 2010 в 19:45
поделиться

3 ответа

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

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

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

vs.

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

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

21
ответ дан 3 December 2019 в 14:43
поделиться

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

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

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

что полезно при ХАЙДИНГЕ непредсказуемое поведение и аварии certain cases

7
ответ дан 3 December 2019 в 14:43
поделиться

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

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

4
ответ дан 3 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

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