LPG - I: Alocação Dinâmica de Memória - Ponteiros

Slides:



Advertisements
Apresentações semelhantes
Marco Antonio Montebello Júnior
Advertisements

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS ESTRUTURAS DE DADOS AVANÇADAS Aula /08/2011 Professor Leomir J. Borba-
Algoritmos de manipulação de estruturas elementares de dados
Programação II Estruturas de Dados
Programação II Estruturas de Dados
Programação II Estruturas de Dados
Alocação Dinâmida de Memória
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
Variáveis Dinâmicas Caixas de Nós
Alocação Dinâmica de Memória
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Linguagem C LPG-I – Variáveis Estruturadas – Vetores
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
LPG-I: Tipos Complexos - Estruturas
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Universidade de Brasília
Ponteiros em Linguagem C
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Fundamentos de Programação 1
Ponteiros.
Escola Secundária c/ 3º CEB da Batalha
Listas Encadeadas.
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba
Alocação Dinâmica de Memória Professor Mário Dantas
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Linguagem de Programação II Parte IX
Definição de Tipos Estruturas e Ponteiros
INTELIGÊNCIA ARTIFICIAL
Alocação Dinâmica de Memória
Implementação de FILAS com Alocação Dinâmica
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Alocação Dinâmica de Memória
UNIDADE 5 ESTRUTURAS DE DADOS HOMOGÊNEAS
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Prof. Ricardo Santos PONTEIROS
Aula 3 Vetores e Listas. Arrays (vetores) Array – sequência de elementos do mesmo tipo. Tamanho do Array – seu número de elementos (número fixo) Consequência:
Estruturas de Dados Aula 5: Matrizes
Estruturas de Dados Aula 9: Listas (parte 1)
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Estruturas de Dados Aula 11: TAD Pilha
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática Disciplina: Estrutura de Dados Professor: Cheli dos S. Mendes da Costa Listas.
Capítulo VIII Ambientes de Execução
Aula P.02 – BCC202 Revisão sobre Ponteiros Túlio Toffolo
Estruturas de Dados Aula 17: Estruturas Genéricas
1 Alocação Dinâmica Quando se declara arrays o tamanho deve ser fixo e definido primeiramente –Alocação estática Pode-se alocar dinamicamente o espaço.
Estruturas de Dados Aula 7: Tipos Estruturados 23/04/2014.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Algoritmos e Estruturas de Dados
Estruturas de Dados Aula 6: Cadeias de Caracteres
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Ponteiros.
Programação de Computadores I – Ponteiros Profa. Mercedes Gonzales Márquez.
Leandro Almeida  As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa.
Ponteiros em C Prof. Kariston Pereira
Linguaguem de Programação II
Ponteiros. Programação II Professora: Mai-Ly vanessa horário: ter 9h-11h; sex 11h-13h Aula 1.
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Linguagem de Programação
COMPILADORES 07 Prof. Marcos.
ponteiros Estrutura de Dados Prof. André Cypriano M. Costa
Aula Prática 6 Ponteiros Monitoria  Quando declaramos uma matriz:  tipo meuArray[tam];  O compilador aloca a matriz em uma região de memória.
Alocação Dinâmica Dilvan Moreira. Objetivos  Entender o que são e como usar:  Gerenciamento de Memória  Alocação Dinâmica em C.
Jean Carlo Mendes
FUNÇÕES Dilvan Moreira (baseado em material de Z. Liang)
Transcrição da apresentação:

LPG - I: Alocação Dinâmica de Memória - Ponteiros UDESC - SBS Departamento de Sistemas de Informação LPG - I: Alocação Dinâmica de Memória - Ponteiros Prof. Flavio Marcello Strelow flavio@sbs.udesc.br

Memória Disponível no Computador PROGRAMA ÁREA LIVRE Memória livre, gerenciada pelo sistema operacional Código executável: - instruções (compilador) - armazenamento do dados (estrutura dos dados)

Alocação de Memória - Estática Quantidade total de memória utilizada pelos dados é previamente conhecida e definida de modo imutável, no próprio código-fonte do programa. Durante toda a execução, a quantidade de memória utilizada pelo programa não varia. Lista de variáveis declaradas.

