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

std::calloc

Материал из cppreference.com
< cpp‎ | memory‎ | c
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
Определено в заголовочном файле <cstdlib>
void* calloc( std::size_t num, std::size_t size );

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

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

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

Содержание

[править] Параметры

num количество объектов
size размер каждого объекта

[править] Возвращаемое значение

В случае успеха возвращает указатель на начало выделенной памяти. Чтобы избежать утечки памяти, возвращаемый указатель должен быть освобождён с помощью std::free() или std::realloc().

В случае ошибки возвращает нулевой указатель.

[править] Примечание

Из-за требований выравнивания количество выделенных байтов не обязательно равно num*size.

Инициализация всех битов нулями не гарантирует, что число с плавающей запятой или указатель будут инициализированы до 0,0 и значения нулевого указателя соответственно (хотя это верно на всех распространённых платформах).

Первоначально (в C89) была добавлена поддержка нулевого размера для размещения такого кода, как

OBJ *p = calloc(0, sizeof(OBJ)); // заполнитель "нулевой длины"
...
while(1)
{
    // перераспределение памяти, до тех пор пока не выделится достаточно памяти
    p = realloc(p, c * sizeof(OBJ));
    ... // код, который может изменить c или выйти из цикла
}

[править] Пример

#include <iostream>
#include <cstdlib>
 
int main()
{
    // выделение и обнуление массива из 4 int
    int* p1 = (int*)std::calloc(4, sizeof(int));
    // то же самое, именуя тип массива напрямую
    int* p2 = (int*)std::calloc(1, sizeof(int[4]));
    // тоже самое, но без повторного указания имени типа
    int* p3 = (int*)std::calloc(4, sizeof *p3);
 
    if(p2)
        for(int n=0; n<4; ++n) // вывод массива
            std::cout << "p2[" << n << "] == " << p2[n] << '\n';
 
    std::free(p1);
    std::free(p2);
    std::free(p3);
}

Вывод:

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

[править] Смотрите также