A linguagem C oferece um conjunto de funções que permitem alocar memória dinamicamente, trazendo bastante flexibilidade para a construção de estruturas de dados mais complexas e eficientes. As funções mais importantes são descritas abaixo e estão disponíveis na biblioteca stdlib.
| Função | Descrição |
| malloc(numDeBytes) | Retorna um apontador para uma variável dinâmica como tamanho
especificado como parâmetro. Uma situação bastante comum é utilizar a função
sizeof para calcular o número de bytes a serem alocados baseando-se
no tipo do dado. Exemplo: int vetInt[] = (int*) maloc(sizeof(int) * NUM_ELEMENTOS) |
| free(ptr) | Desaloca da memória a variável dinâmica apontada pelo apontador ptr passado como parâmetro. |
| realloc(ptr, numDeBytes) | Modifica o tamanho da variável dinâmica previamente alocada
e apontada por ptr para o novo valor especificado pelo parâmetro
numDeBytes. Este pode ser maior ou menor que o anterior. Retorna um
apontador, já que pode ser preciso mover os dados para um novo bloco de
memória ao aumentar se tamanho. Caso isto ocorra, o conteúdo da variável
antiga é copiada para o novo bloco, ou seja, nenhuma informação é perdida.
Se ptr for NULL, aloca uma variável do tamanho determinado por numDeBytes e devolve um ponteiro; Se numDeBytes for zero, a memória apontada por ptr é liberada (semelhante a chamar free). Se não houver memória suficiente para a alocação, um ponteiro nulo é devolvido e o bloco original é deixado inalterado. |
#include <stdio.h> #include <stdlib.h>
int main (){
long *p;
long num;
printf("\nDigite o tamanho inicial do vetor-->");
scanf("%d", &num);
do
{
p=(long *)malloc(num*sizeof(long));
if (!p)
{
printf ("** \n\nErro: Memoria Insuficiente\n\n **");
getch();
}
else
{
printf ("** \n\nMemoria Alocada com Sucesso %d bytes\n\n **", num*sizeof(long));
}
}
while (p);
return (0);
}
#include <stdio.h>
#include <stdlib.h>
struct no {
int valor;
struct no *prox;
};
// Definicao de um tipo de dados chamado noLista
typedef struct no noLista;
void insere(int x, noLista *p)
{
noLista *nova;
nova = (noLista*) malloc( sizeof (noLista));
(*nova).valor = x;
nova->prox = (*p).prox;
p->prox = nova;
}
noLista* busca( int x, noLista *ini)
{
noLista *p;
p = ini->prox;
while ((p != NULL) && (p->valor != x))
p = p->prox;
return p;
}
void remover(noLista *p)
{
noLista *noApagar = p->prox;
p->prox = noApagar->prox;
free(noApagar);
}
void imprime(noLista *cab)
{
noLista *p;
p = cab->prox;
while (p != NULL)
{
printf("%d ", (int) p->valor);
p = p->prox;
}
}
void apagarLista(noLista *cab)
{
while(cab->prox != NULL)
{
printf(" removendo %d ", cab->prox->valor);
remover(cab);
}
}
int main()
{
noLista cabeca;
cabeca.prox = NULL;
int i;
for (i = 1; i<= 100; i++)
{
insere(i, &cabeca);
}
imprime(&cabeca);
noLista *p = busca(50, &cabeca);
if (p)
{
printf("\n50 foi encontrado\n");
}
else
{
printf("\n50 nao foi encontrado\n");
}
apagarLista(&cabeca);
}