Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra

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-
TECNOLOGIA EM REDES DE COMPUTADORES Algoritmos e programação de computadores Aula /08/2011 Professor Leomir J. Borba-
Programação II Estruturas de Dados
Programação II Estruturas de Dados
Alocação Dinâmida de Memória
LPG - I: Alocação Dinâmica de Memória - Ponteiros
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
Universidade de Brasília
Curso de C/C++ Avançado
Linguagem C Strings.
Vetores, Matrizes e Funções
Ponteiros em Linguagem C
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Fundamentos de Programação 1
Escola Secundária c/ 3º CEB da Batalha
Tratamento de Ficheiros
Listas Encadeadas.
Revisão da Linguagem C.
Vetor de Ponteiros Exemplo de Alocação. Escrever Vetor de Vetores de floats int main() { int i, k, n; float **vetor; // vetor de vetores int *tamanho;
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
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
PROGRAMAÇÃO ESTRUTURADA II
Linguagem de Programação II Parte IX
Definição de Tipos Estruturas e Ponteiros
Ordenação e Pesquisa de Dados Marco Antonio Montebello Júnior
INTELIGÊNCIA ARTIFICIAL
CADEIA DE CARACTERES (Strings)
Alocação Dinâmica de Memória
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Alocação Dinâmica de Memória
Aula Prática 12 Operações com Arquivos Monitoria
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Estruturas de Dados Aula 5: Matrizes
Algoritmos e Estruturas de Dados I – Ponteiros
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
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.
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Aula P.02 – BCC202 Revisão sobre Ponteiros Túlio Toffolo
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
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo IX Subprogramação e Recursividade.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Programação Computacional Aula 8: Entrada e Saída pelo Console Prof a. Madeleine Medrano
Programação de Computadores I – Ponteiros Profa. Mercedes Gonzales Márquez.
Algoritmo e Estrutura de Dados I Aulas 12 – Linguagem C Strings Márcia Marra
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
Estrutura de Dados Revisão Professor Luiz José Hoffmann Filho
Estruturas Homogêneas – Vetores e Matrizes
Algoritmo e Estrutura de Dados I Aulas 14 – Linguagem C Matriz Márcia Marra
Linguagem de Programação
COMPILADORES 07 Prof. Marcos.
Programação em C Aula 9.
Tipo Abstrato de Dados (TAD) Estrutura de Dados Professor: Rodrigo Alves Sarmento Professor: André Cypriano.
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)
Fundamentos de Programação 1
Transcrição da apresentação:

Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra

2 Modeladores (Cast) Um modelador é aplicado a uma expressão. Ele força a mesma a ser de um tipo especificado. Sua forma geral é: (tipo)expressão

3 Exemplo de uso de modelador #include int main () { int num; float f; num=10; /* Uso do modelador. Força a transformação de num em um float */ f=(float)num/7; printf ("%f",f); return(0); }

4 Alocação Dinâmica de Memória A alocação dinâmica permite ao programador criar variáveis em tempo de execução, ou seja, alocar memória para novas variáveis quando o programa está sendo executado. Deve ser utilizada quando não se sabe ao certo quanto de memória será necessário para o armazenamento das informações –A quantidade pode ser determinadas em tempo de execução conforme a necessidade do programa. –Dessa forma evita-se o desperdício de memória ou a falta de memória.

5 Alocação Dinâmica de Memória O padrão C ANSI define apenas 4 funções para o sistema de alocação dinâmica, disponíveis na biblioteca stdlib.h: –malloc –calloc –realloc –free

6 Malloc A função malloc() serve para alocar memória e tem o seguinte protótipo: void *malloc (unsigned int num); A funçao pega o número de bytes que queremos alocar (num), aloca na memória e retorna um ponteiro void * para o primeiro byte alocado.

7 Malloc A função retorna um ponteiro genérico (void *) para o ínicio da memória alocada que deverá conter espaço suficiente para armazenar num bytes. O ponteiro void * pode ser atribuído a qualquer tipo de ponteiro. Se não houver memória suficiente para alocar a memória requisitada a função malloc() retorna um ponteiro nulo.

8 Exemplo com malloc #include int main (void) { int *p; int a;... /* Determina o valor de a em algum lugar */ p=(int *)malloc(a*sizeof(int)); if (!p) { printf ("** Erro: Memoria Insuficiente**"); exit; }... return 0; }

9 Calloc A função calloc() também serve para alocar memória, mas possui um protótipo um pouco diferente: void *calloc (unsigned int num, unsigned int size); A funçao aloca uma quantidade de memória igual a num * size, isto é, aloca memória suficiente para uma matriz de num objetos de tamanho size. Retorna um ponteiro void * para o primeiro byte alocado.

10 Calloc O ponteiro void * pode ser atribuído a qualquer tipo de ponteiro. Se não houver memória suficiente para alocar a memória requisitada a função calloc() retorna um ponteiro nulo. Em relação a malloc, calloc tem uma diferença (além do fato de ter protótipo diferente): calloc inicializa o espaço alocado com 0.

11 Exemplo com calloc #include int main (void) { int *p; int a,i;... p=(int *)calloc(a, sizeof(int)); if (!p) { printf ("** Erro: Memoria Insuficiente**"); exit; }... for (i=0; i<a ; i++) p[i] = i*i;... return 0; }

