calloc
| Определено в заголовочном файле <stdlib.h>
|
||
void *calloc( size_t num, size_t size ); |
||
Выделяет память для массива из num объектов, каждый размером size и инициализирует все байты выделенной области нулями.
При успешном выделении возвращает указатель на младший (первый) байт выделенного блока, выравненный подходящим образом для объекта любого типа с помощью фундаментального выравнивания.
Если size равен нулю, то поведение зависит от реализации (может быть возвращён нулевой указатель или некоторый ненулевой указатель, который не может использоваться для доступа к памяти)
|
Предшествующий вызов free или realloc, который освобождает область памяти синхронизируется с вызовом calloc, который выделяет ту же или часть той же области памяти. Эта синхронизация выполняется после любого доступа к памяти с помощью освобождающей функции и перед любым доступом к памяти с помощью |
(начиная с C11) |
Параметры
| num | — | количество объектов |
| size | — | размер каждого объекта |
Возвращаемое значение
При успехе возвращает указатель на начало вновь выделенного блока памяти. Чтобы избежать утечек памяти, возвращённый указатель должен быть освобождён с помощью free() или realloc().
При отказе возвращает нулевой указатель.
Замечания
Из-за требований для выравнивания, количество выделенных байтов не обязательно совпадает с num*size.
Инициализация всех битов нулём не гарантирует, что вещественное с плавающей точкой или указатель будут инициализированы 0.0 и нулевым указателем соответственно (хотя это верно для всех общераспространённых платформ)
Изначально (в C89) поддержка нулевого размера была добавлена для совместимости с таким кодом как
OBJ *p = calloc(0, sizeof(OBJ)); // заполнитель "нулевой длины"
...
while(1) {
p = realloc(p, c * sizeof(OBJ)); // перевыделение, пока размер не подойдёт
... // код, который может изменять c или выйти из цикла
}
Пример
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p1 = calloc(4, sizeof(int)); // выделение и обнуление массива из 4-х значения типа int
int *p2 = calloc(1, sizeof(int[4])); // то же самое, явно указывая тип массива
int *p3 = calloc(4, sizeof *p3); // то же самое без указания типа
if(p2) {
for(int n=0; n<4; ++n) // вывод массива
printf("p2[%d] == %d\n", n, p2[n]);
}
free(p1);
free(p2);
free(p3);
}
Вывод:
p2[0] == 0
p2[1] == 0
p2[2] == 0
p2[3] == 0
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.22.3.2 Функция calloc (стр. 253)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.22.3.2 Функция calloc (стр. 348)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.20.3.1 Функция calloc (стр. 313)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.10.3.1 Функция calloc
См. также
Документация C++ по calloc
|