Você está na página 1de 6

Aprenda sobre Alocação Dinâmica - Série Pontei... https://www.embarcados.com.br/ponteiro-em-c-...

Ponteiro em C:
Alocação Dinâmica de
Memória

Fernando Deluno Garcia

ÍNDICE DE CONTEÚDO

Este post faz parte da série Ponteiro em C. Leia também os


outros posts da série:
Ponteiro em C: Resumo

Ponteiro em C: De�nição

1 of 6 30/09/2020 12:48
Aprenda sobre Alocação Dinâmica - Série Pontei... https://www.embarcados.com.br/ponteiro-em-c-...

Ponteiro em C: Arrays

Ponteiro em C: Funções

Ponteiro em C: Estruturas

Ponteiro em C: Alocação Dinâmica de Memória

Ponteiro em C: Tipo de Dado Abstrato

Ponteiro em C: Polimor�smo

Recentemente o Felipe Neves apresentou neste artigo um sistema


para gerenciamento de memória chamado TLSF. Além disso,
destacou que esse tópico é bem discutido por quem desenvolve
sistemas embarcados, apresentando opiniões bem divergentes. No
entanto, independente do sistema de alocação dinâmica de
memória, será sempre necessário operar com endereços de
memória! Assim sendo, neste artigo, será destacada a função do
ponteiro.

Alocação Dinâmica de Memória


A alocação dinâmica de memória é um mecanismo utilizado para
possibilitar que uma quantidade de memória seja reservada
durante o tempo de execução de uma aplicação. A região de
memória utilizada para alocação dinâmica é conhecida como heap.
Para saber mais sobre como um programa é organizado em
memória consulte o primeiro artigo sobre ponteiros ou artigo sobre
TLSF do Felipe Neves.

A biblioteca C padrão de�ne 4 funções para alocação dinâmica de


memória. Essas quatro funções são de�nidas na biblioteca

2 of 6 30/09/2020 12:48
Aprenda sobre Alocação Dinâmica - Série Pontei... https://www.embarcados.com.br/ponteiro-em-c-...

malloc;

calloc;

realloc;

free.

Veremos que em todas essas funções os ponteiros são utilizados!


Mas antes será necessário apresentar um tipo de ponteiro que
ainda não foi discutido nos artigos anteriores.

O Ponteiro void
Um ponteiro declarado como void é um ponteiro sem tipo! A
função de um ponteiro void é simplesmente armazenar um
endereço, pois nenhuma operação aritmética ou manipulação do
conteúdo pode ser realizada. Um ponteiro do tipo void tem a
seguinte forma:

1 void * nome_do_ponteiro;

Então, se em determinado momento é necessário apenas manter


um endereço, um ponteiro void pode ser utilizado. Nas funções de
alocação dinâmica essa característica pode ser observada uma
vez que a função é genérica para qualquer tipo de dados.

Funções de Alocação Dinâmica de


Memória
Começando pelas duas principais funções, malloc e free, temos as

3 of 6 30/09/2020 12:48
Aprenda sobre Alocação Dinâmica - Série Pontei... https://www.embarcados.com.br/ponteiro-em-c-...

1 void *malloc (size_t);


2
3 void free (void *);

O parâmetro size_t é utilizado para de�nir o tamanho de um bloco


de dados que será alocado. Cabe ressaltar que o tamanho do bloco
deve ser de�nido em bytes, sendo o operador sizeof, discutido no
segundo artigo, essencial para garantir a portabilidade. Note que o
retorno da função malloc é um ponteiro do tipo void. Esse ponteiro
representa o endereço do bloco de dados alocado.

1 int * pt; //declaração do ponteiro para armazenar o endereço do bloco alocado


2
3 pt = (int *) malloc(10*sizeof(int)); //chamada da função malloc para reservar espaço para 1

A função free, ao contrário da função malloc, deve ser utilizada


para liberar um bloco alocado. É importante ressaltar que o
endereço passado para função free deve ser um endereço obtido
por uma das funções de alocação. Qualquer valor informado que
não corresponda ao endereço inicial de um bloco alocado pode
destruir o sistema de alocação.

1 int * pt; //declaração do ponteiro para armazenar o endereço do bloco alocado


2
3 pt = (int *) malloc(10*sizeof(int)); //chamada da função malloc para reservar espaço para
4
5 //verifica se o endereço de retorno é válido
6 if(pt != NULL)
7 {
8   //…operações com o ponteiro
9 }
10
11 free(pt); //chama a função free para liberar o bloco indicado por pt
12 pt = NULL; //atribui NULL para indicar que o ponteiro não tem um endereço válido

As outras duas funções de alocação são mostradas abaixo:

1 void *calloc (size_t, size_t);


2
3 void *realloc (void *, size_t);

A função calloc tem a mesma operação malloc, isto é, reserva um


bloco de memória com base na quantidade de bytes informada. A

4 of 6 30/09/2020 12:48
Aprenda sobre Alocação Dinâmica - Série Pontei... https://www.embarcados.com.br/ponteiro-em-c-...

já no segundo parâmetro é informado o tamanho do tipo de dado.

1 int * pt; //declaração do ponteiro para armazenar o endereço do bloco alocado


2
3 pt = (int *) calloc(10, sizeof(int)); //chamada da função calloc para reservar espaço para

A função realloc pode ser utilizada para redimensionar um bloco.


Deste modo, um bloco pode aumentar ou diminuir o seu tamanho
em tempo de execução. Para esse tipo de operação a função
realloc deve receber o endereço do bloco alocado e o tamanho em
bytes que será de�nido na operação. O retorno da função é o
endereço do novo bloco alocado.

1 int * pt; //declaração do ponteiro para armazenar o endereço do bloco alocado


2
3 pt = (int *) malloc(10*sizeof(int)); //chamada da função malloc para reservar espaço para
4
5 if (pt == NULL)
6 {
7    //memória insuficiente
8 }
9 else
10 {
11     pt = (int *) realloc(pt, 10*sizeof(int)); //chama a função realloc para reservar espaç
12
13     if (pt == NULL)
14     {
15       //memória insuficiente
16     }
17 }
18
19 free(pt); //chama a função free para liberar o bloco indicado por pt
20 pt = NULL; //atribui NULL para indicar que o ponteiro não tem um endereço válido

Dever do programador
Cabe ressaltar que em todas as funções de alocação dinâmica é
necessário validar o endereço retornado, pois essas funções
retornam NULL se a quantidade informada não pode ser alocada.
Lembre-se, do primeiro artigo, que o valor NULL não impede erros
de execução, porém fornece uma alternativa para testar se o
ponteiro armazena um endereço válido. Em alguns compiladores é

5 of 6 30/09/2020 12:48
Aprenda sobre Alocação Dinâmica - Série Pontei... https://www.embarcados.com.br/ponteiro-em-c-...

não é necessário, �cando a critério do programador realizar o cast


de forma explícita.

Outro ponto muito importante é que a linguagem C não possui um


gerenciamento automático do heap. Diante disso, é dever do
programador liberar toda memória alocada na aplicação, evitando
o que é chamado memory leak. O Sergio Prado  já discutiu esse
assunto e apresentou algumas ferramentas de teste. Vale a pena

6 of 6 30/09/2020 12:48

Você também pode gostar