Sei sulla pagina 1di 20

INF1007: Programao 2

2 Alocao Dinmica

17/02/2014

(c) Dept. Informtica - PUC-Rio

Tpicos
Alocao dinmica
Vetores locais e funes

17/02/2014

(c) Dept. Informtica - PUC-Rio

Alocao Dinmica
Uso da memria:
uso de variveis globais (e estticas):
espao reservado para uma varivel global existe
enquanto o programa estiver sendo executado

uso de variveis locais:


espao existe apenas enquanto a funo que declarou a varivel
est sendo executada
liberado para outros usos quando a execuo da funo termina

variveis globais ou locais podem ser simples ou vetores:


para vetor, necessrio informar o nmero mximo de elementos
pois o compilador precisa calcular o espao a ser reservado

17/02/2014

(c) Dept. Informtica - PUC-Rio

Alocao Dinmica
Uso da memria:
alocao dinmica:
espao de memria requisitado em tempo de execuo
espao permanece reservado at que seja explicitamente liberado
depois de liberado, espao estar disponibilizado para outros usos e
no pode mais ser acessado
espao alocado e no liberado explicitamente,
ser automaticamente liberado ao final da execuo

17/02/2014

(c) Dept. Informtica - PUC-Rio

Alocao Dinmica

memria esttica:
cdigo do programa
variveis globais

memria
esttica

Uso da memria:
Variveis globais e
Variveis estticas
Variveis alocadas

variveis estticas

memria dinmica:
memria
dinmica

dinamicamente

variveis alocadas
dinamicamente
memria livre

Cdigo do programa

variveis locais

Memria livre

Variveis locais
(Pilha de execuo)

17/02/2014

(c) Dept. Informtica - PUC-Rio

Alocao Dinmica
Uso da memria:
alocao dinmica de memria:
usa a memria livre

se o espao de memria livre for


menor que o espao requisitado,
a alocao no feita e
o programa pode prever
tratamento de erro

memria
esttica

Variveis globais e
Variveis estticas
Variveis alocadas
dinamicamente

utilizada para alocar memria


quando ocorre chamada de funo:
sistema reserva o espao
para as variveis locais da funo
quando a funo termina,
espao liberado (desempilhado)

memria
dinmica

pilha de execuo:

se a pilha tentar crescer mais do


que o espao disponvel existente,
programa abortado com erro

17/02/2014

Cdigo do programa

(c) Dept. Informtica - PUC-Rio

Memria livre

Variveis locais
(Pilha de execuo)

Alocao Dinmica
Funes da biblioteca padro stdlib.h
contm uma srie de funes pr-definidas:
funes para tratar alocao dinmica de memria
constantes pr-definidas
....

17/02/2014

(c) Dept. Informtica - PUC-Rio

Alocao Dinmica
void * malloc(int num_bytes);

void free(void * p);

17/02/2014

(c) Dept. Informtica - PUC-Rio

Alocao Dinmica
Funo malloc:
recebe como parmetro o nmero de bytes que se deseja alocar
retorna um ponteiro genrico para o endereo inicial da rea de
memria alocada, se houver espao livre:
ponteiro genrico representado por void*
ponteiro convertido automaticamente para o tipo apropriado
ponteiro pode ser convertido explicitamente

retorna um endereo nulo, se no houver espao livre:


representado pelo smbolo NULL

Funo sizeof:
retorna o nmero de bytes ocupado por um tipo

Funo free:
recebe como parmetro o ponteiro da memria a ser liberada
a funo free deve receber um endereo de memria que tenha sido
alocado dinamicamente
17/02/2014

(c) Dept. Informtica - PUC-Rio

Alocao Dinmica
Exemplo:
alocao dinmica de um vetor de inteiros com 10 elementos
malloc retorna o endereo da rea alocada para
armazenar valores inteiros
ponteiro de inteiro recebe endereo inicial do espao alocado

int *v;
v = (int *) malloc(10*sizeof(int));

17/02/2014

(c) Dept. Informtica - PUC-Rio

10

Alocao Dinmica
Exemplo (cont.):
v = (int *) malloc(10*sizeof(int));
1 - Declarao: int *v
Abre-se espao na pilha para
o ponteiro (varivel local)

2 - Comando: v = (int *) malloc (10*sizeof(int))


Reserva espao de memria da rea livre
e atribui endereo varivel

Cdigo do
Programa

Cdigo do
Programa

Variveis
Globais e Estticas

Variveis
Globais e Estticas
40 bytes

Livre

v
17/02/2014

504

Livre
v
(c) Dept. Informtica - PUC-Rio

