Namespaces
Variants

calloc

From cppreference.net
Определено в заголовочном файле <stdlib.h>
void * calloc ( size_t num, size_t size ) ;

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

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

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

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

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

(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

Смотрите также