Aprendendo a Programar Programando em Linguagem C - FSM
Aprendendo a Programar Programando em Linguagem C - FSM
Aprendendo a Programar Programando em Linguagem C - FSM
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
10 Noções básicas de alocação dinâmica de m<strong>em</strong>ória<br />
10.1 O que é alocação dinâmica<br />
Até agora, os programas utilizavam a m<strong>em</strong>ória do computador estaticamente: todas as posições de<br />
m<strong>em</strong>ória eram reservadas para as variáveis no início da execução do programa ou da função e, mesmo que<br />
não estivess<strong>em</strong> sendo mais utilizadas, continuavam reservadas para as mesmas variáveis até a conclusão da<br />
execução do programa ou da função. Um vetor global do tipo float com dez mil componentes, por ex<strong>em</strong>plo,<br />
“ocupará” quarenta mil bytes de m<strong>em</strong>ória durante toda a execução do programa. Naturalmente, isto pode, <strong>em</strong><br />
grandes programas, sobrecarregar ou, até mesmo, esgotar a m<strong>em</strong>ória disponível. No primeiro caso, há uma<br />
degradação na eficiência do programa; no segundo caso a execução do programa pode ser inviabilizada.<br />
Os compiladores C permit<strong>em</strong> a alocação dinâmica da m<strong>em</strong>ória de tal modo que posições de m<strong>em</strong>ória<br />
sejam reservadas para variáveis no instante <strong>em</strong> que sejam necessárias e sejam liberadas (as posições de<br />
m<strong>em</strong>ória) para o sist<strong>em</strong>a nos instantes <strong>em</strong> que não estejam sendo utilizadas.<br />
A alocação dinâmica de m<strong>em</strong>ória pode ser feita através das funções malloc(), calloc() e realloc() cujos<br />
protótipos se encontram no arquivo alloc.h e são os seguintes<br />
void *malloc(size_t Tam);<br />
void *calloc(size_t NumItens, size_t Tam);<br />
void *realloc(void *Bloco, size_t Tam);<br />
Aí, size_t é um tipo de dado pré-definido, definido também no arquivo alloc.h, Tam é o número de<br />
bytes que se pretende alocar dinamicamente, NumItens é a quantidade de itens de Tam bytes que se pretende<br />
alocar e Bloco é um ponteiro que contém o endereço da variável cuja m<strong>em</strong>ória se pretende expandir <strong>em</strong> Tam<br />
bytes.<br />
A função malloc() retorna um ponteiro para um bloco de Tam bytes até então disponível, a função<br />
calloc() retorna um ponteiro para um espaço de m<strong>em</strong>ória até então disponível capaz de armazenar NumItens<br />
objetos, cada um deles com Tam bytes e a função realloc() retorna um ponteiro para um bloco de m<strong>em</strong>ória<br />
com quantidade de bytes igual à soma algébrica da quantidade de bytes apontada por Bloco e Tam, podendo<br />
Tam ser negativo. Caso a quantidade de bytes pretendida não esteja disponível, as funções acima retornam<br />
NULL.<br />
Como os ponteiros retornados são ambos do tipo void, eles dev<strong>em</strong> ser moldados para poder<strong>em</strong> receber<br />
endereços de qualquer tipo de variável. Por ex<strong>em</strong>plo, o programa<br />
#include <br />
#include <br />
main()<br />
{<br />
int *v, t;<br />
v = (int *)malloc(80);<br />
if (v == NULL)<br />
printf("M<strong>em</strong>oria nao disponivel");<br />
else<br />
{<br />
for (t = 0; t