Sie sind auf Seite 1von 33

ALGORITMOS E PROGRAMAO

Alocao Dinmica

Prof. Victoria Souto


E-mail : victoria.souto@gmail.com
Introduo:
At aqui era necessrio saber o tamanho de uma matriz, o
que um fator limitante;

Limitao: Se desenvolvermos um programa para calcular a


mdia das notas de uma prova, teremos de prever o
nmero mximo de alunos.

Dimensionar o vetor com um nmero muito grande


Desperdcio de Memria.

A Linguagem C oferece meios de requisitar espaos de memria


em tempo de execuo. Dizemos que podemos alocar memria
dinamicamente.
Vetores:
A forma mais simples de estruturar um conjunto de dados por
meio de vetores. Definimos um vetor em C da seguinte maneira:

int v[10];

v um vetor de inteiros dimensionado com 10 elementos, isto ,


reservamos um espao de memria contnuo para armazenar 10 valores
inteiros.

Se cada int ocupa 4 bytes, a declarao reserva um espao de 40


bytes na memria.
Se cada int ocupa 4 bytes, a declarao reserva um
espao de 40 bytes na memria.

144
V[9]
V[8]
V[7]
V[6]
V[5]
V[4]
V[3]
V[2]
V[1]
V[0]
v 104
Exemplo:
Calcular a mdia e a varincia de um conjunto de 10
valores.
Exemplo:
Exemplo:
Alocao Dinmica
Informalmente, podemos dizer que existem trs maneiras de
reservar espaos de memria para o armazenamento de
informaes:

Utilizando Varveis Globais (estticas) O espao reservado


para uma varivel global existe enquanto o programa estiver sendo
executado.
Utilizando Variveis Locais O espao reservado existe apenas
enquanto a funo que declarou a varivel est sendo executada,
sendo liberado para outros usos quando a execuo da funo
termina.

As variveis globais ou locais podem ser simples ou vetores. Para os


vetores, precisamos informar o nmero mximo de elementos; caso
contrrio, o compilador no saberia o tamanho do espao a ser
reservado.
Alocao Dinmica
Informalmente, podemos dizer que existem trs maneiras de
reservar espaos de memria para o armazenamento de
informaes:

A terceira maneira de reservar memria requisitar ao sistema,


em tempo de compilao, um espao de um determinado tamanho.
Esse espao alocado dinamicamente permanece reservado at que
seja explicitamente liberado pelo programa.

A partir do momento em que liberamos o espao ele estar


disponibilizado para outros usos e no podemos mais acess-los. Se o
programa no liberar um espao alocado, ele ser automaticamente
liberado quando a execuo do programa terminar.
Alocao Dinmica
Existem funes, presentes na biblioteca padro stdlib, que
permitem alocar e liberar memria dinamicamente.

Funo bsica para alocar memria malloc (Ela recebe


como parmetro o nmero de bytes que se deseja alocar e retorna o
endereo inicial da rea de memria alocada).

Funo bsica para liberar um espao de memria alocado


dinamicamente free (Essa funo recebe como parmetro o
ponteiro da memria a ser liberada).
Alocao Dinmica
Exemplo: Considere a alocao dinmica de um vetor de
inteiros com 10 elementos.

Como a funo malloc tem como valor de


retorno o endereo da rea alocada e, nesse
int *v; exemplo, desejamos armazenar valores inteiros
v = malloc (10*4); nessa rea, devemos declarar um ponteiro de
inteiro para receber o endereo inicial do espao
alocado.

Aps esse comando, se a alocao for bem-sucedida, v armazenar o endereo


inicial de uma rea contnua de memria suficiente para armazenar 10 valores
inteiros.

Podemos tratar v como tratamos um vetor declarado estaticamente, pois, se v


aponta para o incio da rea alocada, sabemos que v[0] acessa o espao para o
primeiro elemento a ser armazenado, v[1] acessa o segundo, e assim por diante
(at v[9]).
Alocao Dinmica
Exemplo: Considere a alocao dinmica de um vetor de
inteiros com 10 elementos.

