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

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

Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Alocação Dinâmida de Memória Alocação Dinâmica.

Apresentações semelhantes


Apresentação em tema: "Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Alocação Dinâmida de Memória Alocação Dinâmica."— Transcrição da apresentação:

1 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Alocação Dinâmida de Memória Alocação Dinâmica é um meio pelo qual o programa pode obter memória enquanto está em execução.

2 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Alocação de Memória: – Constantes são "codificadas" dentro do código objeto de um programa em tempo de compilação. – 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. – Variáveis locais em funções (ou métodos) são alocadas através da requisição de espaço na pilha (stack).

3 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } abab 10010101...10010101... Estrutura de dados Linguagem C Sist.OperacionalSist.Operacional HeapPointer Início da Área Alocável StackPointer Inicio 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

4 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão abab 10010101... Estrutura de dados Linguagem C" Sist.Operacional Topo da Memória Base da Memória Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = "Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

5 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... ab Topo da Memória Base da Memória Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

6 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... ab Topo da Memória Base da Memória &main-#3 localA localB Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

7 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... ab Topo da Memória Base da Memória &main-#3 localA localB Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

8 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória &main-#3localAlocalB &func_B-#2local1local2 Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

9 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória &main-#3localAlocalB &func_B-#2local1local2 Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

10 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão 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 &main-#3 localA localB Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

11 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... ab HeapPointer Topo da Área Alocável Topo da Memória Base da Memória &main-#3localAlocalB &func_B-#3local1local2 Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

12 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... ab HeapPointer Topo da Área Alocável Topo da Memória Base da Memória &main-#3localAlocalB &func_B-#2local1local2 Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

13 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória &main-#3 localA localB Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

14 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... ab HeapPointer Topo da Área Alocável StackPointer Topo da Pilha Topo da Memória Base da Memória Estrutura de dados Linguagem C Programa: #include char *a, *b; int func_A () { int local1, local2; - - - } void func_B () { int localA, localB; localA = func_A(); localB = func_A(); } main () { a = Estrutura de dados"; b = Linguagem C" func_B(); } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

15 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Alocação Dinâmica em "C" A memória alocada pelas funções de alocação dinâmica é obtida do heap. – 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). – O tamanho do heap é, a princípio, desconhecido do programa. "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

16 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Função malloc() Protótipo: void *malloc(size_t número_de_bytes); – Devolve um ponteiro do tipo void (sem tipo) para o início (1º byte) da área de memória alocada. – O valor deste ponteiro pode ser atribuído a qualquer variável do tipo ponteiro. – Para isto deve ser utilizado sempre um typecasting. Ex.: se x é ponteiro para inteiro então explicitar isto com x = (int *) malloc( sizeof(int) ); – número_de_bytes é a quantidade de bytes 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.

17 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional 10010101... pq Topo da Memória Base da Memória 1000 bytes 50*int = 200 bytes Exemplo: #include char *p; int *q; main () { p = (char *) malloc(1000); // Aloca 1000 // bytes de RAM q = (int *) malloc(50*sizeof(int)); // Aloca espaço // para 50 inteiros. } HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

18 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Sist.Operacional "Sem memória" 10010101... p Topo da Memória Base da Memória Já alocado antes Espaço de variáveis locais alocado #include char *p; main () {.. // Tenta alocar 1000 bytes de RAM p = malloc(1000); // Testa se conseguiu alocar if (p == NULL) printf("Sem memória."); } malloc devolve: – um ponteiro para a área alocada – o ponteiro nulo (NULL) caso não seja possível alocar a memória requisitada. HeapPointer Início da Área Alocável StackPointer Inicio da Pilha Topo da Memória Variáveis estáticas Código objeto Constantes

19 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Função free Protótipo: void free( void *p ); – 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 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 nocivos ao programa. – A gerência de buracos no heap é responsabilidade do sistema operacional.

20 Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Outras funções void *calloc(size_t núm, size_t size); – Aloca uma quantidade de memória igual a (num * size) void *realloc(void *ptr, size_t size); – Modifica o tamanho da memória previamente alocada apontada por ptr para aquele especificado por size.


Carregar ppt "Eng. de Computação – Estruturas de Dados I – Alocação Dinâmida de Memória prof. Henrique Monteiro Cristovão Alocação Dinâmida de Memória Alocação Dinâmica."

Apresentações semelhantes


Anúncios Google