Algoritmos e Lógica de Programação Linguagem C Alocação Dinâmica i de Memória Reinaldo Gomes reinaldo@cefet-al.br Alocação Dinâmica Quando declaramos uma variável ou um arranjo, o compilador automaticamente aloca memória para armazená-los. Alocação estática (variáveis globais) Alocação dinâmica implícita (variáveis locais) Essa não é a única forma de se manter objetos na memória: Pode-se obter espaço de memória em tempo de execução (alocação dinâmica explícita) a partir da função malloc() da biblioteca C. Essa memória pode ser liberada tão logo não seja mais necessária: função free()
Alocação Dinâmica Definição: Recurso que permite alocar memória para variáveis em tempo de execução. Benefícios Definição de vetores e matrizes, de tamanho variável, cujo tamanho é descoberto em tempo de execução Existem quatro funções, padronizadas, da biblioteca <stdlib.h>, para manipulação de alocação de memória: malloc() calloc() free() realloc(); 3 Alocação Dinâmica Programas com alocação dinâmica são mais versáteis: só utilizam a memória quando necessário se adaptam aos recursos disponíveis Uso de apontadores Recebem endereço inicial da área de memória alocada As operações de acesso e alteração dos dados alocados dinamicamente é feito a partir dos apontadores O apontador será utilizado também quando se for fazer a liberação da área de memória alocada Biblioteca: <stdlib.h> ou <alloc.h> 4
malloc() Propósito: Essa função aloca um bloco de bytes (num) e retorna um ponteiro para void para o primeiro byte, que pode ser atribuído a qualquer tipo de ponteiro; void* malloc(unsigned int num) Parâmetro num tamanho em bytes a ser alocado Retorno void* apontador para qualquer tipo de ponteiro 5 malloc() Considerações Se não houver memória suficiente para alocar a memória requisitada, a função malloc() retorna um ponteiro pra NULL Ao alocar memória, verifique se realmente foi alocada, para isso compare com NULL Utilização: int *varint; if ((varint=(int*)malloc(sizeof(int)))== NULL){ printf( Erro na alocacao de memoria ); exit(1); } 6
malloc() Observação Ao alocar memória dinamicamente para uma struct, não some os valores dos seus membros e sim use o operador sizeof para descobrir o tamanho da estrutura; typedef struct { char nome[20]; int matricula; } funcionario; funcionario *emp; emp=(funcionario*) malloc(sizeof(funcionario)); Se não for mais precisar, libere a memória anteriormente alocada 7 free() Características Essa função libera uma área de memória previamente alocada; Tabela de Alocação Interna: Guardao número de bytes anteriormente alocados. void free(void *pointer) O uso de um apontador inválido pode derrubar o sistema!!!! Uso int *pt = (int*)malloc(sizeof(int)); *pt = 1500; free(pt); 8
malloc() e free() Um exemplo completo: #include <stdio.h> #include <stdlib.h> main() { float *pt; } pt = (float*)malloc(sizeof(float)); if (pt == NULL) { printf("erro de alocação\n"); exit(1); } *pt = 10.0; printf( Salario: %4.1f", *pt); free(pt); 9 Outras funções calloc() Aloca uma quantidade de memória igual a nvezes * tam (bloco de bytes), retornando um ponteiro para void para o primeiro byte, que pode ser atribuído a qualquer tipo de ponteiro void* calloc(size_t nvezes, size_t tam) Observação: Teste o retorno da alocação para ver se houve sucesso! 10
Outras funções Exercício 01 e Exercício 02 Faça um programa que aloque um vetor, dinamicamente, de tamanho n. Em seguida, faça a leitura dos n elementos e imprima todos os valores lidos. Obs: O exercício 1 manipula o vetor dinâmico como vetor O exercício 2 manipula o vetor dinâmico com um apontador 11 Outras funções realloc() Modifica o tamanho de memória previamente alocado, especificado por um ponteiro, para uma nova quantidade especificada void* realloc(void *pt, size_t novo_tam) Observações: * Se pt == NULL, alocanovo_tam bytes *Senovo_tam é igual a zero, a memória apontada por pt é liberada! 12