transparência 1 estruturas de dados - t.332 capítulo 3 parte 2: alocação dinâmica de memória

38
Transparênci Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Upload: lavinia-cabral-barbosa

Post on 07-Apr-2016

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 1

Estruturas de Dados - T.332

Capítulo 3Parte 2:

Alocação Dinâmica de Memória

Page 2: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 2

3.1 As Funções de Alocação Dinâmica de Memória em "C"

Já visto até agora:Já visto até agora: ConstantesConstantes são " são "codificadascodificadas" dentro do código " dentro do código

objeto de um programa em tempo de compilação.objeto de um programa em tempo de compilação. Variáveis globais Variáveis globais ((estáticasestáticas) têm a sua alocação ) têm a sua alocação

codificada em tempo de compilação e são codificada em tempo de compilação e são alocadas logo que um programa inicia a execução.alocadas logo que um programa inicia a execução.

Variáveis locais Variáveis locais em funções (ou em funções (ou métodosmétodos) são ) são alocadas através da requisição de espaço na pilha alocadas através da requisição de espaço na pilha ((stackstack).).

Alocação Dinâmica Alocação Dinâmica é um meio pelo qual o é um meio pelo qual o programa pode obter memória enquanto programa pode obter memória enquanto está em execução.está em execução.

Page 3: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 3

Programa:Programa:#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

aabb

10010101...10010101...

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

Sist.OperacionalSist.Operacional

HeapPointerInício da ÁreaAlocável

StackPointerInicio da Pilha

Topo da Memória

Base da Memória

P r o g r a m a

Variáveis estáticas

Código objeto

Constantes

Page 4: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 4

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

aabb

10010101...

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

Sist.Operacional

HeapPointerInício da ÁreaAlocável

StackPointerInicio da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

Page 5: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 5

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

Page 6: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 6

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

&main-#3localAlocalB

Page 7: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 7

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

&main-#3localAlocalB

Page 8: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 8

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

&main-#3&main-#3localAlocalAlocalBlocalB

&func_B-#2&func_B-#2local1local1local2local2

Page 9: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 9

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

&main-#3&main-#3localAlocalAlocalBlocalB

&func_B-#2&func_B-#2local1local1local2local2

Page 10: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 10

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

&main-#3localAlocalB

Page 11: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 11

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

&main-#3&main-#3localAlocalAlocalBlocalB

&func_B-#3&func_B-#3local1local1local2local2

Page 12: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 12

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

&main-#3&main-#3localAlocalAlocalBlocalB

&func_B-#2&func_B-#2local1local1local2local2

Page 13: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 13

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

&main-#3localAlocalB

Page 14: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 14

Programa:Programa:

#include <stdio.h>#include <stdio.h>char *a, *b;char *a, *b;

int func_A ()int func_A (){{ int local1, local2;int local1, local2;

- - - - - - }}void func_B ()void func_B (){ {

int localA, localB;int localA, localB;localA = func_A();localA = func_A();localB = func_A();localB = func_A();

}}main ()main (){{a = "Essa aula é legal";a = "Essa aula é legal";b = "Será mesmo?"b = "Será mesmo?"func_B();func_B();}}

Sist.OperacionalSist.Operacional

"Essa aula é ..."Essa aula é ..."Será mesmo.."Será mesmo..

10010101...10010101...

aabb

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

Page 15: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 15

Alocação Dinâmica em "C" A memória alocada pelas funções de A memória alocada pelas funções de

alocação dinâmica é obtida do alocação dinâmica é obtida do heapheap.. O O heapheap é a região de memória livre que se é a região de memória livre que se

encontra entre o programa (com a área de encontra entre o programa (com a área de armazenamento permanente) e a pilha (armazenamento permanente) e a pilha (stackstack).).

O tamanho do heap é, a princípio, desconhecido O tamanho do heap é, a princípio, desconhecido do programa.do programa.

"C" possui duas funções básicas para "C" possui duas funções básicas para gerência de memória:gerência de memória: malloc(malloc(nº de bytesnº de bytes)) - aloca memória. - aloca memória. free(free(endereçoendereço)) - libera memória- libera memória

Page 16: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 16

Função malloc(): Protótipo: Protótipo: void *malloc(size_t void *malloc(size_t número_de_bytesnúmero_de_bytes););

DetalhesDetalhes : : Devolve um ponteiro do tipo Devolve um ponteiro do tipo voidvoid (sem tipo) para o início (sem tipo) para o início

(1º byte) da área de memória alocada.(1º byte) da área de memória alocada. Isto significa que o valor deste ponteiro pode ser Isto significa que o valor deste ponteiro pode ser

