Spec-Zone.ru › C

calloc

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

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

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

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

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

Предыдущий вызов free, free_sized и free_aligned_sized(начиная с C23) или 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(p3);
    free(p2);
    free(p1);
}

Вывод:

p2[0] == 0
p2[1] == 0
p2[2] == 0
p2[3] == 0

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 7.24.3.2 Функция calloc (стр. 365)
  • Стандарт 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/c/memory/calloc

Spec-Zone.ru

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