504
11

Alocao Dinmica
Exemplo (cont.):
v armazena endereo inicial de uma rea contnua de memria
suficiente para armazenar 10 valores inteiros
v pode ser tratado como um vetor declarado estaticamente
v aponta para o inicio da rea alocada
v[0] acessa o espao para o primeiro elemento

v[1] acessa o segundo


.... at v[9]

17/02/2014

(c) Dept. Informtica - PUC-Rio

12

Alocao Dinmica
Exemplo (cont.):
tratamento de erro aps chamada a malloc
imprime mensagem de erro
aborta o programa (com a funo exit)

v = (int*) malloc(10*sizeof(int));
if (v==NULL)
{
printf("Memoria insuficiente.\n");
exit(1); /* aborta o programa e retorna 1 para o sist. operacional */
}

17/02/2014
free(v);

(c) Dept. Informtica - PUC-Rio

13

#include <stdlib.h>

int main ( void )


{
float *v;
float med, var;
int i,n;
printf("Entre n e depois os valores\n");
scanf("%d",&n);
v = (float *) malloc(n*sizeof(float));
if (v==NULL) { printf(Falta memoria\n); exit(1); }
for ( i = 0; i < n; i++ )
scanf("%f", &v[i]);
med = media(n,v);
var = variancia(n,v,med);

printf ( "Media = %f
free(v);
return 0;
} 17/02/2014

Variancia = %f

\n", med, var);

(c) Dept. Informtica - PUC-Rio

14

Vetores Locais a Funes


rea de memria de uma varivel local:
s existe enquanto a funo que declara a varivel
estiver sendo executada
requer cuidado quando da utilizao de vetores locais
dentro de funes

Exemplo:
produto vetorial de dois vetores u e v em 3D,
representados pelas trs componentes x, y, e z
u v u y vz v y u z , u z vx vz u x , u x v y vx u y

17/02/2014

(c) Dept. Informtica - PUC-Rio

15

Vetores Locais a Funes


float* prod_vetorial (float* u, float* v)
{
float p[3];
p[0] = u[1]*v[2] v[1]*u[2];
p[1] = u[2]*v[0] v[2]*u[0];
p[2] = u[0]*v[1] v[0]*u[1];
return p;
}
varivel p declarada localmente:
rea de memria que a varivel p ocupa deixa de ser vlida
quando a funo prod_vetorial termina
funo que chama prod_vetorial no pode acessar a rea apontada
pelo valor retornado
17/02/2014

(c) Dept. Informtica - PUC-Rio

16

Vetores Locais a Funes


float* prod_vetorial (float* u, float* v)
{
float *p = (float*) malloc(3*sizeof(float));
p[0] = u[1]*v[2] v[1]*u[2];
p[1] = u[2]*v[0] v[2]*u[0];
p[2] = u[0]*v[1] v[0]*u[1];
return p;
}
varivel p alocada dinamicamente
rea de memria que a varivel p ocupa permanece vlida mesmo aps o
trmino da funo prod_vetorial
funo que chama prod_vetorial pode acessar o ponteiro retornado
problema - alocao dinmica para cada chamada da funo:
ineficiente do ponto de vista computacional
17/02/2014

requer que a funo


que chama
seja responsvel
(c) Dept.
Informtica
- PUC-Rio pela liberao do espao

17

Vetores Locais a Funes


void prod_vetorial (float* u, float* v, float* p)
{
p[0] = u[1]*v[2] v[1]*u[2];
p[1] = u[2]*v[0] v[2]*u[0];
p[2] = u[0]*v[1] v[0]*u[1];
}
espao de memria para o resultado
passado pela funo que chama:
funo prod_vetorial recebe trs vetores,
dois vetores com dados de entrada
um vetor para armazenar o resultado

soluo mais adequada pois no envolve alocao dinmica


17/02/2014

(c) Dept. Informtica - PUC-Rio

18

Resumo
Funes para gerncia de memria:

17/02/2014

sizeof

retorna o nmero de bytes ocupado por um tipo

malloc

recebe o nmero de bytes que se deseja alocar


retorna um ponteiro para o endereo inicial, ou
retorna um endereo nulo (NULL)

free

recebe o ponteiro da memria a ser liberada

(c) Dept. Informtica - PUC-Rio

19

Referncias
Waldemar Celes, Renato Cerqueira, Jos Lucas Rangel,
Introduo a Estruturas de Dados, Editora Campus
(2004)
Captulo 5 Vetores e alocao dinmica

17/02/2014

(c) Dept. Informtica - PUC-Rio

20

Potrebbero piacerti anche