Módulo 5 Vetores e Alocação Dinâmica

Documentos relacionados
INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

Programação de Computadores II. Cap. 5 Alocação Dinâmica

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

INF 1007 Programação II

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

5. Vetores e alocação dinâmica

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Alocação Dinâmica em C

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Programação de Computadores II. Cap. 5 Vetores

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Alocação Dinâmica de Memória. Programação II

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Alocação Dinâmica. Introdução à Computação

Alocação Estática e Dinâmica. Prof. M.Sc. Mariella Berger

Estruturas de Dados. Módulo 6 Matrizes. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2. 4 Tipos Estruturados. 10/23/09 (c) Dept. Informática - PUC-Rio 1

Módulo 8 Tipos Estruturados

1/34 GESTÃO DINÂMICA DE MEMÓRIA

Revisão: Ponteiros e Alocação Dinámica

Estrutura de Dados. Aula 07 Alocação Dinâmica

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Ponteiros de Variáveis

Referências. Programação de Computadores II. Cap. 6 Matrizes. Tópicos. Alocação Estática versus Dinâmica. Alocação Estática versus Dinâmica

Programação de Computadores II. Cap. 4 Funções

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Ponteiros e Alocação de Memória

Introdução à Programação

INF 1007 Programação II

Exercícios Capítulos 5 e 6

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Estruturas de Dados Aula 2: Estruturas Estáticas. Tipos Básicos. Quantos valores distintos podemos representar com o tipo char?

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

Módulo 7 Cadeias de Caracteres

Linguagem C: Ponteiros - Alocação Dinâmica

Aula 25: Alocação Dinâmica

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

Reinaldo Gomes Alocação Dinâmica

Estrutura de dados 1. Ponteiros

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Ponteiros em C. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

1 Exercícios com ponteiros

Ponteiros - Parte I. Ponteiros, Ponteiros e Vetores, Algoritmo Bubble Sort, Alocação Dinâmica de Memória

SSC304 Introdução à Programação Para Engenharias. Alocação Dinâmica. GE4 Bio

Princípios de Desenvolvimento de Algoritmos MAC122

Algoritmos e Estruturas de dados

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

Ponteiros. prof. Fabrício Olivetti de França

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Programação I Ponteiros e alocação dinâmica de memória. Prof. Carlos Alberto

ponteiros INF Programação I Prof. Roberto Azevedo

Métodos Computacionais. Tipos Estruturados

Programação Computacional Aula 16: Alocação Dinâmica de Memória

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

LINGUAGEM C: ALOCAÇÃO DINÂMICA

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

INF 1007 Programação II

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Programação de Computadores II. Cap. 7 Cadeias de Caracteres

MC-102 Aula 19 Ponteiros II

Estruturas Dinâmicas - Ponteiros

Módulo 10 Listas Encadeadas

Estruturas de Dados. Módulo 2 Expressões. 9/8/2005 (c) Marco A. Casanova - PUC-Rio 1

Introdução a Programação. Ponteiros e Passagem de Argumentos por Referência

O que é um apontador em C (type pointer in C)?

- Mapa de memória de um processo - Ponteiros

ESTRUTURA DE DADOS (TCC )

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

Ponteiros. Baseado nos slides do Prof. Mauro.

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

INF 1007 Programação II

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

Linguagem C: Elementos fundamentais

Revisão para Prova 2. Mirella M. Moro

Ponteiros e alocação dinâmica de memória. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica.

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Aula 17: Ponteiros e Alocação Dinâmica em C

Ponteiros e Tabelas. K&R: Capítulo 5

Aula 24 Ponteiros, vetores e structs

Linguagem C. Ponteiros. Alex Vidigal Bastos.

1 Exercícios com ponteiros

Estruturas dinâmicas Ponteiros

3. Linguagem de Programação C

Ponteiros e Alocação Dinâmica. Prof. Péricles Miranda

Transcrição:

Estruturas de Dados Módulo 5 Vetores e Alocação Dinâmica 1/9/2005 (c) Dept. Informática - PUC-Rio 1

Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004) Capítulo 5 Vetores e alocação dinâmica 1/9/2005 (c) Dept. Informática - PUC-Rio 2

Tópicos Vetores Alocação dinâmica Vetores locais e funções 1/9/2005 (c) Dept. Informática - PUC-Rio 3

Vetores Vetor: estrutura de dados definindo um conjunto enumerável Exemplo: int v[10]; v = vetor de inteiros com 10 elementos 1/9/2005 (c) Dept. Informática - PUC-Rio 4

