PROGRAMAÇÃO DE
COMPUTADORES I
Prof. Filipe Nunes Ribeiro
AGENDA
Inicialização de ponteiros
Alocação dinâmica de memória
Funções que retornam ponteiros
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
INICIALIZAÇÃO DE PONTEIROS
Se tentarmos usar um ponteiro antes de
inicializá-lo, ou seja, antes de fornecer um
endereço inicial ao ponteiro, teremos um erro de
lógica ou o programa irá abortar.
Um ponteiro pode receber o endereço de uma
INICIALIZAÇÃO DE PONTEIROS
ERRO: não se pode mudar o valor para o qual o
ponteiro aponta sem que antes o ponteiro aponte
para algum lugar
ERRO: não existe como obter um valor para o qual
um ponteiro aponta se ele não aponta para lugar
nenhum
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
INICIALIZAÇÃO DE PONTEIROS
Poderíamos ter inicializado o ponteiro ptr com o
valor NULL, já que não iremos usá-lo:
int* ptr = NULL;
Então antes de acessar o ponteiro devemos fazer
um teste:
if(ptr != NULL) {
// podemos acessar o ponteiro
}
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Vejamos o seguinte exemplo:
Estruturas de dados estáticas têm seu espaço pré-determinado em tempo de
compilação
Então, como criar um arranjo que saiba o tamanho durante a execução do
programa?
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Como alocamos arrays? Vejamos o exercício feito
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Número de elementos definidos
inicialmente.
Alocação estática.
Caso o usuário utilize apenas 10
elementos do array o restante do
espaço alocado será desperdiçado.
No caso 40 bytes no mínimo.
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Podemos realizar a alocação dinâmica de memória
em tempo de execução
Existem alguns mecanismos que permitem fazer tal
alocação
Memória pode ser alocada em uma região de
memória chamada heap.
Memória alocada da heap DEVE ser devolvida
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
RECAPITULANDO...
Como é a utilização de memória por um programa
C que está sendo executado?
Um programa C compilado cria e usa quatro regiões,
logicamente distintas na memória, que possuem
RECAPITULANDO...
Como é a utilização de memória por um programa
C que está sendo executado?
Região que contém todo o código
do programa que está sendo executado.
Região que contém as variáveis
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
RECAPITULANDO...
Como é a utilização de memória por um programa
C que está sendo executado?
Endereço de retorno das chamadas de
função. Argumentos para as funções
e variáveis locais. Estado atual da CPU.
O heap é uma região de memória livre
que seu programa pode usar, via
alocação dinâmica, em aplicações
como listas encadeadas e árvores.
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Em C podemos contar com algumas funções para a
manipulação do heap.
Encontram-se na biblioteca stdlib.h
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Malloc
Solicita memória ao sistema
Sintaxe
Retorno: ponteiro
sem tipo
para o início da área
alocada
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Free
Libera memória ao sistema
Sintaxe
void *p ponteiro que aponta para o início de uma área alocada
por malloc.
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Como alocar então espaço de memória para um
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Como ficaria o programa para soma do array? Parte
1
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Como ficaria o programa para soma do array? Parte
2
O método para calcular a soma continuaria o mesmo
Vejam a importância da utilização de funções para a
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Faltou uma coisa muito importante no nosso
programa
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Mais um exemplo – Alocação dinâmica de 100
caracteres
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Não, nem sempre é possível. Caso não conseguir
memória disponível para efetuar a alocação, a
função malloc retorna NULL.
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
ALOCAÇÃO DINÂMICA DE MEMÓRIA
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Alocação de x pontos flutuantes de precisão dupla. Ex completo com aritmética
de ponteiros
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Outras funções para alocação dinâmica
calloc – aloca um bloco de memória para um array
de n elementos do tamanho informado
Ex: calloc(50, sizeof(int));
O Código acima aloca um espaço na memória para 50
inteiros e
inicializa todos os bytes com 0
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Outras funções para alocação dinâmica
realloc – muda o tamanho do bloco de memória
referenciado pelo ponteiro, reduzindo-o ou
expandindo-o
Ex:
float * p;
p = malloc(100 * sizeof(float));
...
p = realloc(p, 200 * sizeof(float));
O Código acima muda a alocação do ponteiro p
passando de 100 floats para 200 floats.
VETOR DE PONTEIROS
Podemos declarar um vetor de ponteiros, ou seja,
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
VETOR DE PONTEIROS
Onde usar vetor de ponteiros?
Exemplos:
Imagine várias strings que precisam ser ordenadas. Se
fossem todas copiadas e ordenadas seqüencialmente a
cópia de dados na memória seria muito grande. Melhor
criarmos um array de ponteiros para as strings de forma
ordenada.
E se precisarmos das strings de forma ordenada e de forma
desordenada? Copiar todas as strings? Não, podemos
utilizar array de ponteiros
VETOR DE PONTEIROS
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
FUNÇÕES QUE RETORNAR PONTEIROS
Se declararmos o método funcaoA como abaixo o
FUNÇÕES QUE RETORNAR PONTEIROS
Se declararmos o método funcaoA como abaixo o
que aconteceria?
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
FUNÇÕES QUE RETORNAR PONTEIROS
E agora compila?
ERRO de compilação: atribuição a um vetor
COMPILA mas podem acontecer erros
durante a execução. Pode funcionar como
esperado porque o ponteiro ptr armazena
o endereço de uma área de memória que
já foi desalocada.
FUNÇÕES QUE RETORNAR PONTEIROS
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas
PROBLEMAS COM PONTEIROS
Ponteiros não inicializados
int x, *p;
x = 10;
PROBLEMAS COM PONTEIROS
Referência pendente
int *q;
int x;
int *ptr = malloc(...);
q = ptr;
free(q);
Universidade Federal de Ouro Preto Campus João Monlevade
Instituto de Ciências Exatas e Aplicadas