20 - Alocação Dinâmica
20 - Alocação Dinâmica
20 - Alocação Dinâmica
Glécio Albuquerque
PROGRAMAÇÃO II
Alocação Dinâmica
Conteúdo
• Alocação Estática
• Alocação Dinâmica
• Malloc
• Sizeof
• Free
• Alocação de Vetores
• Alocação de Matrizes
• Calloc
• Realloc
• Exercício
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Alocação Estática
• Na execução de um programa geralmente precisamos
armazenar dados temporariamente na memória. Para
isso, lançamos mão das variáveis de memória.
• As variáveis de memórias são declaradas através da
determinação de um tipo de dado e seu identificador
(nome), podendo ainda ser seguida de seu valor inicial
(default).
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Alocação Estática
• No exemplo anterior, as variáveis são definidas utilizando
alocação estática.
• Em tempo de compilação já é conhecida a quantidade de
memória que será necessária para a execução do
programa.
• Ao iniciar o programa, toda a memória necessária para a
sua execução será alocada.
• Acontece que, às vezes, a quantidade de memória a
alocar só se torna conhecida durante a execução do
programa. Para lidar com essa situação é preciso recorrer
à alocação dinâmica de memória.
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Alocação Dinâmica
• A alocação dinâmica é o processo utilizado para se
alocar memória em tempo de execução.
• É utilizada quando não se sabe ao certo quanto de
memória será necessário para o armazenamento dos
dados, podendo ser determinado em tempo de execução
conforme a necessidade do programa.
• Outro ponto é a econômica de memória, já que é alocada
apenas a quantidade de memória necessária para a
operação.
• A alocação dinâmica é muito utilizada em problemas de
estruturas de dados, a exemplo de listas encadeadas e
arvores, entre outros.
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Alocação dinâmica
• Para trabalharmos com alocação dinâmica em linguagem
C, fazemos uso das seguintes funções:
• malloc
• calloc
• realloc
• free
• Além dessas funções, fazemos uso do operador sizeof.
• Também, na alocação dinâmica, o conceito de ponteiros
é bastante utilizado.
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Ponteiros
• Ponteiro é um tipo de dado especial que armazena um
endereço de memória. Possui um tipo e é precedido do
simbolo “*”.
• Exemplo de uso de um ponteiro e seu comportamento na
memória:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Malloc
• A função malloc aloca um bloco de bytes consecutivos
na memória do computador e devolve o endereço do
primeiro byte desse bloco.
• O número de bytes é especificado como argumento da
chamada da função.
• A função malloc retorna um ponteiro de tipo genérico,
void *, cabendo ao programador fazer um type casting
para o tipo apropriado.
• No seguinte fragmento de código, malloc aloca 01 byte:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Malloc
• Neste outro código, a função malloc é utilizada para
alocar espaço de memória para um valor inteiro e um
valor double:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Malloc
• No caso de alocarmos espaço de memória pra um
registro (struct), precisamos saber a quantidade total
de bytes necessários para armazenar a estrutura na
memória.
Sizeof
• O operador sizeof retorna um inteiro, informando o
tamanho, em bytes, do tipo de dados passado como
argumento:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Sizeof
• Exemplos anteriores aplicando o operador sizeof:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
NULL
• Se a memória do computador já estiver toda ocupada,
malloc não consegue alocar mais espaço e devolve
NULL.
• Convém verificar essa possibilidade antes de prosseguir:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Free
• As variáveis alocadas estaticamente dentro de um
escopo de código são desalocadas automaticamente
quando a execução do escopo termina.
• Já as variáveis alocadas dinâmicamente continuam a
existir mesmo depois que a execução do escopo termina.
• Para liberarmos a memória ocupada por essas variáveis,
é preciso recorrer à função free.
• A função free recebe como parâmetro um ponteiro para
o endereço inicial da memória que será desalocada.
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Free
• A função free libera a porção de memória alocada por
malloc. O comando avisa ao sistema que o bloco de
bytes apontado por idade está livre. A próxima chamada
de malloc poderá tomar posse desses bytes.
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Alocando Vetores
• Como já vimos, é possível alocar, além de variáveis
simples, estruturas mais complexas, a exemplo de
registros.
• É possível também trabalharmos dinâmicamente com
outros tipos de estruturas, como por exemplo os vetores.
• De acordo com a norma ANSI, o trecho de código a
seguir não é a forma correta de se declarar um vetor, a
menos que n seja uma constante, definida por const ou
#define.
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Alocando Vetores
• O exemplo a seguir mostra como podemos alocar e
desalocar um vetor com n elementos inteiros durante a
execução de um programa:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Alocando Matrizes
• Outra exemplo de estruturas onde podemos utilizar
alocação dinâmica são as matrizes.
• Matrizes bidimensionais são implementadas como
vetores de vetores.
• Uma matriz com n linhas e m colunas é um vetor onde
cada elemento de n é um vetor de m elementos.
• Isto significa que temos um vetor de n posições de
poteiros, onde cada posição de n vai apontar para um
vetor de m posições do tipo de dado da matriz.
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Alocando Matrizes
• Exemplo da alocação dinâmica de uma matriz n x m:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Desalocando Matrizes
• Exemplo de desalocação da matriz n x m alocada
anteriormente:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Calloc
• Assim como malloc, calloc tem a função de alocar
espaços na memória. Sua principal diferença é que a
mesma inicializa com zeros os bits das posições de
memórias alocadas.
• Outro ponto é que o uso de calloc facilita a alocação de
estruturas como vetores e matrizes.
• Está definida da seguinte forma:
Calloc
• No trecho de código a seguir é alocado um vetor de
inteiros com 5 posições através da função calloc:
Realloc
• A função realloc permite alocar ou realocar um
espaço de memória.
• Pode ser utilizada em casos onde se deseja aumentar ou
diminuir o espaço de memória previamente alocado.
• Está definida da seguinte forma:
Realloc
• Exemplo de uso da função realloc:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Realloc
• Alocando e desalocando com realloc:
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Praticando
1. Escreva um programa que leia um número inteiro
positivo n, indicando a quantidade de inteiros que
serão lidos, e imprima-os em ordem invertida. Por
exemplo, ao receber
5, 222, 333, 444, 555 e 666
seu programa deve imprimir
666, 555, 444, 333, 222 e 5
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Códigos e exercícios
https://drive.google.com/folderview?
id=0BxsDe2LkW3V2cExTTTE3YWhmLTg&usp=sharing
20 - Alocação Dinâmica Prof. Glécio Albuquerque
Referências
CPLUSPLUS. C Standard General Utilities Library. Disponível
em: http://www.cplusplus.com/reference/cstdlib/. Acessado em:
10/07/2015.
LINGUAGEMCDESCOMPLICADA. Linguagem C. Disponível
em: https://programacaodescomplicada.wordpress.com/indice/
linguagem-c/. Acessado em: 10/07/2015.
Obrigado!!!