quarta-feira, novembro 07, 2007

Listas Ligadas - parte 3

Prosseguindo em nossa série, vamos concluir a introdução falando sobre o armazenamento de estruturas cujo tamanho varia durante a execução do programa.

Alocação Dinâmica de Memória em C

As declarações de variáveis em C que apresentamos até agora são o que chamamos de alocação estática: as posições de memória para armazenar as variáveis são definidas no momento da sua declaração e não se alteram mais.

A alocação estática é muito prática, segura e eficiente, porém impõem que o tamanho alocado será fixo durante toda a execução do programa. No caso de vetores, matrizes e listas isto pode não ser apropriado.

Existem duas funções básicas em C para alocar e liberar memória dinamicamente: malloc e free. A rotina malloc reserva uma determinada quantidade de bytes e retorna o ponteiro para a primeira posição. A rotina free libera uma região de memória, deixando-a disponível para alocações futuras. Uma vez que a rotina malloc enxerga a memória simplemente como uma sequência de bytes, cabe ao programador determinar quantos bytes são necessários para armazenar a informação e usar um cast para informar para que tipo de dado o ponteiro irá apontar.

Começando com um exemplo simples, a sequência abaixo aloca dinamicamente uma variável do tipo inteiro e armazena zero nela:
int *p;

p = (int *) malloc (sizeof (int));
*p = 0;
Reparar o uso de sizeof para determinar o tamanho em bytes da variável, o cast (int *) para informar que o ponteiro retornado por malloc será usado para apontar para um inteiro e *p para acessar a variável apontada por p.

Uma sequencia semelhante pode ser usada para alocar uma estrutura:
struct circulo *pc;

pc = (struct circulo *) malloc (sizeof (struct circulo));
pc->raio = 10;
A alocação de um vetor de 10 inteiros também é semelhante:
int *pv;

pv = (int *) malloc (10 * sizeof (int));
*pv = 0;
pv[9] = 1; // ultimo elemento do vetor alocado
Por último, um exemplo de alocação de um vetor de estruturas
struct circulo *pvc;

pvc = (struct circulo *) malloc (7 * sizeof (struct circulo));
(*(pvc+2)).raio = 10; // raio do 3o elemento
(pvc+2)->raio = 10; // idem
pvc[2].raio = 10; // idem

Note, mais uma vez, como a semelhança de notação para ponteiros e vetores na última linha do exemplo.

No próximo post vamos começar a examinar as listas, vendo as Listas Lineares.

Nenhum comentário: