210 likes | 348 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 arraycom tamanho 1. O programa finalizará se o numero 0 for digitado, e, nessa hora, deverá imprimir os valores recebidos até então. Lembre-se de liberar a memória.
Exercício 2 • Escreva um programa que receba a quantidade de linhas e colunas de uma matriz nxm, armazene essa matriz utilizando alocação dinâmica e imprima sua matriz transposta. • O programa só deve encerrar se a quantidade de linhas ou a quantidade de colunas dada pelo usuário for zero. • Lembre-se de liberar o espaço alocado para a matriz ao final de cada iteração, e de verificar se as alocações ocorreram com sucesso.