Buscar

ED_Aula_005

Prévia do material em texto

2019.2
ESTUTURAS DE DADOS
CCT0637
Aula 5
PROFESSOR: EDIBERTO MARIANO
1
2019.2
CONTEÚDOS
2
· Alocação Dinâmica de Memória (parte II)
· Aplicação em C++: Ponteiros
· Alocação e desalocação de memória
2019.2
Alocação de Memória
3
Diz respeito como a memória (necessária para o
armazenamento dos dados) é reservada em um programa.
2019.2
Alocação de Memória
4
Estática
Dados (com tamanho fixo), 
organizados na Memória (linear 
e sequêncial)
Facilita Localização e 
Manipulação
Necessário estabelecer 
previamente a qtde máxima de 
memória 
Armazenar Estrutura 
de dados
Em C, um exemplo de alocação estática é simplesmente a declaração 
de uma variável:
int número;
int vet_a[4];
Durante a compilação do programa
A principal vantagem da alocação 
estática de memória sobre a alocação 
dinâmica de memória é: Velocidade de 
acesso
2019.2
Alocação de Memória
5
Estática
#include <iostream>
using namespace std;
int main() {
int i;
int vetA[5];
for(i = 0; i < 5; i++) {
cout << "\nInforme um valor = ";
cin >> vetA[i];
}
cout << "\nExibindo os valores do vetor \n";
for(i = 0; i < 5 i++) {
cout << "\n = "<<vetA[i];
}
}
2019.2 6
Dados (não precisam 
terem tamanho fixos)
Espaço de memória em 
blocos fora de ordem
Alocação/Desalocação de 
acordo com a 
necessidade
Alocação de Memória
Dinâmica
Ponteiro
“achar” os blocos que 
estão dispersos ou 
espalhados na memória
Variáveis criadas e não 
Liberadas 
automaticamente
Liberadas manualmente
Atribuir “NULL”
Durante a execução do programa
2019.2 7
#include <iostream> 
using namespace std; 
int main() { 
int *ptr1; 
ptr1 = new int; 
if (ptr1 == NULL) { 
cout << "Memória insuficiente!";
exit(1); 
} 
cout << "Endereço de ptr1: " << ptr1; 
*ptr1 = 90; 
cout << "Conteúdo de ptr1: " << *ptr1; 
delete ptr1; 
return 0; 
}
Alocação Dinâmica de Memória
Exemplo
2019.2 8
#include <stdio.h>
#include <stdlib.h> //necessário para usar as funções malloc() e free()
int main(void)
{ float *v; 
int i;
v = (float *) malloc(5 * sizeof(float));
for (i = 0; i < 5; i++) {
printf("\nDigite o valor = ");
cin>>&v[ i ];
}
for (i = 0;i < 5; i++) {
printf("%.2f\n",v[i]);
}
free(v);
return 0;
}
Alocação Dinâmica de Vetores
2019.2 9
#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
int main() {
char *s; 
int n; 
printf("Qual o tamanho de seu string? ");
scanf("%d",&n);
getchar();
if (!(s = (char *)malloc((n+1) * sizeof(char)))) {
printf("Não foi possível alocar o string\n");
exit(0);
}
printf("Entre o string: ");
cin>>s;
imprime o string */
printf("String: %s ",s);
free(s);
}
Alocação Dinâmica de Strings 
Exemplo
O mesmo procedimento pode ser usado com strings. Strings nada mais são que vetores
de caracteres terminados por '\0'. Então, para alocar um string, você deve fazer como em
vetores, tomando apenas o cuidado adicional de levar o '\0' em conta:
2019.2 10
Conforme vimos, podemos também alocar estruturas inteiras. Por exemplo,
considere nossa estrutura para definir um círculo:
struct s_pos {
int x;
int y;
};
struct s_circulo {
struct s_pos c; // centro do círculo
float r; // seu raio
};
Alocação Dinâmica de Structs
2019.2 11
1. A alocação de memória está dividida em partes. Em qual parte a decisão da alocação é 
tomada quando o programa é compilado?
a) Alocação Dinâmica;
b) Alocação Estática;
c) Alocação Híbrida;
d) Alocação Local;
e) Em todas as partes.
2. Assinale a opção que apresenta as duas funções básicas realizadas pelo gerenciador de 
memória no espaço livre da memória HEAP.
a) Alocação e Liberação.
b) Busca e Compactação.
c) Ajuste e Reposicionamento.
d) Ordenamento e Compactação.
e) Balanceamento e Redistribuição.
Alocação Dinâmica de Structs
Exercícios
2019.2 12
3. A linguagem C++ oferece quatro meios de criação de tipos de dados: matrizes, 
estruturas ou structs, uniões e classes. As estruturas, que passaremos a chamar 
simplesmente de structs, são tipos de variáveis que agrupam dados geralmente 
desiguais, enquanto matrizes são variáveis que agrupam dados similares. Devido a 
esta característica as structs são utilizadas para modelar nodos (nós) de estruturas 
dinâmicas. Portanto podemos afirmar que:
Alocação Dinâmica de Structs – Aula05
Exercícios
[ ] As estruturas dinâmicas são assim chamadas, pois podem fazer alocação de memória em 
tempo de execução e terem seus tamanhos alterados de acordo com a demanda.
[ ] As estruturas dinâmicas são assim chamadas, pois podem fazer alocação de memória em 
tempo de compilação e terem seus tamanhos alterados de acordo com a demanda.
[ ] As estruturas dinâmicas são assim chamadas, pois não podem fazer alocação de memória em 
tempo de execução, mas mesmo assim conseguem ter seus tamanhos alterados de acordo 
com a demanda.
[ ] As estruturas dinâmicas são assim chamadas, pois podem fazer alocação de memória em 
tempo de compilação e entretanto seus tamanhos só são alterados na codificação de acordo 
com a demanda.
[ ] As estruturas dinâmicas são assim chamadas, pois podem fazer alocação de memória em 
tanto em tempo de execução quanto em tempo de compilação, mas não podem ter seus 
tamanhos alterados de acordo com a demanda.
2019.2 13
4. Assumindo que um valor do tipo inteiro ocupa 4 bytes na memória, e se baseando 
nas linhas de código abaixo, marque a alternativa correta:
int *p;
p = (int *)malloc(20*sizeof(int));
Alocação Dinâmica de Structs – Aula05
Exercícios
[ ] Alocação dinâmica de espaço de memória suficiente para armazenar 20 x 4 
valores inteiros
[ ] Alocação dinâmica de 80 bytes na memória
[ ] A operação é inválida
[ ] Atribuição ao ponteiro ¿p¿ de um endereço estático de memória
[ ] Alocação dinâmica 20 bytes na memória
2019.2 14
5. A principal vantagem da alocação estática de memória sobre a alocação 
dinâmica de memória é:
Alocação Dinâmica de Structs – Aula05
Exercícios
[ ] Velocidade de acesso.
[ ] Quantidade de armazenamento.
[ ] Uso de ponteiros.
[ ] Possibilidade de alocação em tempo de execução.
[ ] Possibilidade de alocação em tempo de compilação.
2019.2 15
6. Marque a opção verdadeira para um ponteiro.
Alocação Dinâmica de Structs – Aula05
Exercícios
[ ] É uma varíavel que armazena como valor necessariamente o endereço 
onde estará armazenado um outro endereço
[ ] É uma variável que armazena o endereço de um valor do tipo void
[ ] É uma variável que armazena o endereço de um valor do tipo para o 
qual o ponteiro foi declarado
[ ] É uma varável que pode armazenar um endereço de memória ou um 
valor do tipo inteiro
[ ] É uma variável que, quando incrementada de uma unidade, sempre 
incrementa o seu valor, em termos absolutos, de uma unidade
2019.2 16
7. Qual será o resultado apresentado na tela ao executar o seguinte código?
void funcao (int *valor) {
*valor += 50;
}
int main() {
int *a, b;
a = &b;
b = 100;
cout << b << endl;
funcao(a);
cout << b;
}
Alocação Dinâmica de Structs – Aula05
Exercícios
[ ] 100 e 100
[ ] 100 e 50
[ ] 100 e 150
[ ] 50 e 100
[ ] 150 e 100

Continue navegando

Outros materiais