Você está na página 1de 9

UNIVERSIDADE FEDERAL DE RONDÔNIA – UNIR

NÚCLEO DE TECNOLOGIA

DEPARTAMENTO DE ENGENHARIA CIVIL

LUCIANO DO AMARAL KANEZAKI

RELATÓRIO: ALOCAÇÃO DINÂMICA DE MEMÓRIA E FUNÇÕES RECURSIVAS.

Porto Velho - RO

2023
RELATÓRIO: ALOCAÇÃO DINÂMICA DE MEMÓRIA E FUNÇÕES RECURSIVAS.

Relatório: Programação/Computação da
disciplina de Lógica e Programação II, do discente
da Universidade Federal de Rondônia UNIR,
como requisito parcial para obtenção da presença
do curso de Engenharia Civil.

Docente: Jonathan da Silva Ramos

Porto Velho – RO

2023
1 Introdução
Este relatório apresenta uma análise detalhada sobre dois conceitos fundamentais da
programação: alocação dinâmica de memória e funções recursivas. O objetivo deste estudo é
compreender como essas práticas influenciam a eficiência e a flexibilidade dos programas, bem
como identificar as melhores práticas para sua implementação.

Ao final do relatório, será possível compreender a importância da alocação dinâmica de


memória e das funções recursivas na programação, bem como as melhores práticas para utilizá-
las de forma eficaz e segura.

2 Alocação dinâmica de memória


Para compreender o mecanismo de alocação dinâmica de memória, utilizaremos como base
as descrições feitas por Moreira em 2013, focalizando principalmente na linguagem de
programação C. No entanto, é importante ressaltar que os conceitos apresentados têm aplicação
mais ampla e são relevantes para praticamente qualquer linguagem de programação que utilize
alocação e ponteiros.

Quando declaramos uma variável explicitamente em C, uma área de memória é reservada


automaticamente para armazenar seu valor. No entanto, a alocação dinâmica de memória
permite que possamos reservar memória durante a execução do programa, possibilitando uma
maior flexibilidade e eficiência na gestão dos recursos de memória. Essa prática é especialmente
útil em situações em que o tamanho necessário da memória só é conhecido em tempo de
execução ou quando se deseja evitar o desperdício de recursos. Por exemplo, considera a
declaração:

Figura1 – Declaração de uma variável

Fonte: (Autor, 2023)


Observa-se que, nesse caso, não foi necessário considerar a alocação ou liberação manual de
memória, pois a variável 'idade' é alocada automaticamente na pilha de memória do programa. Assim,
quando a função 'main' é concluída, a memória reservada para 'idade' é automaticamente liberada.

Segundo Moreira em 2013, quando o programador deseja fazer a alocação de dados explicitamente,
ele deve manter controle dessa alocação, e não é possível abstrair o local dessa área de dados. Nesse
novo método de usar a memória, é essencial saber onde a memória foi alocada para que ela possa ser
devidamente utilizada.

Todo o controle da memória alocada dinamicamente pelo programador é realizado registrando-se o


endereço dessa área, o que é feito por meio de ponteiros. Os ponteiros são variáveis que armazenam
endereços de memória, e é através deles que a localização da memória alocada é mantida. Na prática, é
guardado apenas o endereço do primeiro byte dessa área. Cabe ao programador, que conhece a
quantidade de memória alocada, tomar cuidado para não utilizar a memória além dessa área alocada, a
fim de evitar comportamentos indesejados e garantir o correto funcionamento do programa.

2.1 Exemplo simples

Serão abordados dois exemplos para ilustrar os conceitos de alocação de memória. O primeiro
exemplo, dado na figura 2, mostra como reservar espaço explicitamente para guardar um valor
inteiro.

Figura1 – Alocação de um valor inteiro

Fonte: (Autor, 2023)


Nesse exemplo, foi criado um ponteiro chamado ‘ponteiro_inteiro’, o qual será responsável
por apontar para o espaço de memória alocado dinamicamente para armazenar o valor inteiro.
Utilizou-se a função malloc para reservar a quantidade de memória necessária para armazenar
um valor inteiro (sizeof(int)). O ponteiro, ponteiro_inteiro recebeu o endereço da memória
alocada, que corresponde ao primeiro byte dessa área. Após a alocação, verificou-se se a
memória foi alocada corretamente. Para tal, foi checado se o ponteiro, ponteiro_inteiro é igual
a NULL, indicando falha na alocação, ou se contém um endereço de memória válido. Caso a
alocação tenha sido bem-sucedida, foi atribuído o valor 42 ao espaço de memória apontado pelo
ponteiro. O valor inteiro armazenado na memória alocada dinamicamente foi exibido através
da função printf. Por fim, foi importante liberar a memória alocada dinamicamente usando a
função free para evitar vazamentos de memória e garantir a correta gestão dos recursos de
memória.

