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); }