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

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

Alocação Dinâmida de Memória

Apresentações semelhantes


Apresentação em tema: "Alocação Dinâmida de Memória"— Transcrição da apresentação:

1 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 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 “Estrutura de dados” “Linguagem C”
StackPointer Inicio da Pilha Topo da Memória Programa: #include <stdio.h> 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 a b Variáveis estáticas Código objeto P r o g r a m a “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

4 “Estrutura de dados” “Linguagem C"
StackPointer Inicio da Pilha Topo da Memória Topo da Memória Programa: #include <stdio.h> 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 a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C" Constantes Sist.Operacional Base da Memória

5 “Estrutura de dados” “Linguagem C”
StackPointer Inicio da Pilha Topo da Memória Topo da Memória Programa: #include <stdio.h> 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 a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

6 “Estrutura de dados” “Linguagem C”
Topo da Memória Topo da Memória Programa: #include <stdio.h> 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(); &main-#3 localA localB StackPointer Inicio da Pilha HeapPointer Início da Área Alocável a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

7 “Estrutura de dados” “Linguagem C”
Topo da Memória Topo da Memória Programa: #include <stdio.h> 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(); &main-#3 localA localB StackPointer Inicio da Pilha HeapPointer Início da Área Alocável a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

8 “Estrutura de dados” “Linguagem C”
Topo da Memória Topo da Memória Programa: #include <stdio.h> 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(); &main-#3 localA localB &func_B-#2 local1 local2 StackPointer Inicio da Pilha StackPointer Topo da Pilha HeapPointer Topo da Área Alocável HeapPointer Início da Área Alocável a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

9 “Estrutura de dados” “Linguagem C”
Topo da Memória Topo da Memória Programa: #include <stdio.h> 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(); &main-#3 localA localB &func_B-#2 local1 local2 StackPointer Topo da Pilha StackPointer Inicio da Pilha HeapPointer Topo da Área Alocável HeapPointer Início da Área Alocável a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

10 “Estrutura de dados” “Linguagem C”
Topo da Memória Topo da Memória Programa: #include <stdio.h> 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(); &main-#3 localA localB StackPointer Inicio da Pilha StackPointer Topo da Pilha HeapPointer Topo da Área Alocável HeapPointer Início da Área Alocável a b Variáveis estáticas Código objeto "Essa aula é ... "Será mesmo.. “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

11 “Estrutura de dados” “Linguagem C”
Topo da Memória Topo da Memória Programa: #include <stdio.h> 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(); &main-#3 localA localB &func_B-#3 local1 local2 StackPointer Inicio da Pilha HeapPointer Topo da Área Alocável HeapPointer Início da Área Alocável a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

12 “Estrutura de dados” “Linguagem C”
Topo da Memória Topo da Memória Programa: #include <stdio.h> 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(); &main-#3 localA localB &func_B-#2 local1 local2 StackPointer Inicio da Pilha HeapPointer Topo da Área Alocável HeapPointer Início da Área Alocável a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

13 “Estrutura de dados” “Linguagem C”
StackPointer Inicio da Pilha Topo da Memória Topo da Memória Programa: #include <stdio.h> 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(); &main-#3 localA localB StackPointer Topo da Pilha HeapPointer Topo da Área Alocável HeapPointer Início da Área Alocável a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

14 “Estrutura de dados” “Linguagem C”
Topo da Memória Topo da Memória StackPointer Topo da Pilha StackPointer Inicio da Pilha Programa: #include <stdio.h> 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 Topo da Área Alocável HeapPointer Início da Área Alocável a b Variáveis estáticas Código objeto “Estrutura de dados” “Linguagem C” Constantes Sist.Operacional Base da Memória

15 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 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 Exemplo: StackPointer Inicio da Pilha HeapPointer Início da Área
Topo da Memória Exemplo: #include <stdlib.h> #include <stdio.h> 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. } StackPointer Inicio da Pilha Topo da Memória HeapPointer Início da Área Alocável 50*int = 200 bytes 1000 bytes p q Variáveis estáticas Código objeto Constantes Sist.Operacional Base da Memória

18 malloc devolve: um ponteiro para a área alocada
Topo da Memória Topo da 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. Espaço de variáveis locais alocado StackPointer Inicio da Pilha HeapPointer Início da Área Alocável Já alocado antes #include <stdio.h> #include <stdlib.h> char *p; main () { .. // Tenta alocar 1000 bytes de RAM p = malloc(1000); // Testa se conseguiu alocar if (p == NULL) printf("Sem memória."); } p Variáveis estáticas Código objeto "Sem memória" Constantes Sist.Operacional Base da Memória

19 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 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 "Alocação Dinâmida de Memória"

Apresentações semelhantes


Anúncios Google