malloc()
и calloc()
являются функциями из стандартной библиотеки C, которые позволяют динамическое выделение памяти, что означает, что они оба позволяют выделение памяти во время выполнения.
Их прототипы следующие:
void *malloc( size_t n);
void *calloc( size_t n, size_t t)
Между этими двумя понятиями имеются в основном два различия:
Поведение: malloc()
выделяет блок памяти без его инициализации, и чтение содержимого этого блока приведет к появлению значений мусора. calloc()
, с другой стороны, выделяет блок памяти и инициализирует его нулями, и, очевидно, чтение содержимого этого блока приведет к нулям.
Синтаксис: malloc()
принимает 1 аргумент (размер, который должен быть выделен), а calloc()
принимает два аргумента (количество блоков, которые должны быть выделены, и размер каждого блока).
Возвращаемое значение от обоих - указатель на выделенный блок памяти, в случае успеха. В противном случае будет возвращено NULL , указывающее на ошибку выделения памяти.
Пример:
int *arr;
// allocate memory for 10 integers with garbage values
arr = (int *)malloc(10 * sizeof(int));
// allocate memory for 10 integers and sets all of them to 0
arr = (int *)calloc(10, sizeof(int));
Та же функциональность, что и calloc()
, может быть достигнута с помощью malloc()
и memset()
:
// allocate memory for 10 integers with garbage values
arr= (int *)malloc(10 * sizeof(int));
// set all of them to 0
memset(arr, 0, 10 * sizeof(int));
Обратите внимание, что malloc()
предпочтительно использовать вместо calloc()
, поскольку он быстрее. Если требуется нулевая инициализация значений, используйте calloc()
.