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/w/cpp/memory/c/calloc