Alocação de Memória - Estática Implementação simples: vetores (array) Vantagem: acesso indexado (vi)- todos os elementos da estrutura são igualmente acessíveis Desvantagens: tamanho fixo (#define TAM 1000) tempo de compilação alocados em memória de forma estática

Alocação de Memória - Estática Ao se determinar o máximo de elementos que o vetor irá conter, pode-se ocorrer um dos seguintes casos: Subdimensionamento: haverá mais elementos a serem armazenados do que o vetor é capaz de conter; Superdimensionamento: na maior parte do tempo, somente uma pequena porção do vetor será realmente utilizada.

Alocação de Memória - Dinâmica Quanto o programa é capaz de criar novas variáveis enquanto está sendo executado. Alocação de memória para componentes individuais no instante em que eles começam a existir durante a execução do programa.

Alocação Estática x Alocação Dinâmica

Alocação Dinâmica Implementação eficiente: ponteiros ou apontadores Vantagens: tamanho variável tempo de execução alocados em memória de forma dinâmica Desvantagem, ou restrição: capacidade da memória, acesso seqüencial

Alocação de Memória - Ponteiros No padrão C ANSI que define as funções para a alocação dinâmica (alocar e liberar blocos de memória em tempo de execução) estão disponíveis na biblioteca stdlib.h. malloc: alocar memória. free: liberar áreas da memória ocupadas. Precisaremos tambem do: sizeof: retorna o tamanho de uma variável.

Operador sizeof() sizeof sizeof(<expressão> | <tipo>) Retorna o número de bytes necessários para armazenar um objeto na memória, ou seja, saber o tamanho de tipos . O objeto pode ser um vetor, estrutura(struct) ou uma expressão como 5+9 ou 2.5*3.

Alocação de Memória - malloc void* malloc(tamanho_a_alocar); Recebe o número de bytes a alocar. Retorna um apontador void para a base da região contígua alocada na memória ou NULL se não for possível alocá-la. É responsabilidade do programador liberar a memória alocada dinamicamente com free. Produz erros estranhos quando usada para liberar um espaço que já foi liberado.

Alocação de Memória - Exemplos Alocação de memória para um inteiro: int *p = malloc( 3 * sizeof(int)); Alocação de memória para um array de n reais: float *p = malloc(n * sizeof(float));

Representação Interna da Variável do Tipo Ponteiro: void main() { int *p; p = (int *) malloc(sizeof(int)); *p = 10; ... free(p); } aloca a variável estaticamente I aloca a variável dinamicamente II III IV Lixo memória usada pelo programa p: memória livre no sistema memória usada pelo programa endereço 1FFA Lixo 10 p: 1FFA Lixo memória livre no sistema

Entendendo o código: I - int *p; A variável p é um ponteiro para um número inteiro, ou seja, “aponta” para um endereço de memória que será “alocado” para armazenar um número inteiro (2 bytes) II - p = (int *) malloc(sizeof(int)); Solicita ao sistema operacional 2 bytes da memória livre e o “endereço do espaço alocado” é colocado na variável ponteiro p III - *p = 10; No endereço apontado por p armazena o número inteiro 10 IV - free(p); Libera o espaço de memória ocupado cujo endereço está em p (devolve o recurso ao sistema operacional)

Exemplo Faça um programa para ler 10 números reais e armazene em um vetor alocado dinamicamente. Depois, imprima os elementos lidos.

Exemplo #include <stdio.h> #include <conio.h> #include <stdlib.h> #define TAM 10 int main() { int *pti, i; pti= (int *) malloc(sizeof(int) * TAM); if (pti == NULL) { /* verifica alocação, (poderia ser  if(!pti)) */ printf("Erro ao alocar memória!\n"); return 1; /* sai do programa */ } for (i=0; i<TAM; i++) { printf("Digite um numero inteiro: "); scanf("%d", &pti[i]); /* lê e armazena no vetor de endereços */ /* Impressao do ponteiro */ for (i=0; i<TAM; i++) printf("%d", pti[i]); free(pti); // libera memoria. return 0; }

Obrigado Alocação de Ponteiros LPG-I Flavio Marcello

Exercícios Faça um programa que aloque uma string de 30 caracteres, armazene uma palavra digitada pelo usuário nesta string, imprima na tela e, depois de imprimido, desaloque esta string. Faça um programa que leia 5 strings e armazene em uma matriz de strings. Cada string deve ter seu espaço alocado dinamicamente (considere strings de no máximo 20 caracteres na leitura).

3) Faça um programa que aloque uma string de 30 caracteres, armazene uma palavra digitada pelo usuário nesta string, imprima na tela e, depois de imprimido, desaloque esta string. #include <stdio.h> #include <stdlib.h> main() { char *string; /* alocar a string de 30 caracteres */ string= (char *) malloc(sizeof(char) * 30); if (!string) /* se alocação falhou (se string for igual a NULL) */ printf("Erro ao alocar memória!\n"); return 1; /* sai do programa */ } printf("Digite uma palavra: "); fgets(string, 30, stdin); printf("A palavra digitada é %s\n", string); free(string); /* desaloca a string */ return 0;

/*4) Faça um programa que leia 5 strings e armazene em uma matriz de strings. Cada string deve ter seu espaço alocado dinamicamente (considere strings de no máximo 20 caracteres). */ #include <stdio.h> #include <stdlib.h> main() { char *mat[5]; int i; for (i=0; i<5; i++) { /* aloca espaço para as strings */ mat[i]= (char *) malloc(sizeof(char) * 20); if (!mat[i]) { printf("Falha na alocação de memória!\n"); return 1; } printf("Digite uma palavra: "); fgets(mat[i], 20, stdin); /* imprime as strings */ for (i=0; i<5; i++) { puts(mat[i]); free(mat[i]); /* desaloca a string */ return 0; /* OBS: Quando um dado é alocado dinamicamente, é importante desalocá-lo antes de encerrar o programa. Se isso não for feito, a variável continuará ocupando espaço desnecessariamente após o término da execução do programa. Também é importante testar se ocorreu algum erro na alocação, para tratá-lo, se houver. */