Vetores Vetor (cont.): vetor pode ser inicializado Exemplo: v = vetor de inteiros com 10 elementos int v[5] = { 5, 10, 15, 20, 25 }; ou simplesmente: int v[] = { 5, 10, 15, 20, 25 }; 1/9/2005 (c) Dept. Informática - PUC-Rio 5

Vetores Vetor (cont.): acesso a cada elemento é feito através de indexação da variável Exemplo: v = vetor de inteiros com 10 elementos v[0] = 0; /* acessa o primeiro elemento de v */... v[9] = 9; /* acessa o último elemento de v */ v[10] =10 /* ERRADO (invasão de memória) */ 1/9/2005 (c) Dept. Informática - PUC-Rio 6

Vetores Vetor (cont): vetor é alocado em posições contíguas de memória Exemplo: v = vetor de inteiros com 10 elementos espaço de memória de v = 10 x valores inteiros de 4 bytes = 40 bytes 144 v 104 1/9/2005 (c) Dept. Informática - PUC-Rio 7

Vetores Vetores e ponteiros: nome do vetor aponta para endereço inicial C permite aritmética de ponteiros Exemplo: v+0 : primeiro elemento de v... v+9 : último elemento de v Exemplo: &v[i] é equivalente a (v+i) v+9 v+8 v+7 v+2 v+1 v+0 144 *(v+i) é equivalente a v[i] v 104 1/9/2005 (c) Dept. Informática - PUC-Rio 8

Vetores Exemplo: cálculo da média e da variância de um conjunto de 10 números reais implementação m = x, N v = ( x m) valores são lidos e armazenados em um vetor de 10 posições cálculos da média e da variância efetuados sobre o conjunto de valores armazenado N 2 1/9/2005 (c) Dept. Informática - PUC-Rio 9

/* Cálculo da média e da variância de 10 números reais */ #include <stdio.h> int main ( void ) { float v[10]; /* declara vetor com 10 elementos */ float med, var; /* variáveis para a média e a variância */ int i; /* variável usada como índice do vetor */ /* leitura dos valores */ for (i = 0; i < 10; i++) /* faz índice variar de 0 a 9 */ scanf("%f", &v[i]); /* lê cada elemento do vetor (digitados na mesma linha) */ endereço da i-ésima posição de v 1/9/2005 (c) Dept. Informática - PUC-Rio 10

/* cálculo da média */ med = 0.0; /* inicializa média com zero */ for (i = 0; i < 10; i++) med = med + v[i]; /* acumula soma dos elementos */ med = med / 10; /* calcula a média */ /* cálculo da variância */ var = 0.0; /* inicializa com zero */ for ( i = 0; i < 10; i++ ) var = var+(v[i]-med)*(v[i]-med); /* acumula */ var = var / 10; /* calcula a variância */ comando não pertence ao corpo do for } /* exibição do resultado */ printf ( "Media = %f Variancia = %f \n", med, var ); return 0; 1/9/2005 (c) Dept. Informática - PUC-Rio 11

Vetores Passagem de vetor para função: consiste em passar o endereço da primeira posição do vetor função deve ter parâmetro do tipo ponteiro para armazenar valor passar um vetor para uma função é equivalente a passar o endereço inicial do vetor elementos do vetor não são copiados para a função argumento copiado é apenas o endereço do primeiro elemento Exemplo: chamada a função passando vetor de int função deve ter um parâmetro do tipo int 1/9/2005 (c) Dept. Informática - PUC-Rio 12

/* Cálculo da média e da variância de 10 reais (segunda versão) */ #include <stdio.h> /* Função para cálculo da média */ float media (int n, float* v) { int i; float s = 0.0; for (i = 0; i < n; i++) s += v[i]; return s/n; } parâmetro do tipo ponteiro para float 1/9/2005 (c) Dept. Informática - PUC-Rio 13

/* Função para cálculo da variância */ float variancia (int n, float* v, float m) { int i; float s = 0.0; for (i = 0; i < n; i++) s += (v[i] - m) * (v[i] - m); return s/n; } 1/9/2005 (c) Dept. Informática - PUC-Rio 14

int main ( void ) { float v[10]; float med, var; int i; /* leitura dos valores */ for ( i = 0; i < 10; i++ ) scanf("%f", &v[i]); med = media(10,v); var = variancia(10,v,med); } printf ( "Media = %f Variancia = %f \n", med, var); return 0; 1/9/2005 (c) Dept. Informática - PUC-Rio 15