atribuído a qualquer variável do tipo ponteiro.atribuído a qualquer variável do tipo ponteiro. Para isto deve ser utilizado sempre um Para isto deve ser utilizado sempre um typecastingtypecasting. .

Ex.: se Ex.: se xx é ponteiro para inteiro então explicitar isto com é ponteiro para inteiro então explicitar isto comx = x = (int *)(int *) malloc( sizeof(int) ); malloc( sizeof(int) );

número_de_bytesnúmero_de_bytes é a quantidade de bytes alocada. é a quantidade de bytes alocada. Se a memória for alocada no topo do heap, o Se a memória for alocada no topo do heap, o

heapPointerheapPointer é atualizado (incrementado de é atualizado (incrementado de número_de_bytesnúmero_de_bytes).).

O tipo O tipo size_tsize_t é é definido em definido em stdlib.hstdlib.h. .

Page 17: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 17

Exemplo:Exemplo:

#include <stdlib.h>#include <stdlib.h>#include <stdio.h>#include <stdio.h>

char char *p;*p;int int *q;*q;

main ()main (){{

p = p = (char *)(char *) malloc(1000); malloc(1000); // Aloca 1000// Aloca 1000 // bytes de RAM// bytes de RAM

q = q = (int *) (int *) malloc(50*sizeof(int));malloc(50*sizeof(int)); // Aloca espaço// Aloca espaço // para 50 inteiros. // para 50 inteiros.

}} Sist.OperacionalSist.Operacional

10010101...10010101...

ppqq

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

1000 bytes1000 bytes

50*int = 200 bytes50*int = 200 bytes

Page 18: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 18

malloc devolve:malloc devolve: um ponteiro para a área alocadaum ponteiro para a área alocada o ponteiro nulo (NULL) caso o ponteiro nulo (NULL) caso

não seja possível alocar a não seja possível alocar a memória requisitada.memória requisitada.

Convém verificar se foi pos-Convém verificar se foi pos-sível alocar a memória:sível alocar a memória:

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>char char *p;*p;main ()main (){{ ................................

p = malloc(1000)p = malloc(1000) // Tenta alocar 1000// Tenta alocar 1000 // bytes de RAM// bytes de RAM

if (p == NULL)if (p == NULL) // Testa se p // Testa se p // diferente de 0// diferente de 0printf("Sem memória.");printf("Sem memória.");

}}

Sist.OperacionalSist.Operacional

"Sem memória""Sem memória"

10010101...10010101...

pp

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Variáveis estáticas

Código objeto

Constantes

Já alocado antesJá alocado antes

Espaço de variáveis Espaço de variáveis locais alocadolocais alocado

Page 19: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 19

Função free: Protótipo: Protótipo:

void free( void *p );void free( void *p ); DetalhesDetalhes : :

Devolve memória previamente alocada ao sistema.Devolve memória previamente alocada ao sistema. A memória devolvida é aquela que foi alocada com um A memória devolvida é aquela que foi alocada com um

ponteiro com o valor de ponteiro com o valor de pp.. O valor de O valor de pp deve ser um valor que foi alguma vez retornado por deve ser um valor que foi alguma vez retornado por

malloc(). malloc(). Não é possível alocar-se um vetor enorme e depois dealocar-se a Não é possível alocar-se um vetor enorme e depois dealocar-se a

parte dele que "sobrou". parte dele que "sobrou". A utilização de A utilização de freefree() com um valor de ponteiro qualquer () com um valor de ponteiro qualquer

poder ter resultados catastróficos.poder ter resultados catastróficos. A gerência de A gerência de buracosburacos no heap é responsabilidade do no heap é responsabilidade do

sistema operacional.sistema operacional.

Page 20: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 20

Exercício: Lista com um vetor de Ponteiros para Strings.

Uma lista ordenada pode conter Strings de Uma lista ordenada pode conter Strings de qualquerqualquer comprimento < 10000.comprimento < 10000.

Esta lista tem número de elementos máximo fixo = 100 e é Esta lista tem número de elementos máximo fixo = 100 e é implementada como um implementada como um vetor de ponteiros para Stringsvetor de ponteiros para Strings.. Utilize as rotinas de lista com vetor que você utilizou para Utilize as rotinas de lista com vetor que você utilizou para

a agenda.a agenda. Um novo String é lido primeiramente para dentro de uma Um novo String é lido primeiramente para dentro de uma

variável auxiliar qualquer.variável auxiliar qualquer. Então é alocada memória para exatamente o seu Então é alocada memória para exatamente o seu

