Quando calloc é usado para alocar um bloco de memória, a região alocada é inicializada em zeros. Em contraste, malloc não toca no conteúdo do bloco de memória alocado, o que significa que ele contém valores de lixo. Isso pode ser um risco à segurança, pois o conteúdo da memória é imprevisível e os erros de programação podem resultar em um vazamento desse conteúdo..
| calloc | malloc | |
|---|---|---|
| Função | aloca uma região de memória grande o suficiente para armazenar "n elementos" de bytes "de tamanho" cada. Também inicializa o conteúdo da memória para zerar. | aloca bytes de "tamanho" de memória. |
| Número de argumentos | 2 | 1 |
| Sintaxe | vooc * calloc (número_de_blocos, tamanho_de_processo_de_bloco_de_bytes); | void * malloc (size_in_bytes); |
| Conteúdo da memória alocada | A região alocada é inicializada em zero. | O conteúdo da memória alocada não é alterado. ou seja, a memória contém valores imprevisíveis ou de lixo. Isso representa um risco. |
| Valor de retorno | ponteiro nulo (nulo *). Se a alocação for bem-sucedida, um ponteiro para o bloco de memória será retornado. Se a alocação de memória falhar, um ponteiro NULL será retornado. | ponteiro nulo (nulo *). Se a alocação for bem-sucedida, um ponteiro para o bloco de memória será retornado. Se a alocação de memória falhar, um ponteiro NULL será retornado. |
void * malloc (tamanho_t tamanho);
aloca Tamanho bytes de memória. Se a alocação for bem-sucedida, um ponteiro para a memória alocada será retornado. De outra forma NULO é retornado. Exemplo:
/ * Alocar memória para uma matriz com 15 elementos do tipo int. * / int * ptr = malloc (15 * sizeof (int)); se (ptr == NULL) / * Não foi possível alocar memória, imprima um erro e saia. * / fprintf (stderr, "Não foi possível alocar memória \ n"); sair (EXIT_FAILURE); / * Alocação bem-sucedida. * /
Observe que malloc requer que calculemos os bytes de memória que precisamos e passamos isso como argumento para o malloc.
void * calloc (tamanho_t elementos, tamanho_t bytes);
aloca um bloco contíguo de memória grande o suficiente para armazenar elementos de tamanho bytes cada. A região alocada é inicializada em zero. No exemplo acima:
/ * Aloque espaço para uma matriz com 15 elementos do tipo int e inicialize com zeros. * / int * ptr = calloc (15, tamanho de (int)); se (ptr == NULL) / * Não foi possível alocar memória, imprima um erro e saia. * / fprintf (stderr, "Não foi possível alocar memória \ n"); sair (EXIT_FAILURE); / * Alocação bem-sucedida. * /
calloc (m, n) é o mesmo que
p = malloc (m * n); se (p) memset (p, 0, m * n);
Este tutorial em vídeo explica as funções de alocação de memória malloc, calloc e realloc, bem como a função de desalocação de memória livre:
Geralmente é uma boa ideia usar calloc sobre malloc. Quando você usa malloc, o conteúdo da memória alocada é imprevisível. Erros de programação podem fazer com que esse conteúdo de memória vaze de maneiras não intencionais, mas altamente vulneráveis. Um bom exemplo desse vazamento é a vulnerabilidade Heartbleed no OpenSSL, cujo mecanismo básico é explicado nesta história em quadrinhos do XKCD e há mais detalhes técnicos nesta publicação do blog..
O calloc é um pouco mais lento que o malloc devido à etapa extra de inicializar a região de memória alocada. No entanto, na prática, a diferença de velocidade é muito pequena e pode ser ignorada.