A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

1 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

2 INE - UFSC - Disciplina Estruturas de Dados - Prof. Dr. Aldo von Wangenheim Página 2 3.1 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.

3 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 10010101... "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

4 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.. 10010101... 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

5 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.. 10010101... 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

6 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.. 10010101... 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

7 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.. 10010101... 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

8 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.. 10010101... 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

9 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.. 10010101... 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

10 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.. 10010101... 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

11 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.. 10010101... 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

12 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.. 10010101... 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

13 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.. 10010101... 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

14 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

15 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.

16 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 10010101... 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

17 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" 10010101... 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

18 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.

19 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 < 10000. 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.

20 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 10010101... 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

21 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.

22 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.

23 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 */ }

24 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.

25 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

26 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.

27 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

28 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

29 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.

30 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


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google