close
Пространства имён
Варианты
Действия

calloc

Материал из cppreference.com
< c | memory
<tbody> </tbody>
Определено в заголовочном файле <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)); // заполнитель "нулевой длины"
...
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

Ссылки

  • Стандарт 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

См. также