Spec-Zone.ru › C

calloc

Определено в заголовке <stdlib.h>
void* calloc( size_t num, size_t size );

Выделяет память для массива num объектов типа size и инициализирует все байты в выделенной памяти нулями.

Если выделение памяти выполнено успешно, возвращает указатель на самый низкий (первый) байт в выделенном блоке памяти, который правильно выровнен для любого типа объекта с фундаментальным выравниванием.

Если size равно нулю, поведение определяется реализацией (может быть возвращён нулевой указатель, или какой-то ненулевой указатель, который может не использоваться для доступа к памяти).

calloc является потокобезопасным: оно ведет себя так, как будто обращается только к ячейкам памяти, видимым через свой аргумент, а не к какой-либо статической памяти.

Предыдущий вызов free или realloc, освобождающий область памяти, синхронизируется с вызовом calloc, выделяющим ту же или часть той же области памяти. Эта синхронизация происходит после любого доступа к памяти функцией освобождения и перед любым доступом к памяти функцией calloc. Существует единый общий порядок всех функций выделения и освобождения памяти, работающих с каждой конкретной областью памяти.

(с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API