Учебный вопрос, касающийся calloc vs malloc - PullRequest
9 голосов
/ 06 февраля 2010

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

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

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

Ответы [ 3 ]

20 голосов
/ 06 февраля 2010

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

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

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

против

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

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

7 голосов
/ 06 февраля 2010

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

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

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

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

4 голосов
/ 06 февраля 2010

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

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

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