Aula prática 9
Alocação Dinâmica
Monitoria de Introdução à Programação
Revisando

Vimos anteriormente
que onoprograma
momentoé em
que
Assim,
no momento que
executado,
declaramos
vetor, ode
mesmo
alocado na
temos
que oum
endereço
vetor éé C8
memória de forma sequencial.
Revisando

O mesmo
acontece
para
uma
matriz alocada
Ao
alocar a
matriz de
forma
sequencial,
temos um
estaticamente.
Todas
posições
estão ocupando
pró
e um contra.
Quaisasseriam
eles?
a memória de forma sequencial.
Revisando

O fato da matriz estar alocada de forma sequencial
dá rapidez ao acesso de elementos.

Porém, em memórias fragmentadas, impede a
alocação de uma matriz de tamanho relativamente
grande.
Como
podemos solucionar esse problema?


E em programas em que a necessidade de
memória é variável, sempre precisamos alocar
memória para o pior caso.
Alocação Dinâmica

Ferramenta que possibilita a reserva de memória
em tempo de execução.

Possibilita a criação de programas mais eficientes,
com um menor consumo de memória.

Como toda ferramenta, a alocação dinâmica tem
suas vantagens e desvantagens.
Alocação Dinâmica

O primeiro passo para alocar vetores e matrizes
de maneira dinâmica é aprendendo a utilizar as
seguintes funções:




void* malloc(int size)
void* calloc(int n, int size)
void* realloc(void* pointer, int size)
void free(void* pointer)
Malloc
void* malloc(int size)



Aloca na memória o número de bytes definido por
size, e retorna o endereço do primeiro elemento
desse espaço alocado.
O retorno é do tipo void*, logo, é sempre
necessário utilizar um cast ao se usar a função
malloc.
É recomendado sempre o uso do sizeof() para
calcular a quantidade de espaço a ser alocada.
Malloc
void* malloc(int size)



Caso não haja espaço suficiente na memória para
alocar, a função retornará NULL
Dessa maneira, podemos verificar durante a
execução se o programa deve continuar ou
finalizar usa execução.
Esse comportamento é igual para todas as
funções de alocação que veremos.
Malloc
void* malloc(int size)
Calloc
void* calloc(int n, int size)




Aloca na memória o número de bytes definido por
size multiplicado pelo valor de n, e retorna o
endereço do primeiro elemento desse espaço
alocado.
A memória alocada é limpa no processo.
Assim como o malloc, deve ser feito um cast no
retorno.
É recomendado sempre o uso do sizeof() para
calcular a quantidade de espaço a ser alocada.
Calloc
void* calloc(int n, int size)
Realloc
void* realloc(void* pointer, int size)




Aloca na memória o número de bytes definido por
size, e retorna o endereço do primeiro elemento
desse espaço alocado.
No processo, os elementos atuais da memória
apontada por pointer são copiados
Caso não haja memória suficiente, NULL é
retornado e pointer permanece inalterado.
Assim como no malloc e calloc, deve ser feito o
cast do retorno.
Realloc
void* realloc(void* pointer, int size)

De acordo com o visto, qual o problema em usar o
seguinte código:
Realloc
void* realloc(void* pointer, int size)
Free
void free(void* pointer)


Libera o espaço de memória alocado apontado por
pointer que foi previamente alocado utilizando
umas da funções vistas anteriormente.
Caso não seja utilizada, o espaço alocado
permanecerá bloqueado para outros usos.
Alocação Dinâmica de Matrizes

Vimos como
alocar
um vetor
dinamicamente,
Podemos
utilizar
ponteiros
em
vários níveis. mas
como faríamos para criar uma matriz?
Alocação Dinâmica de Matrizes



Vemos assim que, apesar de ocupar mais espaço,
uma matriz alocada dinamicamente nos permite
utilizar a memória de maneira mais eficiente.
Mas isso tem um pequeno custo, já que o acesso
aos elementos é feito de forma indireta.
É importante notar que esse mesmo processo
poderia ser feito para diversas dimensões.
Alocação Dinâmica
Dúvidas?
Exercício 1

Crie um programa que receba inteiros do usuário e
armazene-os em um array, sempre que este array
ficar cheio, dobre seu tamanho, quando isso
acontecer imprima na tela: “Array realocado”. Inicie o
array com tamanho 1. O programa finalizará se o
numero 0 for digitado, e, nessa hora, deverá imprimir
os valores recebidos até então. Libere a memória.
Exercício 2


Um amigo seu gostaria de um programa que receba
duas frases e um caractere e identifique qual das
duas possui mais repetições desse caractere (o
programa só deve fechar se nenhuma das strings
possuir o caractere).
Contudo, o computador dele tem pouca memória e,
por isso, seu programa não deve possuir espaços
vazios na string (o ‘\0’ será o ultimo termo do vetor),
ele também não pode deixar de liberar memória e, se
não conseguir alocar a memória, deve avisar (e o
programa será fechado).
Exercício 3






Um professor precisa de um registro dos seus alunos, e ele quer que
isso seja feito com alocação dinâmica.
Primeiramente ele diz quantos alunos deseja cadastrar, você deve
criar um vetor de ponteiros para char com este tamanho. A cada novo
aluno inserido você pode salva-lo num único buffer que
garantidamente caberá a nova string (que terá no máximo 100
caracteres).
Depois você precisa copiar o nome para o vetor onde estão todos os
alunos alocando somente a memoria estritamente necessária. Após a
entrada dos N alunos, libere o buffer e ordene o vetor de alunos em
ordem alfabética e exiba ao professor, esta será sua nova ata de
classe.
Lembre-se de liberar a memória depois de imprimir a saída.
O programa só deve fechar quando N = 0.
Dica : Use strcmp para ordenar os alunos.
Download

Realloc void* realloc(void* pointer, int size)