Vetores Passagem de vetor para função (cont.): função pode alterar os valores dos elementos do vetor pois recebe o endereço do primeiro elemento do vetor (e não os elementos propriamente ditos) Exemplo: função incrementando todos os elementos de uma unidade 1/9/2005 (c) Dept. Informática - PUC-Rio 16

/* Incrementa elementos de um vetor */ #include <stdio.h> void incr_vetor ( int n, int *v ) { int i; for (i = 0; i < n; i++) v[i]++; } int main ( void ) { int a[ ] = {1, 3, 5}; incr_vetor(3, a); printf("%d %d %d \n", a[0], a[1], a[2]); return 0; } saída do programa será 2 4 6 1/9/2005 (c) Dept. Informática - PUC-Rio 17

Alocação Dinâmica Uso da memória: uso de variáveis globais (e estáticas): espaço reservado para uma variável global existe enquanto o programa estiver sendo executado uso de variáveis locais: espaço existe apenas enquanto a função que declarou a variável está sendo executada liberado para outros usos quando a execução da função termina variáveis globais ou locais podem ser simples ou vetores: para vetor, é necessário informar o número máximo de elementos pois o compilador precisa calcular o espaço a ser reservado 1/9/2005 (c) Dept. Informática - PUC-Rio 18

Alocação Dinâmica Uso da memória: alocação dinâmica: espaço de memória é requisitada em tempo de execução espaço permanece reservado até que seja explicitamente liberado depois de liberado, espaço estará disponibilizado para outros usos e não pode mais ser acessado espaço alocado e não liberado explicitamente, será automaticamente liberado quando ao final da execução 1/9/2005 (c) Dept. Informática - PUC-Rio 19

Alocação Dinâmica Uso da memória: memória estática: código do programa variáveis globais variáveis estáticas memória dinâmica: variáveis alocadas dinamicamente memória livre variáveis locais memória estática memória dinâmica Código do programa Variáveis globais e Variáveis estáticas Variáveis alocadas dinamicamente Memória livre Variáveis locais (Pilha de execução) 1/9/2005 (c) Dept. Informática - PUC-Rio 20

Alocação Dinâmica Uso da memória: alocação dinâmica de memória: usa a memória livre se o espaço de memória livre for menor que o espaço requisitado, a alocação não é feita e o programa pode prever tratamento de erro pilha de execução: utilizada para alocar memória quando ocorre chamada de função: sistema reserva o espaço para as variáveis locais da função quando a função termina, espaço é liberado (desempilhado) se a pilha tentar crescer mais do que o espaço disponível existente, programa é abortado com erro memória estática memória dinâmica Código do programa Variáveis globais e Variáveis estáticas Variáveis alocadas dinamicamente Memória livre Variáveis locais (Pilha de execução) 1/9/2005 (c) Dept. Informática - PUC-Rio 21

Alocação Dinâmica Funções da biblioteca padrão stdlib.h contém uma série de funções pré-definidas: funções para tratar alocação dinâmica de memória constantes pré-definidas... 1/9/2005 (c) Dept. Informática - PUC-Rio 22

Alocação Dinâmica Função sizeof : retorna o número de bytes ocupado por um tipo Função malloc : recebe como parâmetro o número de bytes que se deseja alocar retorna um ponteiro genérico para o endereço inicial da área de memória alocada, se houver espaço livre: ponteiro genérico é representado por void* ponteiro é convertido automaticamente para o tipo apropriado ponteiro pode ser convertido explicitamente retorna um endereço nulo, se não houver espaço livre: representado pelo símbolo NULL 1/9/2005 (c) Dept. Informática - PUC-Rio 23

Alocação Dinâmica Exemplo: alocação dinâmica de um vetor de inteiros com 10 elementos malloc retorna o endereço da área alocada para armazenar valores inteiros ponteiro de inteiro recebe endereço inicial do espaço alocado int *v; v = (int *) malloc(10*sizeof(int)); 1/9/2005 (c) Dept. Informática - PUC-Rio 24

Alocação Dinâmica Exemplo (cont.): v = (int *) malloc(10*sizeof(int)); 1 - Declaração: int *v Abre-se espaço na pilha para o ponteiro(variável local) 2 - Comando: v = (int *) malloc (10*sizeof(int)) Reserva espaço de memória da área livre e atribui endereço à variável Código do Programa Variáveis Globais e Estáticas Livre Código do Programa Variáveis Globais e Estáticas 40 bytes Livre 504 v - v 504 1/9/2005 (c) Dept. Informática - PUC-Rio 25

