View
224
Download
5
Category
Preview:
DESCRIPTION
Alocação Dinâmica
Citation preview
1
Alocao Dinmica de Memria
Prof. Mauricio Scoton
2
Alocao Dinmica
At o momento, na declarao de um vetor paraListas, Pilhas e Filas, tnhamos que saber de antemoo quanto de espao seria necessrio.
Esse pr-dimensionamento era um fator limitante.
Por exemplo, se desenvolvermos um programa paracalcular a mdia e a varincia das notas de umaprova, teremos de prever o nmero mximo dealunos.
(PLT pginas 250 a 256).
Alocao Dinmica
Solues?
Dimensionar o vetor com um nmero absurdamente alto,para no termos limitaes no momento da utilizao doprograma.
Sermos modestos no pr-dimensionamento do vetor.
Alocao Dinmica
Desvantagens?
Desperdcio de memria, o que inaceitvel em diversasaplicaes.
Programa fica muito limitado, pois no conseguiramostratar turmas com um nmero de alunos maior que oprevisto.
Alocao Dinmica
A linguagem C oferece meios de requisitar espaosde memria em tempo de execuo.
Dizemos que podemos alocar memriadinamicamente.
Alocao Dinmica
Uso da memria
Podemos dizer que existem trs maneiras de reservar espao de memria para o armazenamento de informaes:
Usar variveis globais
Usar variveis locais
Alocar memria dinamicamente.
Alocao Dinmica
A primeira usar variveis globais (e estticas). Oespao reservado para uma varivel global existequanto o programa estiver sendo executado.
A segunda maneira usar variveis locais. Nessecaso, o espao existe apenas enquanto a funo quedeclarou a varivel est sendo executada, sendoliberado para outros usos quando a execuo dafuno termina.
Alocao Dinmica
A terceira maneira de reservar memria requisitarao sistema, em tempo de execuo, um espao deum terminado tamanho. Esse espao alocadodinamicamente permanece reservado at que sejaexplicitamente liberado pelo programa.
A partir do momento em que liberarmos o espao,ele estar disponibilizado para outros usos e nopodemos mais acess-lo.
Alocao Dinmica
Se o programa no liberar um espao alocado, eleser automaticamente liberado quando a execuodo programa terminar.
Na figura 1, apresentamos um esquema didtico queilustra de maneira fictcia a distribuio do uso damemria pelo sistema operacional.
Alocao Dinmica
O sistema operacional reservaespaos necessrios paraarmazenar as variveis globais(e estticas) existentes noprograma e o restante damemria livre utilizado pelasvariveis locais e pelasvariveis alocadasdinamicamente.
Cdigo do
Programa
Variveis Globais
e Estticas
Memria Alocada
Dinamicamente
Memria Livre
Pilha
Alocao Dinmica
Cada vez que uma determinada funo chamada, osistema reserva o espao necessrio para as variveislocais da funo.
Esse espao pertence pilha de execuo e, quandoa funo termina, desempilhado.
A parte da memria no ocupada pela pilha deexecuo pode ser requisitada dinamicamente.
Alocao Dinmica
Funes da biblioteca padro
Existem funes, presentes na biblioteca padrostdlib, que permitem alocar e liberar memriadinamicamente.
A funo bsica para alocar memria malloc.
Ela recebe como parmetro o nmero de bytes quese deseja alocar e retorna o endereo inicial da reada memria alocada.
Alocao Dinmica
Para exemplificar, vamos considerar a alocaodinmica de um vetor de inteiros com 10 elementos.
Como a funo malloc tem como valor de retorno oendereo da rea alocada e, nesse exemplo,desejamos armazenar valores inteiros nessa rea,devemos declarar um ponteiro de inteiro parareceber o endereo inicial do espao alocado.
Alocao Dinmica
O trecho de cdigo ento seria:
int *v;
v = malloc(10*4);
Aps esse comando, se a alocao for bem sucedida,v armazenar o endereo inicial de uma reacontnua de memria suficiente para armazenar 10valores inteiros.
Alocao Dinmica
Podemos, ento, tratar v como tratamos um vetordeclarado estaticamente, pois, se v aponta para oincio da rea alocada, sabemos que v[0] acessa oespao o primeiro elemento a ser armazenado, v[1]acessa o segundo, e assim por diante (at v[9]).
Alocao Dinmica
No exemplo mostrado, consideremos que um inteiroocupa 4 bytes. Para ficarmos independentes decompiladores e mquinas, usamos o operadorsizeof()
v = malloc(10*sizeof(int));
Alm disso, devemos salientar que a funo malloc usada para alocar espao para armazenar valores dequalquer tipo.
Alocao Dinmica
Por esse motivo, malloc retorna um ponteirogenrico, para um tipo qualquer, representado porvoid*, que pode ser convertido automaticamentepela linguagem para o tipo apropriado na atribuio.
No entanto, comum fazer a converso utilizando ooperador de molde de tipo (cast).
Alocao Dinmica
O comando para a alocao do vetor de inteiros fica ento:
v = (int*) malloc (10*sizeof(int));
Assim, o ponteiro v aponta para o endereo inicial de umarea contnua de memria para 10 inteiros.
O operador sizeof() obtm o tamanho em bytes do tipo int eo operador de cast (int*), converte o ponteiro genricoretornado por malloc para um ponteiro do tipo int*.
Alocao Dinmica
2 Comando: v = (int*)malloc(10*sizeof(int))
Reserva espao de memria da rea
livre e atribui endereo varivel
Cdigo do Programa
Variveis Globais e
Estticas
1 Declarao: int *vAbre-se Espao na pilha para o
ponteiro (varivel local)
Cdigo do Programa
Variveis Globais e
Estticas
Livre
v v 504
Livre
40 bytes
Alocao Dinmica
Se, porventura, no houver espao livre suficientepara realizar a alocao, a funo retorna umendereo nulo (representado pelo smbolo NULL,definido em stdlib.h).
Podemos cercar o erro na alocao da memriaverificando o valor de retorno da funo malloc.
Alocao Dinmica
...
v = (int*) malloc (10*sizeof(int));
if (v == NULL)
{
printf(Memoria insuficiente.\n);
exit(1);
}
...
Alocao Dinmica
Para liberar um espao de memria alocadodinamicamente, usamos a funo free.
Essa funo recebe como parmetro o ponteiro damemria a ser liberada.
Assim, para liberar o vetor v, fazemos:free (v);
S podemos passar para a funo free um endereode memria que tenha sido alocadodinamicamente.
Alocao Dinmica - Exemplo
main(){
int i, n;float *v;float med;printf("Quantas notas sero lidas?: ");scanf("%i",&n);/*alocao dinmica*/v = (float*) malloc (n*sizeof(float));if(v == NULL) {
printf("Memria Insuficiente");return 1;
}
/*leitura dos valores*/for(i=0; i
Alocao Dinmica - Exemplo
/* funo para clculo da mdia */
float media(int n, float *v)
{
int i;
float s = 0.0f;
for(i=0; i
Alocao Dinmica - Outro Exemplo
main(){1 int *p, *q;2 int x;3 p = (int*) malloc(sizeof(int));4 *p = 3;5 q = p;6 printf("%d %d\n", *p, *q);7 x = 7;8 *q = x;9 printf("%d %d\n", *p, *q);10 p = (int*) malloc(sizeof(int));11 *p = 5;12 printf("%d %d\n", *p, *q);}
Na linha 3, uma varivel inteira criada e seu endereo colocado emp.
A linha 4 define o valor dessa varivel
como 3.
A linha 5 define q com o valor dessavarivel. (ver Figura a)
A linha 6, portanto, imprime ocontedo dessa varivel (que 3)duas vezes.
A linha 7 define o valor de umavarivel de inteiro, x, com 7
Alocao Dinmica - Outro Exemplo
A linha 8 muda o valor de *q para ovalor de x. Entretanto, como p e qapontam ambos para a mesmavarivel, *p e *q tm o valor 7. (verFigura b)
A linha 9, portanto, imprime onmero 7 duas vezes.
A linha 10 cria uma nova varivelinteira e coloca seu endereo em p.(ver Figura c)
A linha 11 define o valor dessavarivel recm-criada com 5 (verFigura d)
A linha 12 imprime os valores 5 e 7.
main(){1 int *p, *q;2 int x;3 p = (int*) malloc(sizeof(int));4 *p = 3;5 q = p;6 printf("%d %d\n", *p, *q);7 x = 7;8 *q = x;9 printf("%d %d\n", *p, *q);10 p = (int*) malloc(sizeof(int));11 *p = 5;12 printf("%d %d\n", *p, *q);}
Alocao Dinmica - Outro Exemplo
p
q 3
a)
p
q 7
x
7
b)
p
q x
7 7
c)
p
q x
7 7
d)
5
Recommended