estrutura de dados alocação dinâmica de memória professor mário dantas contribuição:...

17
Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

Upload: internet

Post on 18-Apr-2015

104 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

Estrutura de DadosEstrutura de DadosAlocação Dinâmica de MemóriaAlocação Dinâmica de Memória

Professor Mário DantasProfessor Mário Dantas

Contribuição: Professor Marcelo DouglasContribuição: Professor Marcelo Douglas

Page 2: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

Alocação Dinâmica de MemóriaAlocação Dinâmica de Memória

• Ponteiros fornecem o suporte necessário para o poderoso sistema de alocação dinâmica.

• Alocação dinâmica é o meio pelo qual um programa pode obter memória enquanto está em execução.

• Nenhuma variável pode ser acrescentada em um programa em tempo de execução. Porém haverá momentos em que um programa precisará usar quantidades de armazenamento variáveis.

Page 3: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

Alocação Dinâmica de MemóriaAlocação Dinâmica de Memória

• Por exemplo, um processador de texto ou um banco de dados aproveita toda a RAM de um sistema. Porém, como a quantidade de RAM varia entre computadores esses programas não podem usar variáveis normais.

• Em vez disso, esses e outros programas alocam memória, conforme necessário, usando as funções de alocação de memória.

Page 4: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

Alocação Dinâmica de MemóriaAlocação Dinâmica de Memória

• A memória alocada pelas funções de alocação dinâmica é obtida do heap – a região de memória livre do seu computador.

• Embora o tamanho do heap seja desconhecido, ele geralmente contém uma quantidade razoavelmente grande de memória livre.

Page 5: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

Alocação Dinâmica de MemóriaAlocação Dinâmica de Memória

• No padrão C ANSI existem 4 funções para alocações dinâmica pertencentes a biblioteca stdlib.h. São elas malloc(), calloc(), realloc() e free(). Sendo que as mais utilizadas são as funções malloc() e free().

malloc() aloca memória

free() libera memória

Page 6: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

Alocação Dinâmica de MemóriaAlocação Dinâmica de Memória

• A alocação dinâmica é muito utilizada em problemas de estrutura de dados como por exemplo, listas encadeadas, pilhas, filas, arvores binárias e grafos.

Page 7: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

malloc()malloc()

• A sintaxe da função malloc() é dada por:

• numero_de_bytes é o número de bytes da memória que você quer alocar.

• O tipo size_t é definido em stdlib.h como sendo um inteiro sem sinal.

• O interessante é que esta função retorna um ponteiro do tipo void podendo assim ser atribuído a qualquer tipo de ponteiro.

void *malloc(size_t numero_de_bytes);

Page 8: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

malloc()malloc()

• O fragmento de código mostrado abaixo aloca 1000 bytes de memória:

• Em alguns compiladores o código acima retornará um erro de conversão de tipo:

Page 9: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

malloc()malloc()

• Para garantir portabilidade é interessante então efetuar o cast para o tipo de ponteiro que você deseja:

• Após a atribuição, p aponta para o primeiro dos 1000 bytes de memória livre.

Page 10: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

malloc()malloc()

• O próximo exemplo aloca espaço para 50 inteiros.

• Observe o uso de sizeof para assegurar a portabilidade:

Page 11: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

malloc()malloc()

• Como o heap não é infinito, sempre que alocar memória, você deve testar o valor devolvido por malloc(), antes de usar o ponteiro, para estar certo de que não é nulo.

• Usar um ponteiro nulo quase certamente travará o computador.

Page 12: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

free()free()

• A função free() é o oposto de malloc(), visto que ela devolve memória previamente alocada ao sistema.

• Uma vez que a memória tenha sido liberada, ela pode ser realocada por uma nova chamada a malloc().

• Aqui, pont é um ponteiro para a memória alocada anteriormente por malloc(). É muito importante que você nunca use free() com um argumento inválido, isso destruiria a lista de memória livre.

void free(void *pont)

Page 13: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas

Estrutura de DadosEstrutura de Dados

Exemplos de Alocação Dinâmica de Memória

Page 14: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas
Page 15: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas
Page 16: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas
Page 17: Estrutura de Dados Alocação Dinâmica de Memória Professor Mário Dantas Contribuição: Professor Marcelo Douglas