Baixe o app para aproveitar ainda mais
Prévia do material em texto
Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação dinâmica de memória Prof. DSc. Newton Spolaôr Disciplina Computação I Bacharelado em Ciência da Computação Universidade Estadual do Oeste do Paraná (UNIOESTE) Brasil 10/11/2016 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Sumário 1 Considerações iniciais 2 Alocação dinâmica de memória 3 Exercícios 4 Considerações finais Newton Spolaôr Alocação dinâmica de memória 2 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Aula anterior em um olhar Considerações iniciais Objetivo geral desta aula Aula anterior em um olhar Arquivos oferecem uma maneira de armazenar dados no computador de modo persistente Diferentes funções na linguagem C são disponibilizadas para trabalhar com esses arquivos Na aula de hoje, serão apresentadas noções sobre o conceito de alocação dinâmica de memória Newton Spolaôr Alocação dinâmica de memória 3 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Aula anterior em um olhar Considerações iniciais Objetivo geral desta aula Aula anterior em um olhar Arquivos oferecem uma maneira de armazenar dados no computador de modo persistente Diferentes funções na linguagem C são disponibilizadas para trabalhar com esses arquivos Na aula de hoje, serão apresentadas noções sobre o conceito de alocação dinâmica de memória Newton Spolaôr Alocação dinâmica de memória 3 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Aula anterior em um olhar Considerações iniciais Objetivo geral desta aula Fotografia do uso da memória [1] Newton Spolaôr Alocação dinâmica de memória 4 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Aula anterior em um olhar Considerações iniciais Objetivo geral desta aula Alocação estática vs dinâmica [1, 2] Alocação estática O espaço para as variáveis é reservado e liberado automaticamente pelo compilador/interpretador O tempo de vida é distinto para variáveis globais (durante execução do programa) e locais (durante execução de função) int b; Alocação dinâmica O espaço para as variáveis é reservado e liberado dinamicamente pelo programador A variável “vive” até ser desalocada explicitamente (ou até o programa terminar) int *a = (int *) malloc ( sizeof (int)); Newton Spolaôr Alocação dinâmica de memória 5 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Aula anterior em um olhar Considerações iniciais Objetivo geral desta aula Algumas características da alocação dinâmica [3] Vantagens Flexibilidade: quantidade de memória a ser alocada pode ser estabelecida em tempo de execução Eficiência Somente a quantidade necessária de memória precisa ser alocada Por outro lado, a alocação estática reserva quantidade fixa de memória em tempo de compilação que, eventualmente, é maior do que a memória necessária Desvantagem: programador necessita lembrar de liberar toda a memória utilizada — algumas linguagens de programação, como Java, livram o programador dessa preocupação Newton Spolaôr Alocação dinâmica de memória 6 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Aula anterior em um olhar Considerações iniciais Objetivo geral desta aula Algumas características da alocação dinâmica [3] Vantagens Flexibilidade: quantidade de memória a ser alocada pode ser estabelecida em tempo de execução Eficiência Somente a quantidade necessária de memória precisa ser alocada Por outro lado, a alocação estática reserva quantidade fixa de memória em tempo de compilação que, eventualmente, é maior do que a memória necessária Desvantagem: programador necessita lembrar de liberar toda a memória utilizada — algumas linguagens de programação, como Java, livram o programador dessa preocupação Newton Spolaôr Alocação dinâmica de memória 6 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Aula anterior em um olhar Considerações iniciais Objetivo geral desta aula Objetivo geral desta aula Apresentar noções sobre o conceito de alocação dinâmica de memória Newton Spolaôr Alocação dinâmica de memória 7 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Sumário 1 Considerações iniciais 2 Alocação dinâmica de memória 3 Exercícios 4 Considerações finais Newton Spolaôr Alocação dinâmica de memória 8 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Tempo de vida das variáveis estáticas [1] #include <stdio.h> void quad(int n) { n = n * n; printf ("n = %d\n", n); } int main () { int k; scanf ("%d", &k); if(k > 10) { int x = 10; quad(x); } else quad(k); printf ("k = %d\n", k); system("pause"); return 0; } Newton Spolaôr Alocação dinâmica de memória 9 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Tempo de vida das variáveis estáticas [1] Por quanto tempo a variável n, alocada estaticamente, é necessária? E a variável x? Vide demonstração na linguagem C na IDE Netbeans Como demonstrado, o próprio compilador desaloca as variáveis alocadas estaticamente quando deixam de ser necessárias Newton Spolaôr Alocação dinâmica de memória 10 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Tempo de vida das variáveis estáticas [1] Por quanto tempo a variável n, alocada estaticamente, é necessária? E a variável x? Vide demonstração na linguagem C na IDE Netbeans Como demonstrado, o próprio compilador desaloca as variáveis alocadas estaticamente quando deixam de ser necessárias Newton Spolaôr Alocação dinâmica de memória 10 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Tempo de vida das variáveis estáticas [1] Por quanto tempo a variável n, alocada estaticamente, é necessária? E a variável x? Vide demonstração na linguagem C na IDE Netbeans Como demonstrado, o próprio compilador desaloca as variáveis alocadas estaticamente quando deixam de ser necessárias Newton Spolaôr Alocação dinâmica de memória 10 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Tempo de vida das variáveis estáticas [1] Por quanto tempo a variável n, alocada estaticamente, é necessária? E a variável x? Vide demonstração na linguagem C na IDE Netbeans Como demonstrado, o próprio compilador desaloca as variáveis alocadas estaticamente quando deixam de ser necessárias Newton Spolaôr Alocação dinâmica de memória 10 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Conceitos relacionados a alocação dinâmica [1] Ponteiro Uma variável é alocada dinamicamente por meio de um ponteiro ou apontador (pointer ) Basicamente, um ponteiro armazena o endereço (posição) de memória de uma variável Memória heap A memória alocada dinamicamente faz parte de uma área da memória chamada heap Um programa pode alocare desalocar porções de memória do heap durante a sua execução Newton Spolaôr Alocação dinâmica de memória 11 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Liberação de memória [1] A memória deve ser liberada após o término de seu uso Este trabalho deve ser feito por quem fez a alocação Alocação estática: compilador Alocação dinâmica: programador Obs.: a alocação dinâmica necessita de rotinas da biblioteca stdlib.h Newton Spolaôr Alocação dinâmica de memória 12 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Declaração de variável: Tipo *p; vs Tipo x; Alocação de memória (apenas dinâmica): p = (Tipo*) malloc(sizeof(Tipo)); Liberação de memória (apenas dinâmica): free(p); Conteúdo da variável: *p; vs x; Referência à variável, i.e., seu endereço de memória: p; vs &x; Anulação de ponteiro (apenas dinâmica): p = NULL; Newton Spolaôr Alocação dinâmica de memória 13 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Declaração de variável: Tipo *p; vs Tipo x; Alocação de memória (apenas dinâmica): p = (Tipo*) malloc(sizeof(Tipo)); Liberação de memória (apenas dinâmica): free(p); Conteúdo da variável: *p; vs x; Referência à variável, i.e., seu endereço de memória: p; vs &x; Anulação de ponteiro (apenas dinâmica): p = NULL; Newton Spolaôr Alocação dinâmica de memória 13 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Declaração de variável: Tipo *p; vs Tipo x; Alocação de memória (apenas dinâmica): p = (Tipo*) malloc(sizeof(Tipo)); Liberação de memória (apenas dinâmica): free(p); Conteúdo da variável: *p; vs x; Referência à variável, i.e., seu endereço de memória: p; vs &x; Anulação de ponteiro (apenas dinâmica): p = NULL; Newton Spolaôr Alocação dinâmica de memória 13 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Declaração de variável: Tipo *p; vs Tipo x; Alocação de memória (apenas dinâmica): p = (Tipo*) malloc(sizeof(Tipo)); Liberação de memória (apenas dinâmica): free(p); Conteúdo da variável: *p; vs x; Referência à variável, i.e., seu endereço de memória: p; vs &x; Anulação de ponteiro (apenas dinâmica): p = NULL; Newton Spolaôr Alocação dinâmica de memória 13 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Declaração de variável: Tipo *p; vs Tipo x; Alocação de memória (apenas dinâmica): p = (Tipo*) malloc(sizeof(Tipo)); Liberação de memória (apenas dinâmica): free(p); Conteúdo da variável: *p; vs x; Referência à variável, i.e., seu endereço de memória: p; vs &x; Anulação de ponteiro (apenas dinâmica): p = NULL; Newton Spolaôr Alocação dinâmica de memória 13 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Declaração de variável: Tipo *p; vs Tipo x; Alocação de memória (apenas dinâmica): p = (Tipo*) malloc(sizeof(Tipo)); Liberação de memória (apenas dinâmica): free(p); Conteúdo da variável: *p; vs x; Referência à variável, i.e., seu endereço de memória: p; vs &x; Anulação de ponteiro (apenas dinâmica): p = NULL; Newton Spolaôr Alocação dinâmica de memória 13 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Nota sobre função malloc [2] A função malloc é usada para alocar espaço para armazenarmos valores de qualquer tipo Por este motivo, malloc retorna um ponteiro genérico, para um tipo qualquer, representado por void*, o qual pode ser convertido para outro tipo desejado É comum fazermos a conversão explicitamente, utilizando o operador de molde de tipo (cast) int n; scanf("%d",&n); v = (int *) malloc(n*sizeof(int)); //aloca dinamicamente vetor de n elementos int Newton Spolaôr Alocação dinâmica de memória 14 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Figura: Ao executar a linha 1, as variáveis a e b estarão em um espaço de endereçamento estático, e seu valor será aquele anteriormente armazenado na memória Newton Spolaôr Alocação dinâmica de memória 15 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Figura: Ao executar as linhas 4 e 5: (1) o conteúdo de b passa a ser 10 e (2) a apontará para um endereço do espaço dinâmico, que conterá o valor armazenado anteriormente na memória (lixo, nesse caso) Newton Spolaôr Alocação dinâmica de memória 16 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Figura: Ao executar a linha 6, o endereço para onde a aponta passa a armazenar o valor 20 Newton Spolaôr Alocação dinâmica de memória 17 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Figura: Contudo, ao executar a linha 7, a passa a apontar para b. Como resultado, no momento ninguém referencia o endereço apontado anteriormente por a Newton Spolaôr Alocação dinâmica de memória 18 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Figura: O uso da função free na linha 8 está incorreto. O objetivo seria liberar a memória que foi inicialmente alocada para a. No entanto, a não aponta mais para este endereço de memória. Além disso, free não está desalocando memória alocada dinamicamente Newton Spolaôr Alocação dinâmica de memória 19 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Código de alocação dinâmica vs estática [1] Figura: Para corrigir este problema, as linhas 7 e 8 deveriam ser invertidas. Primeiro a memória alocada dinamicamente é desalocada e depois a passa a apontar para b. Veja que a memória dinâmica anteriormente apontada por a foi liberada Newton Spolaôr Alocação dinâmica de memória 20 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Erros comuns [1] Esquecer de alocar memória e tentar acessar o conteúdo de variável alocada dinamicamente Copiar o valor do ponteiro ao invés do valor da memóriaapontada pelo ponteiro Esquecer de desalocar memória A memória será desalocada apenas no encerramento do programa, o que pode ser um grande problema em loops Ocasiona desperdício de memória, o que eventualmente causará erro de execução no programa Tentar acessar o conteúdo da variável após desalocá-la Desafio: ilustrar cada um desses erros em C Newton Spolaôr Alocação dinâmica de memória 21 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Erros comuns [1] Esquecer de alocar memória e tentar acessar o conteúdo de variável alocada dinamicamente Copiar o valor do ponteiro ao invés do valor da memória apontada pelo ponteiro Esquecer de desalocar memória A memória será desalocada apenas no encerramento do programa, o que pode ser um grande problema em loops Ocasiona desperdício de memória, o que eventualmente causará erro de execução no programa Tentar acessar o conteúdo da variável após desalocá-la Desafio: ilustrar cada um desses erros em C Newton Spolaôr Alocação dinâmica de memória 21 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros e vetores [1] Em C, um vetor é implementado como um ponteiro para o primeiro elemento de uma sequência Logo, um ponteiro pode ser usado para acessar um vetor (outro ponteiro) Como a e b poderiam ser representados na memória? Newton Spolaôr Alocação dinâmica de memória 22 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros e vetores [1] Em C, um vetor é implementado como um ponteiro para o primeiro elemento de uma sequência Logo, um ponteiro pode ser usado para acessar um vetor (outro ponteiro) Como a e b poderiam ser representados na memória? Newton Spolaôr Alocação dinâmica de memória 22 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros e vetores [1] Em C, um vetor é implementado como um ponteiro para o primeiro elemento de uma sequência Logo, um ponteiro pode ser usado para acessar um vetor (outro ponteiro) Por que lixo é impresso na subfigura da direita? Newton Spolaôr Alocação dinâmica de memória 23 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros e vetores [1] Em C, um vetor é implementado como um ponteiro para o primeiro elemento de uma sequência Logo, um ponteiro pode ser usado para acessar um vetor (outro ponteiro) Por que lixo é impresso na subfigura da direita? Newton Spolaôr Alocação dinâmica de memória 23 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros para struct [1] Newton Spolaôr Alocação dinâmica de memória 24 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros e funções [1] Existe algum erro nesse código? Newton Spolaôr Alocação dinâmica de memória 25 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros e funções [1] Sim! Alocamos memória para uma cópia de a, não para a Newton Spolaôr Alocação dinâmica de memória 26 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros e funções [1] Solução 1: retornar o ponteiro em questão Newton Spolaôr Alocação dinâmica de memória 27 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros e funções [1] Solução 2: passar o ponteiro por referência Newton Spolaôr Alocação dinâmica de memória 28 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Ponteiros e funções [1] Naturalmente, é possível passar por referência ponteiros para tipos mais simples, como ilustrado a seguir #include <stdio.h> #include <stdlib.h> void novoInt(int ** p){ (*p) = (int*) malloc (sizeof(int)); **p=30; } int main(){ int *x; novoInt(&x); printf("%d",*x); free(x); return 0; } Newton Spolaôr Alocação dinâmica de memória 29 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Sumário 1 Considerações iniciais 2 Alocação dinâmica de memória 3 Exercícios 4 Considerações finais Newton Spolaôr Alocação dinâmica de memória 30 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Exercício 1 [2] Escreva um programa em linguagem C que solicita ao usuário a quantidade de alunos de uma turma e aloca um vetor de notas (números reais) referentes a uma prova, sendo uma nota por aluno Após, leia cada nota a partir do teclado Em seguida, imprima a média aritmética das notas Não deve ocorrer desperdício de memória; e após ser utilizada a memória deve ser liberada Newton Spolaôr Alocação dinâmica de memória 31 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Exercício 2 Estenda o exercício anterior para substituir o vetor de notas por um vetor de registro (struct aluno), em que cada aluno possui os seguintes campos Nome completo (tipo string) Data de matrícula (tipo struct data) Nota em uma prova específica (tipo double) Além da nota, cada campo adicional de um aluno deve ser lido a partir do teclado Em seguida, imprima a nota média, bem como o nome e data de matrícula de todos os alunos com nota maior que a nota média Newton Spolaôr Alocação dinâmica de memória 32 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Exercício 3 [2] Crie uma função que aloca e lê um vetor de n inteiros Crie outra função que recebe o vetor e retorna o maior e o menor valor O programa principal deve executar as duas funções, imprimir os valores retornados pela 2a função e liberar a memória alocada pela 1a função Newton Spolaôr Alocação dinâmica de memória 33 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Exercício 4 Especifique uma struct para armazenar os seguintes dados de uma empresa: cnpj, razão social, nome fantasia, número de funcionários e capital social A partir dessa estrutura de dados, especifique três operações (funções) para realizar as seguintes tarefas 1 Alocação dinâmica da estrutura, com preenchimento de seus campos a partir de dados lidos do teclado 2 Impressão de todos os dados da estrutura 3 Desalocação da estrutura O programa principal deve conter uma variável ponteiro para a estrutura e as chamadas às 3 funções Passe o parâmetro referente à struct por referência para que seu código se aproxime um pouco mais de uma classe Newton Spolaôr Alocação dinâmica de memória 34 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Considerações finais 1 Considerações iniciais 2 Alocação dinâmica de memória 3 Exercícios 4 Considerações finais Newton Spolaôr Alocação dinâmica de memória35 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Considerações finais Nesta aula foram apresentadas noções sobre o conceito de alocação dinâmica de memória Esse conceito é base para lidar com estruturas sofisticadas de computação análogas a elementos do mundo real, como pilhas, filas e árvores Newton Spolaôr Alocação dinâmica de memória 36 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Contato newtonsp.cesufoz@gmail.com Newton Spolaôr Alocação dinâmica de memória 37 Considerações iniciais Alocação dinâmica de memória Exercícios Considerações finais Referências bibliográficas [1] Fortes R. Recursividade; 2014. Notas didáticas. http://www.decom.ufop.br/reinaldo/disciplinas/bcc202-2014- 01/plano-de-aulas/. [2] Wolf DF. Algoritmos; 2014. Notas didáticas. http://wiki.icmc.usp.br/index.php/Scc-101. [3] Villas MV, Ferreira AGDM, Leroy PG, Bockman CL. Estruturas de Dados. Conceitos e Técnicas de Implementação. 4th ed. Campus; 1993. Newton Spolaôr Alocação dinâmica de memória 38 Considerações iniciais Aula anterior em um olhar Considerações iniciais Objetivo geral desta aula Alocação dinâmica de memória Alocação estática Alocação dinâmica Conceitos adicionais sobre ponteiros Exercícios Considerações finais
Compartilhar