Sie sind auf Seite 1von 30

Alocação Dinâmica

2 Introdução

 Um programa, ao ser executado, divide a memória do


computador em quatro áreas:
 Instruções – armazena o código C compilado e montado em
linguagem de máquina.
 Pilha – nela são criadas as variáveis locais.
 Memória estática – onde são criadas as variáveis globais.
 Heap – destinado a armazenar dados alocados dinamicamente.
3 Introdução
4 Introdução

 As variáveis da pilha e da memória estática precisam ter tamanho


conhecido antes do programa ser compilado.
float f
 Espaço na memória para 1 valores float – 8 bytes.

int v[1000]
 Espaço contíguo na memória para 1000 valores inteiros
 Se cada int ocupa 4 bytes, 4000 bytes, ~4KB

char v[50]
 Espaço contíguo na memória para 50 valores do tipo char
 Se cada char ocupa 1 byte, 50 bytes
5 Introdução

 Obs: As novas versões de C aceitam uma certa “liberdade” de


criação de variáveis estáticas sem o tamanho préviamente
conhecido.
6 Introdução
 Desvantagens:
 Variable Length Arrays (VLA) são uma tecnologia nova (incluída
somente no C99). Então NÃO IRÃO FUNCIONAR em todos os
computadores e tecnologias com versões mais antigas.

 VLAs não são criadas na memória estática (por não ter tamanho fixo),
e sim na pilha, dividindo espaço com variáveis locais e chamadas
recursivas de funções.

 Como elas não são criadas dinamicamente, elas não ficam na área de
heap.

 Finalmente, após criadas na inicialização do programa, seu tamanho


volta a ser estático, ou seja, não é possivel aumentar ou diminuir o
tamanho caso exista a necessidade.
Alocação dinâmica
7
 Técnica que aloca a memória sob demanda

 Os endereços podem ser alocados, liberados e


realocados para diferentes propósitos, durante a
execução do programa.
 Precisa aumentar o tamanho de uma variável? OK!
 A variável não tem mais função no programa?
Libera o espaço!

 Principais funções C para alocação dinâmica de


memória:
 malloc e free;
 Implementadas na biblioteca stdlib.h
Alocação dinâmica
8

 Exemplo: Alocar nome e sobrenome dos alunos do


curso em um SUPER MINI COMPUTADOR de 3000
bytes de memória.

 Tamanho máximo do nome - 100 caracteres


 Alocação estática – máximo de 30 pessoas
 Não é o ideal pois a maioria dos nomes não usam os
100 caracteres
Alocação dinâmica
9
 Alocação Dinâmica:
 Espaço endereçável (3000) ainda livre:

 Deseja-se inserir o aluno “Pedro”


 5 bytes para o nome completo + 1 byte para o „\0‟: 6 bytes:
 malloc (6)

Economia de 94 bytes!
Alocação dinâmica
10

 A variável é colocada em QUALQUER LOCAL DE


MEMÓRIA onde exista o espaço requisitado.
 No exemplo...qualquer local de memória onde exista
6 bytes contínuos disponíveis.

 Alocador do SO gerencia espaços ocupados e livres


(programador não precisa se preocupar onde estão os
espaços livres).
Alocação dinâmica
11

 Precisamos saber o endereço dos espaços de memória


utilizados

 Utilizamos Ponteiros para apontar para a área que foi alocada

Fazemos essa conexão do espaço e o ponteiro usando as


funções de alocação!
Malloc
12

 Serve para alocar a memória


 Retorna um ponteiro para o início da quantidade de memória
alocada

void *malloc (<quantidade_de_bytes_desejada>)

 Função retorna um ponteiro genérico, que é convertido para o


tipo da variável ponteiro que esta chamando a função

P aponta para um espaço de memória que cabem 100 inteiros


(100 * 4 bytes)
Malloc
13

Porém Nº1!
 A memória ocupada por um determinado tipo pode variar de máquina pra
máquina.
 Seu código deve ser independente de máquina!

 Solução: operador sizeof()

 Agora podemos guardar 100 inteiros em qualquer computador!


Malloc
14

Porém Nº2!
 MEMÓRIA NÃO É INFINITA! Se a memória do computador estiver toda
ocupada, malloc( ) não consegue alocar mais espaço e retorna NULL.
 Usar um ponteiro nulo travará seu computador na maioria dos casos!

 Solução: Garantir o sucesso do malloc!


Malloc
15
Malloc
16

Cuidado!
 O gerenciamento incorreto de memória pode causar um programa a
estourar todo o espaço disponível de memória.
 Um malloc mal implementado em QUALQUER lugar do código pode causar
erros fatais.

Este pequeno
código acaba
com TODA a
memória do
computador!
Free
17

 Libera o uso de um bloco de memória, permitindo


que este espaço seja reaproveitado.
 Recebe como argumento um ponteiro para a
porção de memória que se deseja liberar.
 O mesmo endereço retornado por uma chamada
da função malloc() deve ser passado para a
função free().
 A determinação do tamanho do bloco a ser
liberado é feita automaticamente.
Free
18

Código anterior
corrigido
Free
19

 A responsabilidade de liberar memória é do


programador, pois o programa não sabe quando o
bloco alocado não é mais necessário!

 Ao utilizar o free, atente-se de sempre liberar a


memória do início do bloco alocado, senão a
função irá gerar erros!
Free
20
Free
21
Free
22
Free
23
Free
24
Free
25

Programa irá gerar


ERRO!
Free
26

Não devemos liberar


todos os ponteiros, e
sim o BLOCO DE
MEMORIA ALOCADO,
então só precisamos
liberar algum ponteiro
que aponte para o
bloco
Outras Funções
27

Calloc( )
void *calloc (<tamanho> ,<quantidade_de_bytes_desejada>)
 Mesma funcionalidade do
malloc( )

 A diferença é que a memória


alocada não contem lixo, e sim
é alocada com zeros.

 Em vez de um único parâmetro,


temos um parâmetro tamanho e
o tamanho bytes
Outras Funções
28

Realloc( )
(tipo) *realloc ( tipo *<ponteiro> ,<novo_tamanho>)
 Modifica o tamanho de um bloco de memória já alocado.

 Pode aumentar ou diminuir o tamanho de um bloco.

 Preserva o conteúdo já existente.

 Precisa retornar um ponteiro com a posição do bloco


porque o realloc pode precisar mover o bloco de lugar
para aumentar seu tamanho.
Outras Funções
29

Realloc( )
Exemplo: Alocando uma struct
30

Das könnte Ihnen auch gefallen