calloc(x,y)
эквивалентно malloc(x*y)
Но calloc
делает дополнительные (установка значений на 0 с помощью) memset(block, 0, x*y)
Эта функция предназначена только для удобного прохождения размер элемента и количество элементов , когда в malloc необходимо умножить эти значения для получения необходимого количества байтов, эта функция также проверяет целочисленное переполнение при умножении.
Например, если вы хотите выделить память для 12 целых чисел и хотите сделать что-то с этими целыми числами, и вы должны установить ее значения в 0, используйте calloc(12, sizeof(int))
Но если вы хотите выделить некоторый блок памяти (256 байт)в будущем скопировать в него какую-нибудь строку, тогда memset
вам не подходит, тогда лучше использовать malloc(sizeof(char) * 256)
или, например, malloc(sizeof(wchar_t) * 256)
void *
calloc (size_t nmemb, size_t lsize)
{
void *ptr;
struct __meminfo *info;
size_t size = lsize * nmemb;
/* if size overflow occurs, then set errno to ENOMEM and return NULL */
if (nmemb && lsize != (size / nmemb))
{
set_errno (ENOMEM);
return NULL;
}
/* allocate memory */
ptr = malloc (size);
/* get pointer to info part of chunk */
info = __mem2info (ptr);
/* fill memory with zeros and set __MEM_CALLOC flag */
memset (ptr, 0, info->size);
info->flags |= __MEM_CALLOC;
return ptr; /* happy end */
}