Baixe o app para aproveitar ainda mais
Prévia do material em texto
08/03/2021 1 ESTRUTURA DE DADOS EM C Aula 03 – Alocação dinâmica de Memória. Operações básicas. Prof. Ronaldo Candido ronaldo.candido@estacio.br 2021.1 AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Conteúdo Programático 1. Alocação dinâmica de memória. 2. Vantagens e desvantagens da alocação dinâmica x estática. 3. Alocação estática. 4. Alocação dinâmica. 5. Reservando espaços de memória. 6. Atividade verificadora de aprendizagem. Objetivos da aula • Entender como ocorre a alocação dinâmica de memória e sua diferença em relação à alocação estática, além de aplicar os recursos oferecidos por ponteiros para manipular a área de memória e os dados de forma mais precisa. 1 2 08/03/2021 2 AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Situação-Problema • Imagine a necessidade de criar uma lista com todo o catálogo de medicamentos de um laboratório. Sabendo que o catálogo contém n produtos, criamos uma lista com n posições para inserir os produtos. Mas se forem criados novos produtos ? Como uma solução, pode ser criada uma lista bem grande, que acomodaria novos produtos, mas com isso desperdiçamos memória. Como poderia ser criada uma lista que conseguiria receber novos produtos, mas sem desperdiçar espaço de memória ? AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido • Assistir previamente o vídeo "Alocação Dinâmica - Parte 1 - Introdução". Disponível em: <https://www.youtube.com/watch?v=ErOmueylikM> Acesso em 8 Mar. 2021. • Usar o DEV-C++ ou editor de código equivalente para implementar os exemplos e exercícios. • Realizar as atividades autônomas Aura. • Expandir seus conhecimentos sobre o assunto em Aprenda+ e Referências. Roteiro da aula É de fundamental importância o aluno realizar o estudo prévio dessas atividades !!! 3 4 08/03/2021 3 AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Alocação dinâmica de memória • A utilização de memória por parte do programador não é um conceito novo, sendo que linguagens de nível mais baixo, como linguagens de máquina utilizam alocação de memória o tempo todo. Exemplo em Linguagem Assembly : ADD A, @RI ; //(mnemônico (Intel 80C51) que executa a soma do conteúdo da RAM interna apontada por RI ao Acumulador). • O uso de alocação dinâmica aumenta a eficiência em certas rotinas embora aumente o gasto de processamento. • Os programas são alocados ESTATICAMENTE na compilação e DINAMICAMENTE durante a execução. • A alocação dinâmica é feita através de operações de alocação, realocação e liberação de memória. AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Vantagens e desvantagens da alocação dinâmica x estática • Alocação estática : Vantagem – Processamento mais leve. Array. Desvantagem - Desperdício de memória. • Alocação dinâmica : Vantagem – Diminuir/aumentar memória em execução. Ponteiro. Desvantagem - Gasto de processamento. 5 6 08/03/2021 4 AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Alocação Estática • Implementação simples: vetores (array). • vantagem: acesso indexado (vi)- todos os elementos da estrutura são igualmente acessíveis. • desvantagens: tamanho fixo: #define maxTam 1000 tempo de compilação. alocados em memória de forma estática. #define maxTam 1000 struct rgCliente { char nome[40]; char sexo; int idade; }; struct rgCliente Cliente[maxTam]; AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Alocação Dinâmica • Implementação eficiente: Ponteiros. • vantagens: tamanho variável. tempo de execução. alocados em memória de forma dinâmica. • desvantagem, ou restrição: capacidade da memória, acesso não-sequencial. struct rgCliente { char nome[40]; char sexo; int idade; }; struct rgCliente *ptCliente; 7 8 08/03/2021 5 AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Reservando espaços de memória • O padrão C ANSI define apenas 4 funções para o sistema de alocação dinâmica, disponíveis na biblioteca stdlib.h: malloc calloc realloc free • Usamos também a função sizeof() para saber a quantidade de bytes alocada: int a = 10 ; printf(“%d”, sizeof(a)) ; //exibirá 4 • Podemos também usar um “modelador” de tipos (cast) quando desejamos mudar o tipo do valor: float valor ; valor = (float) a / 3; printf("\n%f",valor) ; //exibirá 3.3333333 ao invés de 3.000000 sem o cast AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Função malloc() • Serve para alocar memória e tem o seguinte protótipo: void *malloc (unsigned int num); • A função pega o número de bytes que queremos alocar (num), aloca na memória e retorna um ponteiro void* para o primeiro byte alocado. #include <stdio.h> #include <stdlib.h> int main (void) { int *p, a; /* Determina o valor de a em algum lugar */ p = (int *)malloc(a*sizeof(int)); if (!p) { printf ("** Erro: Memoria Insuficiente**"); exit(1); } return 0; } A função calloc() tem um protótipo diferente e inicializa o espaço alocado com 0. Realloc() modifica o espaço anteriormente reservado. 9 10 08/03/2021 6 AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Liberando a memória reservada • Quando alocamos memória dinamicamente é necessário que a liberemos quando ela não for mais necessária. • Para isto existe a função free() cujo protótipo é: void free (void *p); #include <stdio.h> #include <stdlib.h> int main (void) { int *p, a; p = (int *)malloc(a*sizeof(int)); if (!p) { printf ("** Erro: Memoria Insuficiente**"); exit(1); } ... free(p) ; /* Libera da memória os bytes do ponteiro */ return 0; } AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido //EDA_Aula03_Exemplo02 #include <stdio.h> #include <stdlib.h> int main() { char *c= NULL; /* o ponteiro para o espaço alocado */ /* alocar um único byte na memória */ c = (char *)malloc(1); /* ver se conseguiu alocar */ if (!c) { printf("Não conseguiu alocar a memória\n"); exit(1); } /* carregar um valor na região de memória alocada */ *c = 'd'; printf("%c\n",*c); /* escrever este valor */ free(c); /* liberar a memória alocada */ } 11 12 08/03/2021 7 AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Atividade Verificadora de Aprendizagem 1. Citar quais os ganhos em utilizar a alocação dinâmica em relação ao uso de arrays. Demonstrar em um código em C o uso das funções sizeof e cast, indicando qual a quantidade de memória deverá ser alocada, no caso de sizeof, e qual o tipo que deverá ser utilizado a partir do cast (usar a struct rgCliente, por exemplo). 2. Acessar <https://www.menti.com/o18vakfuvy> e responder a questão. AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Aprenda + • Assistir o vídeo "Alocação Dinâmica - Parte 1 - Introdução". Disponível em: <https://www.youtube.com/watch?v=ErOmueylikM> Acesso em 8 Mar. 2021. • Assistir o vídeo "Programar em C - Operador sizeof()". Disponível em: <https://www.youtube.com/watch?v=FD0bi4H08IU> Acesso em 8 Mar. 2021. • Atividade Autônoma Aura: 1) A alocação de memória é dividida em partes. Qual decisão da alocação é tomada quando o programa é compilado ? a) Alocação Dinâmica. b) Alocação Estática. c) Alocação Híbrida. d) Alocação Local. e) Em todas as partes. 13 14 08/03/2021 8 AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido Aprenda + (continuação) 2) Em relação ao conceitos e operadores usados em alocação estática e dinâmica, assinale a afirmação correta: a) Alocação dinâmica permite aumentar a quantidade de memória alocada, mas não permite a redução. b) Para alocar memória dinamicamente, é necessário antes, separar o espaço de memória que será disponibilizado para o recurso. c) Alocação estática permite apenas o uso de arrays para interagir com a memória. d) Alocação dinâmica poupa memória embora gere maior gasto de processamento. e) Função sizeof determina o número de bits para um determinado tipo de dados. AULA 03 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido 1. KOFFMAN, E.B., Wolfgang, P.A.T. Objetos, Abstração, Estrutura de dados e Projeto usando C++. 1ª Ed.. Rio deJaneiro: LTC, 2008. R.5 Objetos, Ponteiros e Referência. Disponível em: <https://integrada.minhabiblioteca.com.br/#/books/978-85-216-2780- 7/cfi/6/16!/4/432/2@0:96.2> Acesso em 1 Mar. 2021. 2. BALIEIRO, Ricardo. Estrutura de dados. Rio de Janeiro: Universidade Estácio de Sá, 2015. Cap. 4. Disponível em: <http://repositorio.novatech.net.br/site/index.html#/objeto/detalhes/2D35A184- BF64-4419-9DA9-D1ED12A97017> Acesso em 22 Fev. 2021. 3. Alocação Dinâmica em C. Disponível em: <http://linguagemc.com.br/alocacaodinamica-de-memoria-em-c/> Acesso em 8 Mar. 2021. 4. Alocação Dinâmica. Disponível em: <https://www.ic.unicamp.br/~norton/disciplinas/mc1022s2005/03_11.html> Acesso em 8 Mar. 2021. Referências 15 16 08/03/2021 9 ESTRUTURA DE DADOS EM C Prof. Ronaldo Candido ronaldo.candido@estacio.br Dúvidas, sugestões ou análises ??? 17
Compartilhar