Alocação Dinâmica Exemplo (cont.): v armazena endereço inicial de uma área contínua de memória suficiente para armazenar 10 valores inteiros v pode ser tratado como um vetor declarado estaticamente v aponta para o inicio da área alocada v[0] acessa o espaço para o primeiro elemento v[1] acessa o segundo... até v[9] 1/9/2005 (c) Dept. Informática - PUC-Rio 26

Alocação Dinâmica Exemplo (cont.): tratamento de erro após chamada a malloc imprime mensagem de erro aborta o programa (com a função exit) v = (int*) malloc(10*sizeof(int)); if (v==null) { printf("memoria insuficiente.\n"); exit(1); /* aborta o programa e retorna 1 para o sist. operacional */ } 1/9/2005 (c) Dept. Informática - PUC-Rio 27

Alocação Dinâmica função free : recebe como parâmetro o ponteiro da memória a ser liberada a função free deve receber um endereço de memória que tenha sido alocado dinamicamente free (v); 1/9/2005 (c) Dept. Informática - PUC-Rio 28

/* Cálculo da média e da variância de n reais */ #include <stdio.h> #include <stdlib.h>... int main ( void ) { int i, n; float *v; float med, var; /* leitura do número de valores */ scanf("%d", &n); /* alocação dinâmica */ v = (float*) malloc(n*sizeof(float)); if (v==null) { printf("memoria insuficiente.\n ); return 1; } 1/9/2005 (c) Dept. Informática - PUC-Rio 29

/* leitura dos valores */ for (i = 0; i < n; i++) scanf("%f", &v[i]); med = media(n,v); var = variancia(n,v,med); printf("media = %f Variancia = %f \n", med, var); /* libera memória */ free(v); return 0; } 1/9/2005 (c) Dept. Informática - PUC-Rio 30

Vetores Locais a Funções Área de memória de uma variável local: só existe enquanto a função que declara a variável estiver sendo executada requer cuidado quando da utilização de vetores locais dentro de funções Exemplo: produto vetorial de dois vetores u e v em 3D, representados pelas três componentes x, y, e z { u v v u, u v v u u v v u } u v =, y z y z z x z x x y x y 1/9/2005 (c) Dept. Informática - PUC-Rio 31

Vetores Locais a Funções float* prod_vetorial (float* u, float* v) { float p[3]; p[0] = u[1]*v[2] v[1]*u[2]; p[1] = u[2]*v[0] v[2]*u[0]; p[2] = u[0]*v[1] v[0]*u[1]; return p; /* ERRO: não podemos retornar endereço de área local (p é vetor) */ } variável p declarada localmente: área de memória que a variável p ocupa deixa de ser válida quando a função prod_vetorial termina função que chama prod_vetorial não pode acessar a área apontada pelo valor retornado 1/9/2005 (c) Dept. Informática - PUC-Rio 32

Vetores Locais a Funções float* prod_vetorial (float* u, float* v) { } float *p = (float*) malloc(3*sizeof(float)); p[0] = u[1]*v[2] v[1]*u[2]; p[1] = u[2]*v[0] v[2]*u[0]; p[2] = u[0]*v[1] v[0]*u[1]; return p; variável p alocada dinamicamente área de memória que a variável p ocupa permanece válida mesmo após o término da função prod_vetorial função que chama prod_vetorial pode acessar o ponteiro retornado problema - alocação dinâmica para cada chamada da função: ineficiente do ponto de vista computacional requer que a função que chama seja responsável pela liberação do espaço 1/9/2005 (c) Dept. Informática - PUC-Rio 33

Vetores Locais a Funções void prod_vetorial (float* u, float* v, float* p) { } p[0] = u[1]*v[2] v[1]*u[2]; p[1] = u[2]*v[0] v[2]*u[0]; p[2] = u[0]*v[1] v[0]*u[1]; espaço de memória para o resultado passado pela função que chama: função prod_vetorial recebe três vetores, dois vetores com dados de entrada um vetor para armazenar o resultado solução mais adequada pois não envolve alocação dinâmica 1/9/2005 (c) Dept. Informática - PUC-Rio 34

Resumo Vetor: alocação de vetor: tipo nome[ #elementos]; acesso a cada elemento: nome do vetor: através de indexação da variável aponta para endereço inicial Funções para gerência de memória: sizeof malloc free retorna o número de bytes ocupado por um tipo recebe o número de bytes que se deseja alocar retorna um ponteiro para o endereço inicial, ou retorna um endereço nulo (NULL) recebe o ponteiro da memória a ser liberada 1/9/2005 (c) Dept. Informática - PUC-Rio 35