int *v; Neste caso, consideramos que um inteiro ocupa


v = malloc (10*4); 4 bytes.

Para ficarmos INDEPENDENTES de compiladores e mquinas,


DEVEMOS utilizar o operador sizeof.

int *v; O operador sizeof retorna o tamanho


v = malloc (10*sizeof(int)); em bytes de uma varivel ou de um tipo
primitivo de dados.
Alocao Dinmica
Exemplo: Considere a alocao dinmica de um vetor de
inteiros com 10 elementos.

int *v; O operador sizeof retorna o tamanho


v = malloc (10*sizeof(int)); em bytes de uma varivel ou de um tipo
primitivo de dados.

A funo malloc usada para alocar espao para armazenar valores de


qualquer tipo. Por esse motivo, malloc retorna um PONTEIRO GENRICO,
para um tipo qualquer, representado por *void, que pode ser convertido
automaticamente pela linguagem para o tipo apropriado na atribuio. No
entanto comum fazer a converso explicitamente, utilizando um operador de
molde de tipo (cast)

int *v;
v = (int*) malloc (10*sizeof(int));
Alocao Dinmica
Exemplo: Considere a alocao dinmica de um vetor de
inteiros com 10 elementos.

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

Se no houver espao livre suficiente para realizar a alocao, a funo retorna um


endereo nulo (NULL). Portanto, deve-se testar o retorno da funo malloc para
verificar houve erro na alocao de memria.

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

if (v == NULL){
printf(Memoria Insuficiente!!);
exit(1);
}
Alocao Dinmica
Exemplo: Considere a alocao dinmica de um vetor de
inteiros com 10 elementos.

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

if (v == NULL){
printf(Memoria Insuficiente!!);
exit(1);
}

Para liberar um espao de memria alocado dinamicamente, usamos a funo free.

free (v);

S podemos passar para a funo free um endereo de memria que tenha sido
alocado dinamicamente. Devemos lembrar que no podemos acessar o espao da
memria depois de liberado.
Alocao Dinmica
Exemplo: Calcular a mdia e a varincia de um conjunto de
valores, o programa deve ler o nmero de valores que sero
fornecidos.
L o nmero de valores
que sero lidos.
L o nmero de valores
que sero lidos.
Alocao Dinmica de
memria.
L o nmero de valores
que sero lidos.

Alocao Dinmica de
memria, testa se a
alocao de memria
foi feita com sucesso.
L o nmero de valores
que sero lidos.

Alocao Dinmica de
memria, testa se a
alocao de memria
foi feita com sucesso.

L os valores para
calcular mdia e
varincia.
L o nmero de valores
que sero lidos.

Alocao Dinmica de
memria, testa se a
alocao de memria
foi feita com sucesso.

L os valores para
calcular mdia e
varincia.

Calcula a mdia dos


valores digitados.
L o nmero de valores
que sero lidos.

Alocao Dinmica de
memria, testa se a
alocao de memria
foi feita com sucesso.

L os valores para
calcular mdia e
varincia.

Calcula a mdia dos


valores digitados.

Calcula a varincia dos


valores digitados.
Alocao Dinmica
Em tempo de execuo, podemos verificar que a dimenso
escolhida para um vetor tornou-se insuficiente (ou excessivamente
grande) e necessitava de um redimensionamento.

A funo realloc da biblioteca padro nos permite realocar um vetor


preservando o contedo dos elementos, que permanecem vlidos aps a
realocao.

m representa a nova
v = (int*) realloc(v, m*sizeof(int));
dimenso do vetor.
Matrizes
A linguagem C permite a criao de vetores bidimensionais,
declarados estaticamente. Exemplo:

float mat[4][3];

Essa declarao reserva um espao de memria necessrio para


