22.10.2014 Views

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!