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:
estruturas de dados dinâmicas (listas ligadas)
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;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.
ip = (int *) malloc(100*sizeof(int));
As seguintes utilizações são todas correctas:
int i;
struct coord { float x, y, z };
typedef struct coord pt;
sizeof(int); sizeof(i);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:
sizeof(struct coord); sizeof(pt);
ip[0] = 1041;ou
for (k=0; k<100; k++)
scanf("%d", ip++);
Para isso necessitamos da definição de um nó:
typedef struct {A alocação de novos elementos poderá ser feita utilizando a função malloc(), como se mostra:
int value;
element *next;
} element;
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);
[REV 10/2000]