std:: calloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Определено в заголовочном файле
<cstdlib>
|
||
|
void
*
calloc
(
std::
size_t
num,
std::
size_t
size
)
;
|
||
Выделяет память для массива из num объектов размером size , инициализируя её нулевыми битами ( неявно создавая объекты в целевой области).
Если выделение памяти завершается успешно, возвращает указатель на самый младший (первый) байт в выделенном блоке памяти, который соответствующим образом выровнен для любого типа объекта.
Если size равен нулю, поведение определяется реализацией (может быть возвращен нулевой указатель, или может быть возвращен некоторый ненулевой указатель, который не может быть использован для доступа к памяти).
|
Следующие функции должны быть потокобезопасными:
Вызовы этих функций, которые выделяют или освобождают определенную единицу памяти, происходят в едином общем порядке, и каждый такой вызов освобождения happens-before следующего выделения (если таковое имеется) в этом порядке. |
(since C++11) |
Содержание |
Параметры
| 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 <cstdlib> #include <iostream> int main() { int* p1 = (int*)std::calloc(4, sizeof(int)); // выделить и обнулить массив из 4 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
для
calloc
|