Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação

21
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação

description

Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação. 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. Revisando. - PowerPoint PPT Presentation

Transcript of Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação

Page 1: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação

Aula prática 9Alocaçã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

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

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

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

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

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

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

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

Malloc

void* malloc(int size)

Page 10: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação

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

Calloc

void* calloc(int n, int size)

Page 12: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação

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

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

Realloc

void* realloc(void* pointer, int size)

Page 15: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação

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

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

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

Alocação Dinâmica

Dúvidas?

Page 19: Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação

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

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

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.