Você está na página 1de 16

INSTITUTO FEDERAL DE EDUCAO, CINCIA E TECNOLOGIA RIO GRANDE DO NORTE

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

p pode apontar para QUALQUER endereo


2 /16

Por que alocar dinamicamente?


Tamanho desconhecido de um array Listas encadeadas (veremos mais a frente) Exemplo:
Um programa que ordena nmeros inteiros Quantidade de nmeros a ordenar desconhecida
5 12 21 29 129 321 821 ... 2 123

0 1 2 3 4 5 6

n-1 n
3 /16

Por que alocar dinamicamente?


Soluo 1 (sem alocao dinmica) Definir capacidade mxima do array
#define N 10000000 int numeros[N];

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

cast para o tipo que realmente queremos

Tamanho de um inteiro, em bytes

Quantidade a ser alocada

O espao alocado sequencialmente


7 /16

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

OBS: Considerar o caracter de fim de string (\0)


9 /16

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

Você também pode gostar