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 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 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 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 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 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 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 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 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 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 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 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 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 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" 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