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.