calloc
Определено в заголовке <stdlib.h> | ||
|---|---|---|
void* calloc( size_t num, size_t size ); |
Выделяет память для массива num объектов типа size и инициализирует все байты в выделенной памяти нулями.
Если выделение памяти выполнено успешно, возвращает указатель на самый низкий (первый) байт в выделенном блоке памяти, который правильно выровнен для любого типа объекта с фундаментальным выравниванием.
Если size равно нулю, поведение определяется реализацией (может быть возвращён нулевой указатель, или какой-то ненулевой указатель, который может не использоваться для доступа к памяти).
|
Предыдущий вызов | (с C11) |
Параметры
| num | - | количество объектов |
| size | - | размер каждого объекта |
Возвращаемое значение
При успешном выполнении возвращает указатель на начало выделенной памяти. Для предотвращения утечки памяти, возвращённый указатель необходимо освободить с помощью free() или realloc().
При неудаче возвращает нулевой указатель.
Примечания
Из-за требований к выравниванию количество выделенных байтов не обязательно равно num * size.
Инициализация всех битов нулём не гарантирует, что число с плавающей точкой или указатель будут инициализированы соответственно значением 0.0 и нулевым указателем (хотя это справедливо для всех распространённых платформ).
Изначально (в C89) поддержка нулевого размера была добавлена для работы с кодом, таким как
OBJ* p = calloc(0, sizeof(OBJ)); // "zero-length" placeholder
...
while(1)
{
p = realloc(p, c * sizeof(OBJ)); // reallocations until size settles
... // code that may change c or break out of loop
}Пример
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* p1 = calloc(4, sizeof(int)); // allocate and zero out an array of 4 int
int* p2 = calloc(1, sizeof(int[4])); // same, naming the array type directly
int* p3 = calloc(4, sizeof *p3); // same, without repeating the type name
if (p2)
{
for (int n = 0; n < 4; ++n) // print the array
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
Ссылки
- Стандарт C23 (ISO/IEC 9899:2023):
- 7.22.3.2 Функция calloc (с. TBD)
- Стандарт 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 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/memory/calloc