tamanho e ele é copiado para esta área. Para copiar um tamanho e ele é copiado para esta área. Para copiar um String utilize String utilize strcpy()strcpy()..

Por fim um lugar na lista é encontrado para ele. A posição Por fim um lugar na lista é encontrado para ele. A posição escolhida do vetor de ponteiros da lista é instanciada escolhida do vetor de ponteiros da lista é instanciada através da atualização dos valores do ponteiro da posição através da atualização dos valores do ponteiro da posição do string na lista com o endereço do string.do string na lista com o endereço do string.

Page 21: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 21

Modelagem da estrutura

-1012341

Lista com Vetor de Ponteiros

Strings lidosdo usuário e alocados no Heap

S a b ã o \0

C o n s t i t u i r \0

Page 22: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 22

Modelagem da Lista

Pseudo-código:Pseudo-código:constantes Maxlista = 100;constantes Maxlista = 100;

tipo Lista {tipo Lista {caractercaracter **dados[Maxlista];dados[Maxlista];“ “ Vetor de ponteiros para char “Vetor de ponteiros para char “inteiro inteiro ultimo;ultimo;

};};

Importante: Observe que criando uma variável do Importante: Observe que criando uma variável do tipo Lista você não vai estar alocando memória para tipo Lista você não vai estar alocando memória para os strings a serem lidos, apenas para os ponteiros os strings a serem lidos, apenas para os ponteiros para eles.para eles.

Page 23: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 23

Organização de Organização de memória do memória do Exercício:Exercício:

Sist.OperacionalSist.Operacional

10010101...10010101...

HeapPointerTopo da ÁreaAlocável

StackPointerTopo da Pilha

Topo da Memória

Base da Memória

Vetor de char*

Código objeto

Constantes

str4str4str3str3str2str2str1str1

Espaço de variáveis Espaço de variáveis locais alocadolocais alocado

Var.Estáticas

Page 24: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 24

Para verificar o comprimento de um String:Para verificar o comprimento de um String: Utilize a função strlen().Utilize a função strlen(). Esta função devolve o comprimento (em caracteres Esta função devolve o comprimento (em caracteres

imprimíveis) de um String.imprimíveis) de um String. Protótipo: Protótipo: int strlen(char *p);int strlen(char *p);

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include <sting.h>#include <sting.h>

char char p[90] = "Carro";p[90] = "Carro";main ()main (){{

printf("%i", strlen(p) );printf("%i", strlen(p) );}}

Imprime: 5.Imprime: 5.

Page 25: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 25

Para copiar um String:Para copiar um String: Utilize a função Utilize a função strcpystrcpy().(). Esta função copia o conteúdo de um string (dado por um 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.apontador) para a posição de memória dada por outro apontador. Protótipo: Protótipo:

char *strcpy(char *destino, *fonte);char *strcpy(char *destino, *fonte);

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include <sting.h>#include <sting.h>

char char p[90] = "Carro";p[90] = "Carro";charchar lata[20];lata[20];main ()main (){{

strcpy(lata, p) );strcpy(lata, p) );printf("s%", lata);printf("s%", lata);

}}

Imprime: Carro.Imprime: Carro.

Page 26: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 26

Detalhes: Lista Ordenada com um vetor de

ponteiros para Strings. Como você não sabe o comprimento do String que o usuário vai Como você não sabe o comprimento do String que o usuário vai

digitar, use primeiro uma variável auxiliar grande (10000 digitar, use primeiro uma variável auxiliar grande (10000 posições) para guardar o que foi digitado.posições) para guardar o que foi digitado.

A lista deve ser passada como parâmetro para todas as funções A lista deve ser passada como parâmetro para todas as funções que a utilizam. que a utilizam.

Da mesma maneira as variáveis de controle da lista.Da mesma maneira as variáveis de controle da lista. Todas as funções de lista ordenada implementadas Todas as funções de lista ordenada implementadas

anteriormente devem ser reimplementadas para utilizar estes anteriormente devem ser reimplementadas para utilizar estes Strings.Strings.

Para a leitura de um String utilize Para a leitura de um String utilize scanf("%s", entrada) scanf("%s", entrada) onde onde char entrada[10000]char entrada[10000]..

Page 27: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 27

Exercício Nº 2: Trabalho com Passagem de Parâmetros Agora você vai fazer um programa que manipula mais de Agora você vai fazer um programa que manipula mais de

uma lista. uma lista. O programa fará isto com O programa fará isto com um únicoum único conjunto de funções e conjunto de funções e

