Baixe o app para aproveitar ainda mais
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
Compartilhar