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

std::calloc

Материал из cppreference.com
< cpp‎ | memory‎ | c
 
 
 
Динамическое управление памятью
Низкоуровневое управление памятью
Аллокаторы
allocator
allocator_traits(C++11)
allocator_arg_t(C++11)
allocator_arg(C++11)
uses_allocator(C++11)
scoped_allocator_adaptor(C++11)
Неинициализированные хранилища
uninitialized_copy
uninitialized_copy_n(C++11)
uninitialized_fill
uninitialized_fill_n
raw_storage_iterator
get_temporary_buffer
return_temporary_buffer
Умные указатели
unique_ptr(C++11)
shared_ptr(C++11)
weak_ptr(C++11)
auto_ptr(устарело)
owner_less(C++11)
enable_shared_from_this(C++11)
bad_weak_ptr(C++11)
default_delete(C++11)
Поддержка сборки мусора
declare_reachable(C++11)
undeclare_reachable(C++11)
declare_no_pointers(C++11)
undeclare_no_pointers(C++11)
pointer_safety(C++11)
get_pointer_safety(C++11)
Разное
pointer_traits(C++11)
addressof(C++11)
align(C++11)
Библиотека C
malloc
calloc
 
Определено в заголовочном файле <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

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

C documentation for calloc