std::calloc
Определён в заголовочном файле <cstdlib> | ||
|---|---|---|
void* calloc( std::size_t num, std::size_t size ); |
Выделяет память для массива из num объектов размером size, инициализирует её нулевыми битами (неявно создавая объекты в целевой области памяти).
В случае успешного выделения возвращает указатель на самый младший (первый) байт в выделенном блоке памяти, выровненный подходящим образом для объектов любого типа.
Если size равно нулю, поведение определяется реализацией (может быть возвращён нулевой указатель или некоторый ненулевой указатель, который нельзя использовать для доступа к хранилищу).
| Следующие функции должны быть потокобезопасными:
Вызовы этих функций, выделяющие или освобождающие определённую область хранилища, образуют единый полный порядок, и каждый такой вызов освобождения происходит раньше следующего выделения (если оно есть) в этом порядке. | (начиная с C++11) |
Параметры
| num | - | количество объектов |
| size | - | размер каждого объекта |
Возвращаемое значение
В случае успеха возвращает указатель на начало вновь выделенной памяти. Во избежание утечки памяти возвращённый указатель необходимо освободить с помощью std::free() или std::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 <cstdlib>
#include <iostream>
int main()
{
int* p1 = (int*)std::calloc(4, sizeof(int)); // allocate and zero out an array of 4 int
int* p2 = (int*)std::calloc(1, sizeof(int[4])); // same, naming the array type directly
int* p3 = (int*)std::calloc(4, sizeof *p3); // same, without repeating the type name
if (p2)
for (int n = 0; n < 4; ++n) // print the array
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 для calloc |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/c/calloc