Escolar Documentos
Profissional Documentos
Cultura Documentos
Alocao dinmica
Programao Estruturada 02/02/2012 Jorgiano M B Vidal
Introduo
Quando declaramos uma varivel, um espao de memria reser vado Endereo fixo Atravs de ponteiros podemos indicar qual endereo usar E se quisermos usar mais memria? Um endereo que no seja de uma varivel definida no programa 20 &a
a *p
0 1 2 3 4 5 6
n-1 n
3 /16
Problemas
Limitamos, no programa, a quantidade de nmeros que podemos ordenar SEMPRE usaremos a quantidade de memria definida pela capacidade mxima
4 /16
Funes
O padro ANSI C define 4 funes para gerenciamento de memria malloc: aloca memria calloc: aloca e inicia com zeros realloc: redimenciona tamanho de memria alocada free: libera espao alocado
5 /16
Alocao
Funo malloc:
void * malloc(size_t size);
Retorna um ponteiro para uma rea de memria (void *) NULL se no houver memria suficiente Devemos passar a quantidade de memria a ser alocada, em bytes Existe uma rea do programa, chamada heap, para memrias alocadas dinamicamente
6 /16
Alocao
int *numeros; int quantidade; numeros = (int*) malloc(sizeof(int) * quantidade);
Alocao
int *numeros; int quantidade; numeros = (int*) malloc(sizeof(int) * quantidade);
sizeof(int)
{ { { {
1
numeros[0]
2
numeros[1]
3
numeros[2]
4
numeros[3]
{ {
n-1
numeros[n-2]
n
numeros[n-1]
8 /16
Alocao
Alocar memria para uma string
char *nome; int tamanho; nome = (char*) malloc(sizeof(char) * tamanho);
Liberao de memria
depois que utilizarmos a memria alocada, devemos liberar Este mesmo espao fica disponvel para novas alocaes funo free
void free(void *ptr); Ponteiro para uma rea de memria previamente alocada (com malloc ou calloc)
10/16
Cuidados
Liberar aps uso No usar rea liberada No usar rea fora da rea alocada
11/16
Calloc
Mesma funo do malloc coloca zeros (0) em toda a rea alocada Aps seu uso tambm devemos liberar rea
void * calloc(size_t count, size_t size);
Dois parmeros Quanto elementos deseja alocar O tamanho, em bytes, de cada elemento
12/16
realloc
Redimensiona uma rea de memria para um novo tamanho
void * realloc(void *ptr, size_t size);
O retorno de realloc um ponteiro para a rea redimensionada. Nova rea pode comear em endereo diferente do original
13/16
Exemplo
Ler N nmeros de um arquivo No primeiro nmero do arquivo
int } main(int argc, char ** argv) { int *numeros, tamanho, qtdLidos; FILE * arquivo; /* TODO: Verificar parmetros */ arquivo = fopen(argv[1], "rb"); if (arquivo == NULL) { fprintf(stderr, "ERRO ao abrir arquivo %s\n", argv[1]); exit(1); } fread(&tamanho, sizeof(int), 1, arquivo); numeros = (int*) malloc(sizeof(int) * tamanho); if (numeros == NULL) { fprintf(stderr, "ERRO ao alocar memria\n"); exit(1); } qtdLidos = fread(numeros, sizeof(int), tamanho, arquivo); if (qtdLidos != tamanho) { fprintf(stderr, "ERRO ao ler dados do arquivo\n"); exit(1); } fclose(arquivo); /* ...*/ free(numeros); return 0;
14/16
Concluso
Alocao dinmica de memria uma ferramenta poderosa para desenvolver programas em ANSI C Deve ser usada com cuidado No perder referncias a reas de memrias alocadas Liberar memria que no mais usada
15/16
Dvidas?
16/16