No segundo exemplo, adotou-se uma abordagem semelhante à anterior, mas foi diferenciada
a alocação dinâmica de memória pela quantidade de bytes reservados para armazenar uma
quantidade maior de dados:

Figura 3 – Definindo uma ‘struct’

Fonte: (Autor, 2023)


No segundo exemplo, foi definido a struct Pessoa, contendo duas variáveis: nome (uma
string de até 50 caracteres) e idade (um valor inteiro). Utilizou-se a função malloc para alocar
dinamicamente memória suficiente para armazenar uma struct Pessoa. Após a alocação,
preencheu-se os dados da pessoa através da entrada do usuário. Em seguida, foi exibido os
dados armazenados na struct Pessoa e liberado a memória alocada usando a função free para
evitar vazamentos de memória e garantir a correta gestão dos recursos de memória. O código
executado ficou assim:

Figura 4 – Execução da ‘struct Pessoa’

Fonte: (Autor, 2023)

3 Funções Recursivas
A recursão é uma técnica de programação utilizada quando é possível resolver um problema
expressando-o em termos dele mesmo. Em linguagem de programação C, podemos definir
funções recursivas que se chamam a si mesmas. No entanto, essa técnica deve ser utilizada com
cautela, pois é necessário pensar em como fazer a recursão parar para evitar loops infinitos que
podem causar erros ou esgotar a memória. Em alguns casos, soluções com comandos de
repetição (solução iterativa) podem ser mais adequadas, pois consomem menos memória e são
mais eficientes em termos de desempenho. Porém, em certos problemas, a recursão pode tornar
o programa mais simples e elegante (BERTOLINI, C; PARREIRA, F; CUNHA, G et al., 2019).

A seguir será mostrado um exemplo de recursão, o cálculo do fatorial de um número:

Figura 5 – Exemplo de função fatorial


Fonte: (Autor, 2023)

No exemplo acima, foi criada uma função fatorial de forma recursiva para calcular o fatorial
de um número inteiro. A função recebe o número como argumento e realiza o cálculo do fatorial
multiplicando o número pelo fatorial do número anterior, até que o caso base seja alcançado
(quando o número é igual a 0 ou 1, sendo o fatorial igual a 1).

No ‘main’, o usuário insere um número inteiro, e o programa calcula e exibe o fatorial desse
número, contanto que o número seja não negativo. Caso o número seja negativo, uma
mensagem de aviso é exibida informando que o fatorial não está definido para números
negativos.
4 Conclusão

Neste contexto, discutimos dois conceitos importantes em programação: alocação dinâmica


de memória e funções recursivas. A alocação dinâmica permite reservar memória em tempo de
execução, oferecendo flexibilidade e eficiência na utilização dos recursos disponíveis. No
entanto, é fundamental realizar uma gestão adequada dessa memória para evitar vazamentos e
desperdício de recursos. Por outro lado, as funções recursivas são uma técnica poderosa que
permite resolver problemas complexos dividindo-os em subproblemas menores. A recursão
pode tornar o código mais conciso e elegante, porém, é preciso ter cautela para definir o caso
base corretamente e evitar a ocorrência de loops infinitos.

Portanto, ao trabalhar com alocação dinâmica de memória e funções recursivas, os


programadores devem considerar cuidadosamente a abordagem a ser utilizada, garantindo que
a memória seja gerenciada de forma eficiente e que a recursão seja implementada de maneira
correta, evitando problemas como erros de execução e esgotamento de recursos.
Referências Bibliográficas

BERTOLINI, C; PARREIRA, F, CUNHA, G; MACEDO, R Tombesi. UAB/NTE/UFSM,


Universidade Federal de Santa Maria. Linguagem de Programação I. 1ª ed. Santa Maria,
RS: UAB/NTE/UFSM, 2019.

MOREIRA, J. Alocação Dinâmica de Memória e Funções Recursivas. Disponível em:


<livresaber.sead.ufscar.br>. Acesso em: 22 jul. 2023.

Você também pode gostar