Alocação Dinâmica
Quando precisamos guardar alguma informação que será utilizada pelo programa, utilizamos variáveis. Passamos o tipo da variável e o tamanho que aquela variável vai receber de informação, isso pode ser um problema, por que muitas vezes não sabemos o tamanho da informação que será gravada nela durante a criação do programa. Outro ponto é que o tamanho de um determinado tipo pode mudar dependendo do computador, ou seja, um inteiro pode ter 4 bytes na minha máquina mas ter um tamanho diferente na sua.
Para resolver esse problema, usamos a alocação dinâmica. O C possui 4 funções disponíveis para alocação dinâmica de memória e estão disponíveis na biblioteca stdlib.h. São elas:
malloc
calloc
realloc
free
Vamos entender cada uma delas.
Função malloc()
A função malloc serve para alocar memória durante a execução do programa. A função recebe como parâmetro a quantidade de bytes para ser alocado e retorna um ponteiro para a primeira posição do array. Caso não tenha espaço suficiente ou caso ocorra algum erro, ela retorna NULL.
Protótipo da função:
void* malloc(unsigned int num);Exemplos:
//cria um array de 200 bytes
int *v = malloc(200);
//cria um array com o tamanho de 50 inteiros
int *v = malloc(50 * sizeof(int));
//como a função retorna um ponteiro genérico
//é possível fazer uma conversão explicita
int *v = (int*) malloc(50 * sizeof(int));Como falado anteriormente, caso a função tenha algum problema, ela retorna como resultado NULL, então é sempre interessante realizar uma validação para evitar erros.
Função calloc()
Assim como o malloc a função calloc serve para alocar memória durante a execução do programa. Ela recebe como parâmetro o número de elementos do array a ser alocado e o tamanho de cada elemento e retorna um ponteiro para a primeira posição do array. Caso não tenha espaço suficiente ou caso ocorra algum erro, ela retorna NULL.
Protótipo da função:
Exemplos:
Como falado anteriormente, caso a função tenha algum problema, ela retorna como resultado NULL, então é sempre interessante realizar uma validação para evitar erros.
As funções malloc e calloc são muito similares, a diferença, além dos argumentos que cada uma recebe, é que quando usamos a função calloc para fazer a alocaçãp, ela reserva o espaço na memória e completa esse espaço com zeros. Já a função malloc somente reserva o espaço na memória, o que faz com que você possa acabar acessando alguma informação que já estava lá (lixo de memória).
Função realloc()
A função realloc serve para alocar ou realocar memória durante a execução do programa. Ela recebe como parâmetro um ponteiro para um bloco de memória já alocado e a quantidade de bytes a ser alocada e retorna um ponteiro para a primeira posição do array. Caso não tenha espaço suficiente ou caso ocorra algum erro, ela retorna NULL.
Protótipo da função:
Exemplos:
Caso o ponteiro para o bloco de memória alocado seja NULL, a função irá alocar memória da mesma forma que a função malloc.
Exemplo:
Caso o tamanho de memória solicitado seja 0, a função irá liberar o espaço de memória da mesma forma que a função free.
Exemplo:
Caso o computador não tenha memória suficiente para alocar a memória solicitada, a função retorna NULL, esse é um ponto que merece atenção, pois caso ocorra algum problema as informações presentes no array podem ser perdidas, então, é aconselhável a utilização de uma variável para confirmar se a função obteve sucesso antes de salvar o resultado final.
Exemplo:
Função free()
Por último mas não menos importante, a função free serve para liberar novamente o espaço de memória que foi alocado. Ela recebe como parâmetro o ponteiro para o endereço que será liberado novamente.
Last updated