Alocação dinâmica de memória

Alocação dinâmica de memória


Até o presente momento vimos como podemos criar estruturas para armazenamento de dados. Porém todas elas de tamanho fixo, pré-definido quando declaramos as variáveis. Na Linguagem C podemos criar novas variáveis em tempo de execução do programa, ou seja, podemos alocar espaço na memória RAM do computador sempre que quisermos.

Para isso temos as funções malloc(), callock, realock() e free(). Todas essas funções são da biblioteca stdlib.h.

Utilizaremos as funções malloc() e free() neste caderno para trabalhar a alocação dinâmica de memória.

 

Função malloc() e free()

 

Estas são as funções que permitem a alocação dinamicamente da memória e a liberação de espaços na memória. É importante destacar que a função malloc() trabalha exclusivamente com ponteiros e após a alocação de memória ele retorna um ponteiro para a nova variável. A sua sintaxe é:

void *malloc (size_t numero_bytes);

O void é porque o ponteiro poderá ser de qualquer tipo, inclusive uma struct. A expressão size_t se refere à quantidade de bytes que queremos alocar na memória do computador. Esta quantidade está diretamente relacionada com o tipo de variável que queremos criar. Dessa forma, vejamos um exemplo de aplicação:

Ex:

int *pont;

pont = malloc(8);

 

Obs: se não houver espaço livre na memória, malloc retorna um endereço nulo (representado por NULL, definido em stdlib.h) que pode ser testado para encerrar o programa por falta de espaço em memória para alocação.

Quando não sabemos quantos bytes queremos alocar na memória, mas sabemos que queremos alocar para um tipo específico de dado, usamos a função sizeof(tipo_dado). Vejamos o exemplo para retornarmos um ponteiro para uma variável do tipo inteiro:

int *pont;

pont = malloc(sizeof(int));

Já a função free() serve para liberar a memória alocada, deixando o espaço livre para ser usado. É bem simples o processo, basta colocar o nome da variável criada dentro da função free(). Vejamos:

int *pont;

pont = malloc(sizeof(int)); free(pont);

Fonte: Linguagem da programação I, UFERSA, Macedo, Luiz