Capítulo 10 - Alocação Dinâmica de Memória


Conteúdo Capítulo anterior Capítulo seguinte

A alocação dinâmica de memórica é uma característica importante das linguagens de alto nível. No C constitui uma fração muito importante da sua definição (juntamente com os apontadores). A alocação dinâmica permite-nos criar tipos de dados e estruturas de qualquer tamanho e comprimento que satisfaça as nossas necessidades, durante a execução de um programa. Vamos ver duas aplicações comuns da alocação dinâmica:


Tópicos



Malloc

A função malloc() é usada para "pedir" ao sistema operacional uma porção de memória. O seu protótipo é:
void *malloc(int number_of_bytes);
A função retorna um apontador genérico (void *) para o ínicio da memória alocada que deverá conter espaço suficiente para armazenar number_of_bytes bytes. Se não for possível alocar essa quantidade de memória a função retorna o apontador NULL.

Então se quisermos alocar espaço para 100 inteiros podemos usar:

int *ip;
ip = (int *) malloc(100*sizeof(int));
Notar o uso de um cast na saída da função e também o uso do operador sizeof para determinar, em bytes, o tamanho de um inteiro. O cast para o tipo de apontador correcto é muito importante para assegurar que a aritmética com os apontadores é efetuada de modo correcto. O uso do operador sizeof também é indispensável, mesmo que se saiba o tamanho do tipo de dados, para tornar o código independente da máquina em que for compilado. O seu uso torna o código facilmente portável. O operador sizeof pode ser usado para determinar o tamanho (em bytes) de qualquer tipo ou variável.

As seguintes utilizações são todas correctas:

int i;
struct coord { float x, y, z };
typedef struct coord pt;
sizeof(int); sizeof(i);
sizeof(struct coord); sizeof(pt);
Após a alocação de memória e a atribuição do seu endereço inicial a um apontador, podemos usá-lo como se fosse um array, aproveitando a quase identidade entre arrays e apontadores. Ou seja, podemos fazer coisas como as que se seguem:
ip[0] = 1041;
ou
for (k=0; k<100; k++)
  scanf("%d", ip++);

 
 
Up

Listas ligadas

Vamos ver como se pode agora construir uma estrutura dinâmica através de uma lista ligada em C.

Para isso necessitamos da definição de um nó:

typedef struct {
  int value;
  element *next;
} element;
A alocação de novos elementos poderá ser feita utilizando a função malloc(), como se mostra:
link = (element *) malloc(sizeof(element));
Quando o elemento tiver cumprido a sua missão e já não for necessário, é indispensável libertar a memória alocada. A libertação de memória alocada com malloc() (e só essa) faz-se através do endereço da mesma, chamando a função standard free():
free(link);
Um exemplo completo é o programa queue.c.

 
 
 
Up

Exercícios

Veja aqui os exercícios 

[REV 10/2000]
 


 
 
Up