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;
Uma sequencia semelhante pode ser usada para alocar uma estrutura:
struct circulo *pc;
pc = (struct circulo *) malloc (sizeof (struct circulo));
pc->raio = 10;
int *pv;
pv = (int *) malloc (10 * sizeof (int));
*pv = 0;
pv[9] = 1; // ultimo elemento do vetor alocado
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:
Postar um comentário