1 / 21

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

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.

morrison
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 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

  3. 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?

  4. 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.

  5. 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.

  6. 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)

  7. 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.

  8. 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.

  9. Malloc void* malloc(intsize)

  10. 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.

  11. Calloc void* calloc(int n, intsize)

  12. 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.

  13. Realloc void* realloc(void* pointer, intsize) • De acordo com o visto, qual o problema em usar o seguinte código:

  14. Realloc void* realloc(void* pointer, intsize)

  15. 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.

  16. 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.

  17. 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.

  18. Alocação Dinâmica Dúvidas?

  19. 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.

  20. 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).

  21. 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.

More Related