calloc
|
Определено в заголовочном файле
<stdlib.h>
|
||
Выделяет память для массива из num объектов размером size и инициализирует все байты в выделенной памяти нулевыми значениями.
Если выделение памяти завершается успешно, возвращает указатель на самый младший (первый) байт в выделенном блоке памяти, который соответствующим образом выровнен для любого типа объекта с фундаментальным выравниванием .
Если size равен нулю, поведение определяется реализацией (может быть возвращен нулевой указатель, или может быть возвращен некоторый ненулевой указатель, который нельзя использовать для доступа к памяти).
|
Предыдущий вызов
free
,
free_sized
, и
free_aligned_sized
(since C23)
или
realloc
, который освобождает область памяти,
синхронизируется-с
вызовом
|
(since 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
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 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
|