Você está na página 1de 50

9.

Alocação dinâmica de memória em C


5LIEE - Linguagem de Programação

Prof. Júlio Peixoto da Silva Júnior

Centro Universitário UniFanor - WYDEN


2019.1

1 de Maio de 2019

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 1 / 50


Conteúdo I

1 Breve Apresentação

2 Introdução

3 Conceito de Endereçamento de Memória

4 Alocação Dinâmica em C
malloc()
calloc()
realloc()
free()

5 Exemplos

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 2 / 50


Conteúdo I

1 Breve Apresentação

2 Introdução

3 Conceito de Endereçamento de Memória

4 Alocação Dinâmica em C
malloc()
calloc()
realloc()
free()

5 Exemplos

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 3 / 50


Prof. Júlio Peixoto Jr.
Formação:
1 Graduação em Engenharia de Computação - UFC (2012-2016)
2 Mestrado em Engenharia de Teleinformática - UFC (2017-2018)
3 Doutorando em Engenharia de Teleinformática - UFC
4 Tecnólogo em Mecatrônica - IFCE (2003-2007)
Professor na UniFanor desde hoje.
Disciplinas a serem ministradas n UniFanor
1 Linguagem de Programação
2 Sistemas Operacionais
3 Análise e Monitoramento de Desempenho
Áreas de Interesse
1 Inteligência Artificial (Machine Learning )
2 Linguagens de Programação
3 Processamento de Sinais
4 Aplicações Embarcadas
Experiência Profissional
Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 4 / 50
Conteúdo I

1 Breve Apresentação

2 Introdução

3 Conceito de Endereçamento de Memória

4 Alocação Dinâmica em C
malloc()
calloc()
realloc()
free()

5 Exemplos

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 5 / 50


Introdução
Alocação Dinâmica

Motivação
Sempre que escrevemos um programa, é preciso reservar espaço
para as informações que serão processadas.
Para isso utilizamos as variáveis.
Uma variável é uma posição de memória que armazena uma
informação que pode ser modificada pelo programa.
Definida antes de ser usada.
Infelizmente, nem sempre é possı́vel saber o quanto de memória um
programa irá precisa.1
Qual a solução para este impasse?

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 6 / 50


Introdução
Alocação Dinâmica

Alocação Dinâmica
Permite ao programador “criar” variáveis em tempo de execução, ou seja,
alocar memória para novas variáveis quando o programa está sendo
executado, e não apenas quando se está escrevendo o programa.

Exemplo Básico - Cálculo da média


PN
1 x
µ= (1)
N

Se o vetor x tiver 100 elementos?*


Se o programador não souber a dimensão de x?

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 7 / 50


Introdução
Alocação Dinâmica

Portanto
A alocação dinâmica permite ao programador alocar memória para
variáveis quando o programa está sendo executado. Assim,
poderemos definir, por exemplo, um vetor ou uma matriz cujo tamanho
descobriremos em tempo de execução.

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 8 / 50


Conteúdo I

1 Breve Apresentação

2 Introdução

3 Conceito de Endereçamento de Memória

4 Alocação Dinâmica em C
malloc()
calloc()
realloc()
free()

5 Exemplos

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 9 / 50


Conceito de Endereçamento de Memória
Alocação de Memória

Embora o programa seja composto por instruções e dados, tem-se,


conceitualmente, quatro regiões de memória.
Stack – região dinâmica, isto é, varia conforme a execução do
programa. Utilizada para armazenar o endereço nas chamadas de
funções e interrupções, passagem de parâmetros para funções,
armazenar variáveis locais ou pode ser manipulada para armazenar
dados em determinada operação;
Heap – Também é dinâmica, porém difere da pilha. Essa região é
considerada livre e é utilizada por mecanismos de alocação
dinâmica de memória;
Dados – A região de dados corresponde à área onde as variáveis
globais e estáticas são armazenadas;
Programa – Essa região armazena as instruções do programa.

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 10 / 50


Conceito de Endereçamento de Memória
Alocação de Memória

Figura 1: A área de heap cresce em sentido oposto à pilha e em direção a esta.

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 11 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 12 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 13 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 14 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 15 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 16 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 17 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 18 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 19 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 20 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 21 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 22 / 50


Conceito de Endereçamento de Memória
Exemplo sem Alocação de Memória

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 23 / 50


Conteúdo I

1 Breve Apresentação

2 Introdução

3 Conceito de Endereçamento de Memória

4 Alocação Dinâmica em C
malloc()
calloc()
realloc()
free()

5 Exemplos

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 24 / 50


Alocação Dinâmica em C

A memória alocada pelas funções de alocação dinâmica é obtida do


heap.
O heap é a região de memória livre que se encontra entre o programa
(com a área de armazenamento permanente) e a pilha (stack).
O tamanho do heap é, a princı́pio, desconhecido do programa.
O padrão C ANSI define apenas 4 funções para o sistema de
alocação dinâmica, disponı́veis na biblioteca stdlib.h
1 malloc()
2 calloc()
3 realloc()
4 free()

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 25 / 50


malloc()
Alocação Dinâmica

A função malloc() serve para alocar memória

Figura 2: Protótipo da função

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 26 / 50


malloc()
Considerações

Aloca um bloco de memória no heap com tamanho em bytes dado


pelo argumento n-bytes.
A função retorna o endereço do primeiro byte do bloco de memória
recém alocado ou o valor nulo NULL em caso de falta de memória.
O endereço retornado é do tipo void *, o que simboliza um endereço
genérico sem um tipo especı́fico.
Esse endereço deve ser armazenado em um ponteiro através de
uma conversão (cast) do tipo do endereço genérico para o tipo do
ponteiro particular.

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 27 / 50


