Exercícios Resolvidos de Alocação dinâmica de memória

Ver Teoria

Enunciado

Construa uma função que aloque uma matriz n × m e retorne o ponteiro duplo dessa matriz. Crie uma segunda função que recebe o ponteiro e dimensão de uma matriz e efetue a liberação de memória.

Passo 1

Essa questão está pedindo pra gente criar funções que facilitem a criação e liberação de matrizes dinâmicas.

Pra começar, vamos escrever uma função chamada a l o c a M a t r i z .

Essa função vai receber como parâmetro as dimensões da matriz, e vai retornar um ponteiro para o endereço da matriz. Uma matriz é alocado com um ponteiro duplo para float, então tipo da função será f l o a t * * .

f l o a t * * a l o c a M a t r i z ( i n t   n ,   i n t   m )

Para criar uma matriz dinamicamente nós precisamos de um ponteiro duplo. Vamos então criar um ponteiro duplo chamado p n t M a t r i z :

O primeiro passo para criar um ponteiro dinâmico é inicializar as linhas dessa matriz. Em termos técnicos, o que estamos fazendo é inicializando uma array dinâmica de ponteiros. Para criar uma array dinâmica de ponteiros nós usamos o operador new junto com o tipo e o operador * , e armazenamos o resultado em um ponteiro duplo.

Para criar uma array de ponteiros fazemos:

p n t D u p l o = n e w   t i p o * [ t a m a n h o ]

No código, vamos alocar n ponteiros dinâmicos:

Ok. Depois que temos uma array dinâmica de ponteiros, podemos acessar cada um dos ponteiros, e fazer com que cada um deles aponte para um novo espaço alocado dinamicamente.

Pra isso, a gente pode usar um loop que vai acessar cada um dos elementos da array dinâmica de ponteiros, e para cada um dos ponteiros a gente utiliza novamente o operador n e w e aloca um novo espaço dinâmico com m espaços.

E prontinho. A matriz está alocada dinamicamente.

Agora, para concluir essa função, vamos retornar o ponteiro duplo.

Passo 2

Mas se temos uma função para alocar uma memória dinamicamente, então vamos precisar de uma função para liberar essa memória!

Essa função não precisa retornar nada. Tudo que ela precisa fazer é receber o ponteiro da matriz dinâmica e deletar os espaços alocados dinamicamente.

O detalhe, é que vai ser necessário criar um loop para acessar todas as linhas da matriz. Então também vamos precisar receber as dimensões da matriz.

Assim, vamos criar uma função chamada l i b e r a M a t r i z , do tipo v o i d (pois não precisa retornar nada) e que recebe como parâmetro o ponteiro duplo que aponta pra matriz dinâmica, e as dimensões dessa matriz.

E agora precisamos liberar a memória. Quando alocamos, nós utilizamos um loop que acessava todas as linhas e alocava a memória. Agora usaremos o mesmo loop novamente, mas dessa vez vamos utilizar o operador d e l e t e     para liberar cada uma das colunas de cada linha.

E antes de finalizar a função, também precisamos liberar a array dinâmica de ponteiros.

E prontinho! Concluímos a segunda função, e terminamos a questão!

Resposta