Antes de entender as funções malloc () e calloc (), primeiro vamos entender o significado da alocação dinâmica de memória. Alocação de memória é o procedimento de designar a memória do computador para a execução de programas e processos. Usamos técnicas de alocação dinâmica quando não é conhecido antes quanto espaço de memória é necessário para o programa e processo.
A alocação de memória dinâmica surge devido aos problemas associados à alocação de memória estática, como se menos elementos fossem armazenados, e o restante da memória seria desnecessariamente desperdiçado. Portanto, ele supera os problemas de alocação de memória estática onde a memória é alocada somente quando é necessária.
Gráfico de comparação
Base de comparação | malloc () | calloc () |
---|---|---|
Não de blocos | Atribui um único bloco de memória exigida. | Atribui vários blocos da memória solicitada. |
Sintaxe | void * malloc (size_t size); | void * calloc (size_t num, size_t size); |
Inicialização | malloc () não limpa e inicializa a memória alocada. | A memória alocada é inicializada para zero usando calloc (). |
Forma de Alocação | A função malloc () aloca memória do tamanho 'size' do heap. | A função calloc () aloca memória cujo tamanho é igual a num * size. |
Rapidez | Rápido | Comparativamente lento. |
Definição de malloc ()
A função malloc atribui um bloco de memória em bytes . O usuário deve fornecer explicitamente o tamanho do bloco, requer para o uso.
Por meio do programa de função malloc solicita RAM do sistema para alocação da memória, caso a requisição seja concedida (ou seja, a função malloc diz sucesso na alocação de memória), retorna um ponteiro para o primeiro bloco de memória. Ele retorna o tipo de ponteiro vazio, o que significa que qualquer tipo de ponteiro pode ser atribuído.
Embora, ele retorne um NULL, se as funções malloc não puderem alocar a quantidade necessária de memória. A função malloc é acessível em TURBO C, arquivo de cabeçalho alloc.h
ou stdlib.h
, e no UNIX estará disponível no arquivo de cabeçalho .
SINTAXE
A sintaxe desta função é a seguinte:
malloc(number of elements * size of each element);
por exemplo, int *ptr;
ptr=malloc(10*sizeof (int))
Onde size representa o tamanho da memória requerida em bytes (isto é, o número de localizações de memória contíguas a serem alocadas).
Mas, como mencionado anteriormente, a função malloc retorna um ponteiro vazio, consequentemente, um operador de elenco é necessário para alterar o tipo de ponteiro retornado com base em nossa necessidade, a declaração acima pode ser apresentada da seguinte forma:
ptr_var=(type_cast* ) malloc (size)
Onde ptr_var
é o nome do ponteiro que retém o endereço inicial do bloco de memória alocada, type_cast
é o tipo de dados no qual o ponteiro retornado (ou tipo void) deve ser transformado, e size descreve o tamanho do bloco de memória alocado em bytes .
Por exemplo: int *ptr;
ptr=(int*) malloc (10 * size of (int));
Memória alocada pela função malloc contém valor de lixo .
Observe que para verificar se o pedido correspondente é gerado pelo malloc para alocar a memória concedida pela RAM do sistema ou rejeitado (no caso, se o espaço necessário não estiver disponível). Podemos fazer uso da propriedade na qual a quantidade necessária de memória não é atribuída à função malloc retorna um NULL.
Definição de calloc ()
A função calloc opera exatamente da mesma forma que a função malloc excluindo o fato de que requer dois argumentos, como no caso de malloc (), apenas um argumento é necessário.
Por exemplo: int*ptr;
ptr = (int*)calloc(10, 2);
Aqui 2 especifica o tamanho do tipo de dados em um byte para o qual queremos que a alocação seja feita, que neste caso é 2 para inteiros. E 10 significam o número de elementos para os quais a alocação deve ser feita.
Lembre-se que o argumento passado para a função malloc era (n * 10), é um argumento único não se confunda porque vários argumentos são sempre separados por vírgulas. O argumento (n * 10) não tem vírgulas entre elas. Por isso, é um único argumento, embora não seja um simples, mas uma expressão.
Voltando à declaração acima, após a execução da declaração acima, um bloco de memória de 20 bytes é alocado para o programa solicitante e o endereço do primeiro bloco é atribuído ao programa solicitante, e o endereço do primeiro bloco é atribuído ao ponteiro ptr.
A memória alocada pela função calloc retém todos os zeros. A função calloc também pode ser obtida no arquivo de cabeçalho ou
em TURBO C.
Principais diferenças entre malloc e calloc
As principais diferenças entre as funções malloc e calloc são:
- Um único bloco de memória exigida é atribuído em malloc enquanto vários blocos de memória solicitada são alocados por calloc.
- A função malloc não limpa e inicializa a memória alocada. Ele contém valor de lixo e item da memória alocada não pode ser alterado. Em contraste, calloc inicializa a memória alocada para zero.
- O malloc é mais rápido que o calloc devido ao requisito de etapas adicionais de inicialização no calloc, mas a diferença é insignificante.
- Outra diferença entre esses dois é que calloc é um malloc + memset, memset aloca as páginas físicas na memória enquanto malloc atribui apenas a memória do heap no endereço virtual.
Conclusão:
As funções malloc e calloc são usadas para alocação da memória e têm sua certa vantagem, e a desvantagem como malloc é rápida em comparação com calloc. Além disso, malloc é mais fácil de usar, pois leva apenas um argumento porque o calloc aloca memória e inicializa a área de memória com ZERO. Mas você preferiria usar o calloc quando a inicialização da variável for mais importante para você.