Alocação Estática e Dinâmica
Prof. M.Sc. Mariella Bergerhttp://www.inf.ufes.br/~mberger
[email protected]@gmail.com
Alocação Estática
Estratégia de alocação de memória na qual toda a memória que um tipo de dados pode vir a necessitar é alocada de uma só vez sem considerar a quantidade que seria realmente necessária na execução do programa.
Alocação Estática
int v[1000]– Espaço contíguo na memória para 1000 valores
inteiros– Se cada int ocupa 4 bytes, 4000bytes, ~4KB
char v[50]– Espaço contíguo na memória para 50 valores char– Se cada char ocupa 1 byte, 50 bytes
Alocação Estática x Dinâmica
• Exemplo: Alocar nome e sobrenome dos alunos do curso– 4000 espaços de memória– Vetor de string (alocação estática)– 100 caracteres (tamanho máximo do nome)– Podemos então definir 40 pessoas– Não é ideal pois a maioria dos nomes não usa 100
caracteres– Na alocação dinâmica, não é necessário definir de ante-
mão o tamanho máximo para os nomes
Alocação Dinâmica
• 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
• Espaço permanece reservado até que seja explicitamente liberado
Uso da Memória
• memória estática:– código do programa– variáveis globais– variáveis estáticas
• memória dinâmica:– variáveis alocadas dinamicamente– memória livre– variáveis locais
s
Uso da Memória
• Alocação dinâmica de memória– usa a memória livre– se o espaço de memória livre for menor que o espaço requisitado, a
alocação não é feita e o programa pode prever tratamento de erro• Pilha de Execução
– utilizada para alocar memória quando ocorre chamada de função:
• sistema reserva o espaço para as variáveis locais da função• quando a função termina, espaço é liberado (desempilhado)
– se a pilha tentar crescer mais do que o espaço disponível existente, programa é abortado com erro
Alocação Dinâmica em C
Funções disponíveis na stdlib:• Malloc
– void *malloc (unsigned int num);
• Calloc– void *calloc (unsigned int num, unsigned int size);
• Realloc– void *realloc (void *ptr, unsigned int num);
• Free– void free (void *ptr);
• Sizeof– Retorna o número de bytes ocupados por um tipo
Exemplo
Alocação dinâmica de um vetor de inteiros com 10 elementos
malloc retorna o endereço da área alocada para armazenar valores inteiros (retorna um ponteiro genérico)
Retorna NULL se não for possível alocar Usar type casting para especificar um tipo
int *p;p = (int *)malloc(10*sizeof(int));
Alocação Estática X Dinâmica
Alocação estática de vetor: é necessário saber de antemão a dimensão máxima
do vetor variável que representa o vetor armazena o endereço
ocupado pelo primeiro elemento do vetor vetor declarado dentro do corpo de uma função não
pode ser usado fora do corpo da função#define N 10int v[10]
Alocação Estática X Dinâmica
Alocação dinâmica de vetor: dimensão do vetor pode ser definida em tempo de execução variável do tipo ponteiro recebe o valor do endereço do
primeiro elemento do vetor área de memória ocupada pelo vetor permanece válida até
que seja explicitamente liberada (através da função free) vetor alocado dentro do corpo de uma função pode ser usado fora
do corpo da função, enquanto estiver alocadoint *v;‾v = (int*)malloc(N * sizeof(int));
Função realloc
Permite realocar um vetor preservando o conteúdo dos elementos, que permanecem válidos após a realocação
Exemplo: m representa a nova dimensão do vetor v = (int *)realloc (v, m*sizeof(int));
Observação
As seguintes notações são equivalentes: variavel[indice] equivale a *(variavel+indice) variavel[0] equivale a *variavel &variavel[indice] equivale a (variavel+indice )
Observação
Ponteiros, vetores e matrizes são muito relacionados em C
Vetores são ponteiros char nome[30] nome sozinho é um ponteiro para caracter, que
aponta para a primeira posição do nome
Matrizes de ponteiros
Ponteiros podem ser declarados como vetores ou matrizes multidimensionais
int *vetor[30]; //vetor de 30 ponteiros para inteirosint a =1, b=2, c=3;vetor[0] = &a; //vetor[0] aponta para avetor[1] = &b;vetor[2] = &c;// imprime a:1, b:2printf(‴a:%i, b:%i‵ ,*vetor[0], *vetor[1] );
Matrizes de ponteiros
Manipulação de string:char *mensagem[] =
‴arquivo não encontrado‵ ,‴erro de leitura‵ ,‴erro de escrita‵ ,‴impossivel criar arquivo‵ };
void escreveMensagemDeErro(int num){printf(‴%s\n‵ , mensagem[num]);
}main(){
escreveMensagemDeErro(3);
}
Matrizes de ponteiros
Importante: Quando alocamos um vetor de ponteiros para
inteiros, não necessariamente estamos alocando espaço de memória para armazenar os valores inteiros!