Escolar Documentos
Profissional Documentos
Cultura Documentos
Estruturas de
Dados I
Aula 2: Alocação Dinâmica de Memória
Área de memória onde dados são
armazenados:
memória
variável dinâmica
Código executável:
- instruções (compilador)
- armazenamento dos dados (estrutura dos dados)
#include <stdio.h> Topo da Memória
StackPointer
char *a, *b;
Início da Pilha
int func_A () {
int local1, local2;
…
}
Programa
Variáveis estáticas
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; Constantes
"Essa
"Essaaula
"Será
aulaéé......
"Serámesmo..
b = "Será mesmo?" mesmo..
func_B(); Sistema
SistemaOperacional
Operacional
}
StackPointer Topo da Memória
int func_A () {
int local1, local2;
…
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
StackPointer Topo da Memória
int func_A () {
int local1, local2;
…
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
Topo da Memória
&main-#3
#include <stdio.h> localA
char *a, *b; StackPointer localB
Início da Pilha
int func_A () {
int local1, local2;
…
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
Topo da Memória
&main-#3
#include <stdio.h> localA
char *a, *b; StackPointer localB
Início da Pilha
int func_A () {
int local1, local2;
…
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
Topo da Memória
&main-#3
#include <stdio.h> localA
char *a, *b; localB
&func_B-#2
int func_A () { local1
StackPointer local2
int local1, local2;
… Início da Pilha
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
Topo da Memória
&main-#3
#include <stdio.h> localA
char *a, *b; localB
&func_B-#2
int func_A () { local1
StackPointer local2
int local1, local2;
… Início da Pilha
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
Topo da Memória
&main-#3
#include <stdio.h> localA
char *a, *b; StackPointer localB
Início da Pilha
int func_A () {
int local1, local2;
…
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
Topo da Memória
&main-#3
#include <stdio.h> localA
char *a, *b; localB
&func_B-#3
int func_A () { local1
StackPointer local2
int local1, local2;
… Início da Pilha
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
Topo da Memória
&main-#3
#include <stdio.h> localA
char *a, *b; localB
&func_B-#3
int func_A () { local1
StackPointer local2
int local1, local2;
… Início da Pilha
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
Topo da Memória
&main-#3
#include <stdio.h> localA
char *a, *b; StackPointer localB
Início da Pilha
int func_A () {
int local1, local2;
…
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
StackPointer Topo da Memória
int func_A () {
int local1, local2;
…
}
HeapPointer
void func_B () {
Início da Área
int localA, localB;
Alocável
localA = func_A();
localB = func_A(); aa
Variáveis estáticas bb
}
10010101...
10010101...
main () { Código objeto
a = "Essa aula é legal"; "Essa
"Essaaula
aulaé é......
b = "Será mesmo?" Constantes "Será mesmo..
"Será mesmo..
func_B();
} Sistema
SistemaOperacional
Operacional
Base da Memória
Alocação Dinâmica
• Uso da memória:
• alocação dinâmica de memória:
Código do programa
memória
estática
• usa a memória livre
Variáveis globais e
• se o espaço de memória livre for menor que o
espaço requisitado, Variáveis estáticas
a alocação não é feita e Variáveis alocadas
o programa pode prever
tratamento de erro dinamicamente
• pilha de execução:
memória
estática
• utilizada para alocar memória quando ocorre Memória livre
chamada de função:
• sistema reserva o espaço
para as variáveis locais da função Variáveis locais
• quando a função termina, (Pilha de execução)
espaço é liberado (desempilhado)
• se a pilha tentar crescer mais do que o espaço
disponível existente, 16
programa é abortado com erro
Alocação Dinâmica
Usada sempre que não se sabe exatamente quanto de
memória será usado para uma determinada tarefa.
• Armazenam endereços
de memória
• Não armazenam o
valor
• Necessitam ter o
espaço de memória
para o valor alocados
Exemplos
Para acessar o conteúdo de um
ponteiro usamos:
• *nome_do_ponteiro
• Imprime
mensagem de
erro
• Encerra o
programa
Calloc
35
2. Faça um programa que leia do teclado os dados de n
alunos. Utilize vetor de registro para armazenar os
dados de cada aluno. Esse vetor deve ser obtido
através de uma alocação dinâmica, a partir do valor
de n informado pelo usuário. O registro contém
Exercícios NumMat (tipo inteiro) e um vetor de reais de
Práticos tamanho 3 chamado NOTAS. Ao final, imprima seus
dados, seguido da média das três notas de cada aluno
e sua situação (aprovado – média>=7, reprovado –
média < 3, exame final – média entre 3 e 6);
36
Extra executando C no python