passagem das diversas listas como parâmetros.passagem das diversas listas como parâmetros. Como aplicação imaginemos um Como aplicação imaginemos um sistema de contabilidadesistema de contabilidade

simples.simples. Você vai ter um Plano de Contas constituído por duas Você vai ter um Plano de Contas constituído por duas

listas: listas: débitos débitos ee créditos créditos.. O mesmo conjunto de funções (que você já implementou) O mesmo conjunto de funções (que você já implementou)

vai poder ser utilizado para isso: você somente precisa vai poder ser utilizado para isso: você somente precisa ampliar o conjunto de parâmetros da função para passar ampliar o conjunto de parâmetros da função para passar por referência também a lista que você quer alterar. por referência também a lista que você quer alterar. A passagem de parâmetro da lista A passagem de parâmetro da lista devedeve ser por referência porque ser por referência porque

você deseja que as alterações sejam você deseja que as alterações sejam persistentespersistentes..

Page 28: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 28

Modelagem de um Lancamento

Cada lista de débitos ou créditos é constituida Cada lista de débitos ou créditos é constituida de um lançamento. O lançamento possui:de um lançamento. O lançamento possui: Um valor real (positivo).Um valor real (positivo). Um nome, por exemplo “pagar proteção à Mafia”Um nome, por exemplo “pagar proteção à Mafia”

Estrutura:Estrutura:

tipo Lancamento {tipo Lancamento {

caractercaracter **nome;nome; ““ponteiro para char alocado no heap“ponteiro para char alocado no heap“real real valor; valor;

};};

Page 29: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 29

Modelagem de um tipo Lista para Débitos ou Créditos Pseudo-código:Pseudo-código:

constantes Maxlista = 100;constantes Maxlista = 100;

tipo ListaContabil {tipo ListaContabil {LancamentoLancamento dados[Maxlista];dados[Maxlista];“ “ Vetor de Estrutura Lançamento “Vetor de Estrutura Lançamento “inteiro inteiro ultimo;ultimo;

};};

ImportanteImportante: Observe que criando um vetro de lancamentos, : Observe que criando um vetro de lancamentos, você não vai estar reservando memória para os você não vai estar reservando memória para os nomesnomes destes, destes, pois o campo nome é só ponteiros. Lembre-se de alocar.pois o campo nome é só ponteiros. Lembre-se de alocar.

Page 30: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 30

Usando (pseudo código) Crie variáveis globais:Crie variáveis globais:

ListaContabilListaContabil debitos, creditos;debitos, creditos; Passe estas variáveis como parâmetro por Passe estas variáveis como parâmetro por

referência:referência:adiciona(adiciona(&&debitos, nomeLanc, valorLanc)debitos, nomeLanc, valorLanc)

Cabeçalho:Cabeçalho:Inteiro FUNÇÃO adiciona(Inteiro FUNÇÃO adiciona(ListaContabil *ListaContabil *plano;plano;

caracter caracter **nome;nome; real valor)real valor)

Importante: nome é passado como ponteiro para Importante: nome é passado como ponteiro para caracter. Use um buffer global para ler o nome do caracter. Use um buffer global para ler o nome do lancamento do usuário.lancamento do usuário.

Page 31: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 31

Desenho

-1012341

Lista de debitos ou de créditos com Vetor de Estruturas do tipoLançamento

Strings lidosdo usuário e alocados no Heap

S a b ã o \0

P a s s a g e n s \0

R$ 5,00

R$ 505,00

Page 32: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 32

Usando (código C) Referencie diferentemente se estiver usando Referencie diferentemente se estiver usando

ponteiros para a lista ou a lista diretamente:ponteiros para a lista ou a lista diretamente:ListaContabil debitos, creditos;ListaContabil debitos, creditos;

debitos.dados[2].valor = 5.0;debitos.dados[2].valor = 5.0;strcpy(debitos.dados[2].nome, buffer);strcpy(debitos.dados[2].nome, buffer);

Dentro das funções:Dentro das funções:Suponha: Suponha: ListaContabil ListaContabil **ponteiroponteiro ee ponteiro = &debitos; ponteiro = &debitos;

ponteiro->dados[2].valor = 5.0;ponteiro->dados[2].valor = 5.0;strcpy(ponteiro->dados[2].nome, buffer);strcpy(ponteiro->dados[2].nome, buffer);

Page 33: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 33

Headerfile: Como Garantir Inclusão Única

/* Arquivo: pilha.h *//* Arquivo: pilha.h */#ifndef EstruturaDaPilha #ifndef EstruturaDaPilha #define EstruturaDaPilha #define EstruturaDaPilha /* Definir uma estrutura para a pilha */ /* Definir uma estrutura para a pilha */ struct estruturaDaPilhastruct 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 #endif

