Download - Aula 6 - Alocação Dinâmica de Memória
-
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