aula prática 9 alocação dinâmica monitoria de introdução à programação
TRANSCRIPT
![Page 1: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/1.jpg)
Aula prática 9
Alocação Dinâmica
Monitoria de Introdução à Programação
![Page 2: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/2.jpg)
Revisando
Vimos anteriormente que no momento em que declaramos um vetor, o mesmo é alocado na memória de forma sequencial.
Assim, no momento que o programa é executado, temos que o endereço de vetor é C8
![Page 3: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/3.jpg)
Revisando
O mesmo acontece para uma matriz alocada estaticamente. Todas as posições estão ocupando a memória de forma sequencial.
Ao alocar a matriz de forma sequencial, temos um pró e um contra. Quais seriam eles?
![Page 4: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/4.jpg)
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.
E em programas em que a necessidade de memória é variável, sempre precisamos alocar memória para o pior caso.
Como podemos solucionar esse problema?
![Page 5: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/5.jpg)
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.
![Page 6: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/6.jpg)
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)
![Page 7: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/7.jpg)
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.
![Page 8: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/8.jpg)
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
![Page 9: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/9.jpg)
Malloc
void* malloc(int size)
![Page 10: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/10.jpg)
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.
![Page 11: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/11.jpg)
Calloc
void* calloc(int n, int size)
![Page 12: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/12.jpg)
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.
![Page 13: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/13.jpg)
Realloc
void* realloc(void* pointer, int size)
De acordo com o visto, qual o problema em usar o seguinte código:
![Page 14: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/14.jpg)
Realloc
void* realloc(void* pointer, int size)
![Page 15: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/15.jpg)
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.
![Page 16: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/16.jpg)
Alocação Dinâmica de Matrizes
Vimos como alocar um vetor dinamicamente, mas como faríamos para criar uma matriz?
Podemos utilizar ponteiros em vários níveis.
![Page 17: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/17.jpg)
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.
![Page 18: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/18.jpg)
Alocação Dinâmica
Dúvidas?
![Page 19: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/19.jpg)
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.
![Page 20: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/20.jpg)
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).
![Page 21: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação](https://reader035.vdocuments.mx/reader035/viewer/2022062307/552fc130497959413d8d465b/html5/thumbnails/21.jpg)
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.