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

std::calloc

Материал из cppreference.com
< cpp‎ | memory‎ | c
 
 
 
 
Defined in header <cstdlib>
void* calloc( std::size_t num, std::size_t size );

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

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

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

Содержание

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

num Количество элементов массива.
size Размер каждого элемента.

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

Если выделение памяти прошло успешно, то возвращается указатель на выделенную память. Он должен быть освобождён с помощью функций std::free() или std::realloc().

Если произошёл сбой, то возвращается нулевой указатель.

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

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

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

Первоначально (в стандарте C89) поддержка выделения 0 байтов памяти была добавлена для работы следующего кода:

OBJ *p = calloc(0, sizeof(OBJ)); // Место для хранения 0 элементов.
...
 
//Перевыделение памяти, до тех пор пока не выделится достаточно памяти
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

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