armazenar os 12 elementos da matriz, que so armazenados de
maneira contnua, organizados linha a linha.
Matrizes
float mat[4][3] = {{ 1.0, 2.0, 3.0},
152
1.0
{4.0, 5.0, 6.0},
{7.0, 8.0, 9.0}, 2.0

{10.0, 11.0, 12.0}}; 3.0


4.0
j
5.0
1.0 2.0 3.0 6.0
i 4.0 5.0 6.0 7.0
7.0 8.0 9.0
10.0 11.0 12.0 8.0
9.0
10.0
A varivel que representa a matriz, mat,
representa um ponteiro para o primeiro 11.0
vetor-linha. 12.0 104
Matrizes Dinmicas
As matrizes declaradas estaticamente sofrem das mesmas limitaes
dos vetores: precisamos saber de antemo suas dimenses. Se as
dimenses s so conhecidas em tempo de execuo, devemos
utilizar alocao dinmica.

A linguagem C s permite alocar dinamicamente conjuntos


unidimensionais. Para trabalhar com matrizes alocadas dinamicamente,
temos de criar abstraes conceituais com vetores para representar
conjuntos bidimensionais.
Matrizes Dinmicas
Matriz Representada por um Vetor Simples:

Reservamos as primeiras posies do vetor para armazenar os elementos da


primeira linha, seguidos dos elementos da segunda linha, e assim por diante.

Conjunto Bidimensional A estratgia de endereamento para acessar


os elementos da matriz, o seguinte: Se quisermos acessar o que seria o
elemento mat[i][j] de uma matriz, devemos acessar o elemento v[k], com
k=i*n + j, onde n representa o nmero de colunas da matriz.

j
mat[1][1] = e;
a b c
i v[k] = e; k = i*n+j = 1*3 + 1 = 4
d e f
g h i
j k l a b c d e f g h i j k l
Matrizes Dinmicas
Matriz Representada por um Vetor Simples:
j
mat[1][1] = e;
a b c
i v[k] = e; k = i*n+j = 1*3 + 1 = 4
d e f
g h i
j k l a b c d e f g h i j k l

A alocao da matriz recai em uma alocao de vetor com m*n elementos,


onde m e n representam as dimenses da matriz.

float *mat;
mat = (float*) malloc (m*n*sizeof(float));

No entanto, necessrio utilizar a notao v[i*n + j] para acessar os elementos,


o que pode deixar o cdigo pouco legvel.
Matrizes Dinmicas
Matriz Representada por um Vetor de Ponteiros:

Cada linha da matriz representada por um vetor independente. A


matriz ento representada por um vetor de vetores, ou vetor de
ponteiros, no qual cada elemento armazena o endereo do primeiro
elemento de cada linha.
j=2

a b c
i=1 d e f
g h i j=2
a b c

i=1 d e f

g h i
Matrizes Dinmicas
Matriz Representada por um Vetor de Ponteiros:

A alocao da matriz agora mais elaborada. Primeiro, temos de


alocar o vetor de ponteiros. Em seguida, alocamos cada uma das
linhas da matriz, atribuindo seus endereos aos elementos do vetor
de ponteiros criado.

int i;
float **mat; /*Matriz representada por um vetor de ponteiros*/

mat = (float**) malloc(m*sizeof(float*));


for (i=0;i<m; i++)
mat[i] = (float*) malloc(n*sizeof(float));

Os elementos da matriz podem ser acessados atravs da notao mat[i][j].


Matrizes Dinmicas
Matriz Representada por um Vetor de Ponteiros:

A liberao do espao de memria ocupado pela matriz tambm


exige a construo de um lao, pois temos de liberar cada linha
ANTES de liberar o vetor de ponteiros.

for (i=0;i<m;i++)
free (mat[i]);

free (mat);
Exerccio:
Determinar a matriz transposta da matriz A alocada
dinamicamente (Nmero de linhas e colunas deve ser
informado pelo usurio). Considere:

Matriz com vetor simples;


Matriz com vetor de ponteiros;

Das könnte Ihnen auch gefallen