210 likes | 319 Views
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.
E N D
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 • 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?
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(intsize) • void* calloc(int n, intsize) • void* realloc(void* pointer, intsize) • voidfree(void* pointer)
Malloc void* malloc(intsize) • 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(intsize) • 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(intsize)
Calloc void* calloc(int n, intsize) • Aloca na memória o número de bytes definido por sizemultiplicado 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, intsize)
Realloc void* realloc(void* pointer, intsize) • 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 malloce calloc, deve ser feito o cast do retorno.
Realloc void* realloc(void* pointer, intsize) • De acordo com o visto, qual o problema em usar o seguinte código:
Realloc void* realloc(void* pointer, intsize)
Free voidfree(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, mas como faríamos para criar uma matriz? • Podemos utilizar ponteiros em vários níveis.
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 estritamentenecessá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.