Вы находитесь на странице: 1из 29

Alocação Dinâmica em Linguagem C

LINGUAGEM C
Alocação Dinâmica

Glécio Rodrigues de Albuquerque


glecioalbuquerque@gmail.com
Alocação Dinâmica em Linguagem C

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
Alocação Dinâmica em Linguagem C

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).
Alocação Dinâmica em Linguagem C

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.
Alocação Dinâmica em Linguagem C

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.
Alocação Dinâmica em Linguagem C

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.
Alocação Dinâmica em Linguagem C

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:
Alocação Dinâmica em Linguagem C

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:
Alocação Dinâmica em Linguagem C

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:
Alocação Dinâmica em Linguagem C

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.

• Para facilitar esta tarefa, fazemos uso do operador


sizeof.
Alocação Dinâmica em Linguagem C

Sizeof
• O operador sizeof retorna um inteiro, informando o
tamanho, em bytes, do tipo de dados passado como
argumento:
Alocação Dinâmica em Linguagem C

Sizeof
• Exemplos anteriores aplicando o operador sizeof:
Alocação Dinâmica em Linguagem C

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:
Alocação Dinâmica em Linguagem C

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.
Alocação Dinâmica em Linguagem C

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.
Alocação Dinâmica em Linguagem C

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.
Alocação Dinâmica em Linguagem C

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:
Alocação Dinâmica em Linguagem C

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.
Alocação Dinâmica em Linguagem C

Alocando Matrizes
• Exemplo da alocação dinâmica de uma matriz n x m:
Alocação Dinâmica em Linguagem C

Desalocando Matrizes
• Exemplo de desalocação da matriz n x m alocada
anteriormente:
Alocação Dinâmica em Linguagem C

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:

• A função calloc recebe como parâmetros dois inteiros


sem sinal. O primeiro indica a quantidade de dados que
se pretende alocar e o segundo, o tamanho, em bytes, de
cada dado que será alocado.
Alocação Dinâmica em Linguagem C

Calloc
• No trecho de código a seguir é alocado um vetor de
inteiros com 5 posições através da função calloc:

• É importante observar que, da mesma forma como


acontece com malloc, caso a alocação não seja
efetivada, ao invés de retornar um ponteiro a função irá
retornar o valor NULL.
Alocação Dinâmica em Linguagem C

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:

• A função recebe um ponteiro para o qual se deseja alocar


ou realocar e a quantidade de memória, em bytes,
necessária para a operação.
• Assim como malloc e calloc, realloc retorna um
ponteiro para o primeiro byte da memória alocada ou o
valor NULL.
Alocação Dinâmica em Linguagem C

Realloc
• Exemplo de uso da função realloc:
Alocação Dinâmica em Linguagem C

Realloc
• Alocando e desalocando com realloc:
Alocação Dinâmica em Linguagem C

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
Alocação Dinâmica em Linguagem C

Códigos e exercícios
https://drive.google.com/folderview?id=0BxsDe2LkW3V2cE
xTTTE3YWhmLTg&usp=sharing
Alocação Dinâmica em Linguagem C

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/lingua
gem-c/. Acessado em: 10/07/2015.

MEDINA, Marco. FERTIG, Cristina. Algoritmos e


Programação: Teoria e prática. São Paulo: Novatec, 2006.
SCHILDT, Herbert. C Completo e Total. 3.ed. Makron Books do
Brasil Editora, São Paulo, 1996.
Alocação Dinâmica em Linguagem C

Obrigado!!!

Вам также может понравиться