12 Realloc A função realloc() serve para realocar memória e tem o seguinte protótipo: void *realloc (void *ptr, unsigned int num); A funçao modifica o tamanho da memória previamente alocada apontada por *ptr para aquele especificado por num. O valor de num pode ser maior ou menor que o original.

13 Realloc Um ponteiro para o bloco é devolvido porque realloc() pode precisar mover o bloco para aumentar seu tamanho. Se isso ocorrer, o conteúdo do bloco antigo é copiado no novo bloco, e nenhuma informação é perdida. Se ptr for nulo, aloca num bytes e devolve um ponteiro; se num é zero, a memória apontada por ptr é liberada. Se não houver memória suficiente para a alocação, um ponteiro nulo é devolvido e o bloco original é deixado inalterado.

14 Exemplo com realloc #include int main () { int *p; int a,i; a = 30; p= (int *)malloc(a*sizeof(int)); if (!p) { printf ("** Erro: Memoria Insuficiente**"); exit; } for (i=0; i<a ; i++) p[i] = i*i; /* O tamanho de p deve ser modificado, por algum motivo... */ a = 100; p = (int *)realloc (p, a*sizeof(int)); for (i=0; i<a ; i++) p[i] = a*i*(i-6);... return 0; }

15 Free Quando alocamos memória dinamicamente é necessário que nós a liberemos quando ela não for mais necessária. Para isto existe a função free() cujo protótipo é: void free (void *p);

16 Free Basta então passar para free() o ponteiro que aponta para o início da memória alocada. Mas você pode se perguntar: como é que o programa vai saber quantos bytes devem ser liberados? Ele sabe pois quando você alocou a memória, ele guardou o número de bytes alocados numa "tabela de alocação" interna.

17 Exemplo com free #include int main () { int *p; int a;... p= (int *)malloc(a*sizeof(int)); if (!p) { printf ("** Erro: Memoria Insuficiente **"); exit; }... free(p);... return 0; }

18 Pratique! Escreva um trecho de código que seja capaz de ler uma string do teclado e em seguida escrever a string. O seu código deve perguntar ao usuário o tamanho da string que ele deseja digitar.

19 Alocação Dinâmica de Vetores A alocação dinâmica de vetores utiliza os conceitos aprendidos na aula sobre ponteiros e as funções de alocação dinâmica apresentadas.

20 Exemplo de alocação dinâmica de vetor #include float *Alocar_vetor_real (int n) { float *v; /* ponteiro para o vetor */ /* verifica parametros recebidos */ if (n < 1) { printf ("** Erro: Parametro invalido **\n"); return (NULL); } /* aloca o vetor */ v = (float *)calloc (n, sizeof(float)); if (v == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } /* retorna o ponteiro para o vetor */ return (v); }

21 Exemplo de alocação dinâmica de vetor float *Liberar_vetor_real (float *v) { if (v == NULL) return (NULL); /* libera o vetor */ free(v); /* retorna o ponteiro */ return (NULL); } int main () { float *p; int a;... p = Alocar_vetor_real (a);... p = Liberar_vetor_real (p); return(0); }

22 Alocação Dinâmica de Matrizes A alocação dinâmica de memória para matrizes é realizada da mesma forma que para vetores, com a diferença que teremos um ponteiro apontando para outro ponteiro que aponta para o valor final, ou seja é um ponteiro para ponteiro, o que é denominado indireção múltipla. A indireção múltipla pode ser levada a qualquer dimensão desejada, mas raramente é necessário mais de um ponteiro para um ponteiro.

23 Alocação Dinâmica de Matrizes Um exemplo de implementação para matriz real bidimensional é fornecido a seguir. A estrutura de dados utilizada neste exemplo é composta por um vetor de ponteiros (correspondendo ao primeiro índice da matriz), sendo que cada ponteiro aponta para o início de uma linha da matriz. Em cada linha existe um vetor alocado dinamicamente, como descrito anteriormente (compondo o segundo índice da matriz).

24 Exemplo #include float **Alocar_matriz_real (int m, int n) { float **v; /* ponteiro para a matriz */ int i; /* verifica parametros recebidos */ if (m < 1 || n < 1) { printf ("** Erro: Parametro invalido **\n"); return (NULL); } /* aloca as linhas da matriz */ v = (float *)calloc (m, sizeof(float *)); // Vetor de m ponteiros para float if (v == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } /* aloca as colunas da matriz */ for ( i = 0; i < m; i++ ) { v[i] = (float *)calloc (n, sizeof(float)); // m vetores de n floats if (v[i] == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } return (v); }

25 Exemplo float **Liberar_matriz_real (int m, int n, float **v) { int i; if (v == NULL) return (NULL); /* verifica parametros recebidos */ if (m < 1 || n < 1) { printf ("** Erro: Parametro invalido **\n"); \ return (v); } for (i=0; i<m; i++) /* libera as linhas da matriz */ free (v[i]); /* libera a matriz (vetor de ponteiros) */ free (v); /* retorna um ponteiro nulo */ return (NULL); }

26 Exemplo int main (void) { float **mat; /* matriz a ser alocada */ int l, c; /* numero de linhas e colunas da matriz */ int i, j;... mat = Alocar_matriz_real (l, c); for (i = 0; i < l; i++) for ( j = 0; j < c; j++) mat[i][j] = i+j;... mat = Liberar_matriz_real (l, c, mat);... return(0) }