Книга: Linux программирование в примерах
3.2.1.5. Выделение с инициализацией нулями: calloc()
3.2.1.5. Выделение с инициализацией нулями: calloc()
Функция calloc()
является простой оболочкой вокруг malloc()
. Главным ее преимуществом является то, что она обнуляет динамически выделенную память. Она также вычисляет за вас размер памяти, принимая в качестве параметра число элементов и размер каждого элемента:
coordinates = (struct coord*)calloc(count, sizeof(struct coord));
По крайней мере идейно, код calloc()
довольно простой. Вот одна из возможных реализаций:
void *calloc(size_t nmemb, size_t size) {
void *p;
size_t total;
total = nmemb * size; /* Вычислить размер */
p = malloc(total); /* Выделить память */
if (p != NULL) /* Если это сработало - */
memset(p, '', total); /* Заполнить ее нулями */
return p; /* Возвращаемое значение NULL или указатель */
}
Многие опытные программисты предпочитают использовать calloc()
, поскольку в этом случае никогда не возникает вопросов по поводу вновь выделенной памяти.
Если вы знаете, что вам понадобится инициализированная нулями память, следует также использовать calloc()
, поскольку возможно, что память, возвращенная malloc()
, уже заполнена нулями. Хотя вы, программист, не можете этого знать, calloc()
может это знать и избежать лишнего вызова memset()
.
- 3.2.1.1. Исследование подробностей на языке С
- 3.2.1.2. Начальное выделение памяти: malloc()
- 3.2.1.3. Освобождение памяти: free()
- 3.2.1.4. Изменение размера: realloc()
- 3.2.1.5. Выделение с инициализацией нулями: calloc()
- 3.2.1.6. Подведение итогов из GNU Coding Standards
- 3.2.1.7. Использование персональных программ распределения
- 3.2.1.8. Пример: чтение строк произвольной длины
- 3.2.1.9. Только GLIBC: чтение целых строк: getline() и getdelim()
- Уровни логического нуля и единицы
- 3.2.1. Библиотечные вызовы: malloc(), calloc(), realloc(), free()
- 3.2. Выделение памяти
- 3.2.1.2. Начальное выделение памяти: malloc()
- Получение страниц заполненных нулями
- Выделение огромных объемов памяти
- Выделение группы файлов
- Выделение ячеек
- Выделение памяти
- Простое выделение памяти
- Статическое выделение памяти в стеке
- 14.1. Выделение выровненной памяти: posix_memalign() и memalign()