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);