malloc()
Alocação Dinâmica - Exemplo I

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 28 / 50


malloc()
Alocação Dinâmica - Exemplo I

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 29 / 50


malloc()
Alocação Dinâmica - Exemplo I

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 30 / 50


malloc()
Alocação Dinâmica - Exemplo I

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 31 / 50


malloc()
Alocação Dinâmica - Exemplo I

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 32 / 50


malloc()
Alocação Dinâmica - Exemplo I

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 33 / 50


malloc()
Alocação Dinâmica - Exemplo I

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 34 / 50


malloc()
Alocação Dinâmica - Exemplo I

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 35 / 50


malloc()
Alocação Dinâmica - Outros tipos de variáveis

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 36 / 50


malloc()
Alocação Dinâmica - Outros tipos de variáveis

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 37 / 50


malloc()
Alocação Dinâmica - Outros tipos de variáveis

No exemplo anterior, é alocada memória suficiente para se armazenar


a números inteiros.
A função sizeof() retorna o número de bytes de um inteiro. Ele é útil
para se saber o tamanho de tipos.
O ponteiro void* que malloc() retorna é convertido para um int* pelo
cast e é atribuı́do a p
Se não tiver sido, p terá um valor nulo, o que fará com que !p seja
verdadeiro.
Se a operação tiver sido bem sucedida, podemos usar o vetor de
inteiros alocados normalmente, por exemplo, indexando-o: p[0] até
p[(a-1)].

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 38 / 50


calloc()
Alocação Dinâmica

A função malloc() serve para alocar memória

Figura 3: Protótipo da função

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 39 / 50


calloc()
Alocação Dinâmica

A função calloc() também serve para alocar memória, mas possui um


pro-tótipo um pouco diferente.

Figura 4: Protótipo da função

A função aloca uma quantidade de memória igual a num * size, isto


é, aloca memória suficiente para um vetor de num objetos de
tamanho size.
Retorna um ponteiro void * para o primeiro byte alocado. O ponteiro
void * pode ser atribuı́do a qualquer tipo de ponteiro.
Se não houver memória suficiente para alocar a memória requisitada a
função calloc() retorna um ponteiro nulo.
Em relação a malloc(), calloc() tem uma diferença (além do fato de
ter protótipo diferente): calloc() inicializa o espaço alocado com
0s.
Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 40 / 50
calloc()
Alocação Dinâmica

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 41 / 50


calloc()
Alocação Dinâmica

No exemplo anterior, é alocada memória suficiente para se colocar a


números inteiros.
O operador sizeof() retorna o número de bytes de um inteiro. Ele é
útil para se saber o tamanho de tipos.
O ponteiro void * que calloc() retorna é convertido para um int *
pelo cast e é atribuı́do a p.
A declaração seguinte testa se a operação foi bem sucedida.
Se não tiver sido, p terá um valor nulo, o que fará com que !p retorne
verdadeiro.
Se a operação tiver sido bem sucedida, podemos usar o vetor de
inteiros alocados normalmente, por exemplo, indexando-o: p[0] até
p[(a-1)].

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 42 / 50


realloc()
Alocação Dinâmica

Modifica o tamanho da memória previamente alocada apontada por *ptr


para aquele especificado por num.

Figura 6: Protótipo da função


Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 43 / 50
realloc()
Alocação Dinâmica

O valor de num pode ser maior ou menor que o original. Um ponteiro


para o bloco é devolvido porque realloc() pode precisar mover o bloco
para aumentar seu tamanho.
Se isso ocorrer, o conteúdo do bloco antigo é copiado no novo bloco,
e nenhuma informação é perdida.
Se ptr for nulo, aloca num bytes e devolve um ponteiro; se num é
zero, a memória apontada por ptr é liberada.
Se não houver memória suficiente para a alocação, um ponteiro nulo
é devolvido e o bloco original é deixado inalterado.

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 44 / 50


realloc()
Alocação Dinâmica

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 45 / 50


free()
Alocação Dinâmica

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 46 / 50


free()
Alocação Dinâmica

Basta então passar para free() o ponteiro que aponta para o inı́cio da
memória alocada.

Mas você pode se perguntar: como é que o programa vai saber


quantos bytes devem ser liberados?
Ele “sabe” pois quando você alocou a memória, ele guardou o número de
bytes alocados numa ”tabela de alocação”interna

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 47 / 50


Conteúdo I

1 Breve Apresentação

2 Introdução

3 Conceito de Endereçamento de Memória

4 Alocação Dinâmica em C
malloc()
calloc()
realloc()
free()

5 Exemplos

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 48 / 50


Exemplo
Alocação Dinâmica

Exemplo Básico - Cálculo da média e variância Alocada


Dinamicamente
PN PN
1 x (x − µ)
µ= σ2 = 1
(2)
N N

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 49 / 50


Próxima Aula

1 Uso de ponteiros para otimização de códigos.


2 Vetores e matrizes operados por ponteiros.
3 Ponteiros de ponteiros.
4 Tipos de dados e ponteiros de tipos. Ponteiros sem tipo. Ponteiros de
ponteiros.
5 Problemas comuns de uso dos ponteiros
e-mail: juliojrps@gmail.com

Prof. Júlio Peixoto / UniFanor-WYDEN 5LIEE - Linguagem de Programação 1 de Maio de 2019 50 / 50