INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica.

Slides:



Advertisements
Apresentações semelhantes
Programação II Estruturas de Dados
Advertisements

Alocação Dinâmida de Memória
Algoritmos e Estrutura de Dados I
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Alocação Dinâmica de Memória
LPG - I: Alocação Dinâmica de Memória - Ponteiros
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Linguagem C Strings.
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Slides: Prof. João Fabro UTFPR - Curitiba
Fundamentos de Programação 1
VETORES, STRINGS E MATRIZES
Escola Secundária c/ 3º CEB da Batalha
Listas Encadeadas.
Revisão da Linguagem C.
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
exercícios listas encadeadas
Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba
Alocação Dinâmica de Memória Professor Mário Dantas
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
PROGRAMAÇÃO ESTRUTURADA II
Linguagem de Programação II Parte VII
Linguagem de Programação II Parte IX
Ordenação e Pesquisa de Dados Marco Antonio Montebello Júnior
CADEIA DE CARACTERES (Strings)
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Alocação Dinâmica de Memória
Prof. Ricardo Santos PONTEIROS
Vetor Prof. Guilherme Baião S. Silva Adaptações:
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática Disciplina: Estrutura de Dados Professor: Cheli dos S. Mendes da Costa Listas.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Aula P.02 – BCC202 Revisão sobre Ponteiros Túlio Toffolo
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Algoritmos e Estruturas de Dados
Estruturas de Dados Aula 6: Cadeias de Caracteres
STRINGS Dilvan Moreira (baseado no livro Big Java e Z. Liang)
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Prof. Alessandro Gonçalves
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 1 Estruturas de Dados - T.332 Capítulo 3 Parte 1: Ponteiros, Passagem.
Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória.
Programação Computacional Aula 8: Entrada e Saída pelo Console Prof a. Madeleine Medrano
Leandro Almeida  As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa.
Ponteiros em C Prof. Kariston Pereira
Linguaguem de Programação II
Estrutura de Dados Revisão Professor Luiz José Hoffmann Filho
Estruturas Homogêneas – Vetores e Matrizes
Linguaguem de Programação II
Profa. Maria Augusta Constante Puget
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Linguagem de Programação
COMPILADORES 07 Prof. Marcos.
Programação em C Aula 9.
INE5408 Estruturas de Dados Listas Encadeadas Simples.
PCI- Vetores Profa. Mercedes Gonzales Márquez. Aula 5 - VetoresAlgoritmos e Estruturas de Dados I Sequência de valores todos do mesmo tipo Nome único.
Tipo Abstrato de Dados (TAD) Estrutura de Dados Professor: Rodrigo Alves Sarmento Professor: André Cypriano.
ponteiros Estrutura de Dados Prof. André Cypriano M. Costa
Estrutura de Dados Prof. André Cypriano M. Costa
Aula Prática 6 Ponteiros Monitoria  Quando declaramos uma matriz:  tipo meuArray[tam];  O compilador aloca a matriz em uma região de memória.
INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von WangenheimPágina 1 Estruturas de Dados - T.332 Capítulo 4.1 Tipos Abstratos de Dados.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
INE5408 Estruturas de Dados Passagem por Referência.
1 Aula 07 Strings Prof. Filipe Mutz. 2 Em nossos programas ainda não vimos como armazenar palavras e textos, e eles são muito importantes! Exemplos: Programas.
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
INE5408 Estruturas de Dados Alocação Dinâmica de Memória.
INE5408 Estruturas de Dados
Transcrição da apresentação:

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página As Funções de Alocação Dinâmica de Memória em "C" n Já visto até agora: u Constantes são "codificadas" dentro do código objeto de um programa em tempo de compilação. u Variáveis globais (estáticas) têm a sua alocação codificada em tempo de compilação e são alocadas logo que um programa inicia a execução. u Variáveis locais em funções (ou métodos) são alocadas através da requisição de espaço na pilha (stack). Alocação Dinâmica é um meio pelo qual o programa pode obter memória enquanto está em execução.

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 3 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}abab "Essa aula é... "Será mesmo.. "Essa aula é... "Será mesmo.. Sist.Operacional HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 4 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 5 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes &main-#3 localA localB

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 6 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes &main-#3 localA localB

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 7 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes &main-#3localAlocalB &func_B-#2local1local2

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 8 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes &main-#3localAlocalB &func_B-#2local1local2

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 9 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes &main-#3 localA localB

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 10 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes &main-#3localAlocalB &func_B-#3local1local2

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 11 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes &main-#3localAlocalB &func_B-#2local1local2

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 12 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes &main-#3 localA localB

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 13 n Programa: #include #include char *a = "Essa aula é legal”; char *b = "Será mesmo?"; int func_A () { int local1, local2; int local1, local2; } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () {func_B();}Sist.Operacional "Essa aula é... "Será mesmo ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 14 Alocação Dinâmica em "C" n A memória alocada pelas funções de alocação dinâmica é obtida do heap. u O heap é a região de memória livre que se encontra entre o programa (com a área de armazenamento permanente) e a pilha (stack). u O tamanho do heap é, a princípio, desconhecido do programa. n "C" possui duas funções básicas para gerência de memória:  malloc(nº de bytes) - aloca memória.  free(endereço) - libera memória

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 15 Função malloc: Protótipo: void *malloc(size_t número_de_bytes); Protótipo: void *malloc(size_t número_de_bytes); Detalhes : Detalhes :  Devolve um ponteiro do tipo void (sem tipo) para o início da área de memória alocada. u Isto significa que o valor deste ponteiro pode ser atribuído a qualquer variável do tipo ponteiro.  número_de_bytes é a quantidade de bytes a ser alocada.  Se a memória for alocada no topo do heap, o heapPointer é atualizado (incrementado de número_de_bytes ).  O tipo size_t é definido em stdlib.h que deve ser sempre incluído no início de um programa usando alocação dinâmica.

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 16 n Exemplo: #include #include char *p; int *q; main () { p = malloc(1000); // Aloca 1000 // Aloca 1000 // bytes de RAM // bytes de RAM q = malloc(50*sizeof(int)); // Aloca espaço // Aloca espaço // para 50 inteiros. // para 50 inteiros.}Sist.Operacional pq HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes 1000 bytes 50*int = 200 bytes

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 17 n malloc devolve: u um ponteiro para a área alocada u o ponteiro nulo (NULL) caso não seja possível alocar a memória requisitada. n Convém verificar se foi pos- sível alocar a memória: #include #include char *p; main () { p = malloc(1000) // Tenta alocar 1000 // Tenta alocar 1000 // bytes de RAM // bytes de RAM if (p == NULL) // Testa se p // Testa se p // diferente de 0 // diferente de 0 printf("Sem memória."); }Sist.Operacional "Sem memória" p HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Variáveis estáticas Código objeto Constantes Já alocado antes Espaço de variáveis locais alocado

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 18 Função free: Protótipo: void free( void *p ); Protótipo: void free( void *p ); Detalhes : Detalhes : u Devolve memória previamente alocada ao sistema.  A memória devolvida é aquela que foi alocada com um ponteiro com o valor de p.  O valor de p deve obrigatoriamente ser um valor que foi alguma vez retornado por malloc(). è Não é possível alocar-se um vetor enorme e depois dealocar-se a parte dele que "sobrou".  A utilização de free () com um valor de ponteiro qualquer poder ter resultados catastróficos. u A gerência de buracos no heap é responsabilidade do sistema operacional.

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 19 Exercício (agora): Lista Ordenada com um vetor de ponteiros para Strings. n Uma lista ordenada pode conter Strings de qualquer comprimento < n Esta lista tem número de elementos máximo fixo = 100 e é implementada como um vetor de ponteiros para Strings. n Um novo String é lido primeiramente para dentro de uma variável auxiliar qualquer. Então é alocada memória para exatamente o seu tamanho e ele é copiado para esta área. Para copiar um String utilize strcopy. Então é alocada memória para exatamente o seu tamanho e ele é copiado para esta área. Para copiar um String utilize strcopy. n Por fim um lugar na lista é encontrado para ele, através da atualização dos valores dos ponteiros da lista. n Como critério de ordenação basta somente a primeira letra do String.

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 20 n Organização de memória do Exercício: Sist.Operacional HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Vetor de char* Código objeto Constantes str4str3str2str1 Espaço de variáveis locais alocado Var.Estáticas

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 21 n Para verificar o comprimento de um String: u Utilize a função strlen(). u Esta função devolve o comprimento (em caracteres imprimíveis) de um String.  Protótipo: int strlen(char *p); #include #include char p[90] = "Carro"; main () { printf("%i", strlen(p) ); } Imprime: 5.

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 22 n Para copiar um String:  Utilize a função strcpy (). u Esta função copia o conteúdo de um string (dado por um apontador) para a posição de memória dada por outro apontador.  Protótipo: char *strcpy(char *destino, *fonte); #include #include char p[90] = "Carro"; charlata[20]; main () { strcpy(lata, p) ); printf("s%", lata); } Imprime: Carro.

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 23 Exemplo: Para ler um String:  Utilize a função scanf(formato, char1*, …, charn*). u Esta função copia o conteúdo digitado ate um separador para o primeiro ponteiro, depois para outro e assim por diante.  Utilize a função gets(char*). u Esta função le uma linha inteira, inclusive virgulas, espaços e outros para a posição de memória apontada por char*. #include #include char linha[1000]; charestringue[20]; main () { scanf(“%s”, estringue); /* le até um espaço ou similar */ similar */ getchar(); /* limpa o enter */ gets(linha); /* lê tudo até o enter */ }

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 24 Detalhes: Lista Ordenada com um vetor de ponteiros para Strings. n Como você não sabe o comprimento do String que o usuário vai digitar, use primeiro uma variável auxiliar grande (10000 posições) para guardar o que foi digitado. n A lista deve ser passada como parâmetro para todas as funções que a utilizam. n Da mesma maneira as variáveis de controle da lista. n Todas as funções de lista ordenada implementadas anteriormente devem ser reimplementadas para utilizar estes Strings.

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 25 Headerfile: Como Garantir Inclusão Única /* Arquivo: pilha.h */ #ifndef EstruturaDaPilha #define EstruturaDaPilha #define EstruturaDaPilha /* Definir uma estrutura para a pilha */ /* Definir uma estrutura para a pilha */ struct estruturaDaPilha struct estruturaDaPilha { int topo; int topo; int dados[MaxPilha]; int dados[MaxPilha]; }; }; /* Def. um tipo que tem a estrutura da pilha. */ /* Def. um tipo que tem a estrutura da pilha. */ typedef struct estruturaDaPilha pilha; typedef struct estruturaDaPilha pilha;#endif

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 26 Headerfiles: Importante n A diretiva de compilação #ifndef (if not defined) diz que aquela área de código fonte entre o #ifndef e o #endif somente será levada em conta pelo compilador se o argumento de #ifndef ainda não houver sido definido na mesma sessão de compilação no escopo de um módulo. n Isso garante que código que a gente "por via das duvidas" inclui mais de uma vez em um modulo não seja considerado duas vezes. n Um exemplo de como isto e útil esta na diretiva #include que esta presente tanto em pilha.h como em pilha.c como em aplic.c. n Como aplic.c carrega pilha.h "para dentro" de si mesmo, carregara também stdio.h. Como está explicitamente também carregando stdio.h, se não houver uma diretiva #ifndef em stdio.h, ele terá o mesmo código existente em stdio.h duas vezes.

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 27 Projetos de Implementação: Usando Make  Make: Utilitário que auxilia a compilação de projetos formados por vários arquivos de programas  Realiza checagem de dependências entre o arquivo destino e os fontes  Baseia-se nas datas de arquivos

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 28 Projetos de Implementação: Sintaxe do Makefile aplic: aplic.o pilha.o gcc -g -o aplic aplic.o pilha.o aplic.o: aplic.c pilha.h gcc -g - c aplic.c pilha.o: pilha.c pilha.h gcc -g -c pilha.c meta: dependencia1 dependênciaN um comando para atingir meta um comando para atingir meta outro comando para atingir meta outro comando para atingir meta

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 29 Projetos de Implementação: Usando o Makefile n Chamada: make -f make -f u Se o nome não for dado, make procurará por arquivos chamados Makefile e makefile, nesta ordem. n Para definir qual meta será a primeira a ser considerada: u Se você não diz nada, a primeira meta será considerada. u Voce pode passar como último parâmetro o nome da meta: make -f meuMakefile compilar F Todas as dependencias de compilar, se esta meta existir, serão também levadas em consideração.

INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 30 n Módulo lista.c: #include #include #include “lista.h” lista *criaLista () { lista *nova; lista *nova; nova = malloc( sizeof(lista) ); nova = malloc( sizeof(lista) ); nova->max = 30; nova->max = 30; nova->ultimo = -1; nova->ultimo = -1; return (nova); return (nova);} void destroiLista(lista *morta) { // Libera memória p/os strings // Libera memória p/os strings for (i=0; morta->ultimo; i++) for (i=0; morta->ultimo; i++) free (morta->elemento[i]); free (morta->elemento[i]); // Libera memória da lista // Libera memória da lista free ( morta ); free ( morta );} n Módulo lista.h: #ifndef Lista #define Lista typedef struct estruLista { char *elemento[30]; intultimo; int max; }; typedef struct estruLista lista; #endif