Page 34: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 34

Headerfiles: Importante A diretiva de compilação A diretiva de compilação #ifndef#ifndef (if not defined) diz que (if not defined) diz que

aquela área de código fonte entre o aquela área de código fonte entre o #ifndef#ifndef e o e o #endif#endif somente será levada em conta pelo compilador se o somente será levada em conta pelo compilador se o argumento de argumento de #ifndef#ifndef ainda não houver sido definido na ainda não houver sido definido na mesma sessão de compilação no escopo de um módulo. mesma sessão de compilação no escopo de um módulo.

Isso garante que código que a gente "por via das duvidas" Isso garante que código que a gente "por via das duvidas" inclui mais de uma vez em um modulo não seja considerado inclui mais de uma vez em um modulo não seja considerado duas vezes. duas vezes.

Um exemplo de como isto e útil esta na diretiva Um exemplo de como isto e útil esta na diretiva #include#include <stdio.h> que esta presente tanto em <stdio.h> que esta presente tanto em pilha.hpilha.h como em como em pilha.cpilha.c como em como em aplic.caplic.c. .

Como Como aplic.caplic.c carrega carrega pilha.hpilha.h "para dentro" de si mesmo, "para dentro" de si mesmo, carregara também carregara também stdio.hstdio.h. Como está explicitamente . Como está explicitamente também carregando também carregando stdio.hstdio.h, se não houver uma diretiva , se não houver uma diretiva #ifndef#ifndef em em stdio.hstdio.h, ele terá o mesmo código existente em , ele terá o mesmo código existente em stdio.hstdio.h duas vezes. duas vezes.

Page 35: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 35

Projetos de Implementação: Usando Make

MakeMake: : Utilitário que auxilia a Utilitário que auxilia a compilação de projetos formados por compilação de projetos formados por vários arquivos de programasvários arquivos de programas

Realiza checagem de dependências Realiza checagem de dependências entre o arquivo destino e os fontesentre o arquivo destino e os fontes

Baseia-se nas datas de arquivosBaseia-se nas datas de arquivos

Page 36: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 36

Projetos de Implementação: Sintaxe do Makefileaplicaplic: : aplic.o pilha.oaplic.o pilha.o

gcc -g -o aplic aplic.o pilha.ogcc -g -o aplic aplic.o pilha.o

aplic.oaplic.o: : aplic.c pilha.haplic.c pilha.hgcc -g - c aplic.cgcc -g - c aplic.c

pilha.opilha.o: : pilha.c pilha.hpilha.c pilha.hgcc -g -c pilha.cgcc -g -c pilha.c

metameta: : dependencia1 dependênciaNdependencia1 dependênciaN<tab><tab>um comando para atingir meta um comando para atingir meta <tab><tab>outro comando para atingir metaoutro comando para atingir meta

Page 37: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 37

Projetos de Implementação: Usando o Makefile Chamada:Chamada:make -f <nome do Makefile>make -f <nome do Makefile> Se o nome não for dado, make procurará por arquivos Se o nome não for dado, make procurará por arquivos

chamados chamados MakefileMakefile e e makefilemakefile, nesta ordem., nesta ordem. Para definir qual meta será a primeira a ser Para definir qual meta será a primeira a ser

considerada:considerada: Se você não diz nada, a primeira meta será Se você não diz nada, a primeira meta será

considerada.considerada. Voce pode passar como último parâmetro o nome da Voce pode passar como último parâmetro o nome da

meta:meta:make -f meuMakefile compilarmake -f meuMakefile compilar

Todas as dependencias de Todas as dependencias de compilarcompilar, se esta meta existir, , se esta meta existir, serão também levadas em consideração.serão também levadas em consideração.

Page 38: Transparência 1 Estruturas de Dados - T.332 Capítulo 3 Parte 2: Alocação Dinâmica de Memória

Transparência 38

Módulo lista.c:Módulo lista.c:

#include <stdio.h>#include <stdio.h>#include <stdlib.h>#include <stdlib.h>#include “lista.h”#include “lista.h”

lista *criaLista ()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)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 );}}

Módulo lista.h:Módulo lista.h:

#ifndef Lista#ifndef Lista#define Lista#define Lista

typedef struct estruLista {typedef struct estruLista {char *elemento[30];char *elemento[30];intint ultimo;ultimo;int int max;max;

};};

typedef struct estruLista lista;typedef struct estruLista lista;

#endif#endif