Modulo 12: alocação dinâmica de memória

Documentos relacionados
Alocação dinâmica de Memória

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

Plano de Aula Segunda-feira Tarde 13/10/2014 Objetivo: Introduzir o conceito de alocação dinâmica na memória e registros / structs.

Laboratório de Programação II

a) Preencher um vetor com os números 0 a 10, e depois mostrar somente os elementos pares.

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

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

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

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

LINGUAGEM C: ALOCAÇÃO DINÂMICA

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

Ponteiros. Introdução e Alocação Dinâmica

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

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

Professor: Jó Ueyama Estagiário PAE: Heitor Freitas

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

Programação Procedimental GBC /1 Prof. Renan Cattelan Prática 10. Estruturas e alocação dinâmica

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

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

Laboratório de Introdução à Ciência da Computação I

Ponteiros. Introdução

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

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

Linguagem C. Ponteiros. Alex Vidigal Bastos.

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

Princípios de Desenvolvimento de Algoritmos MAC122

Reinaldo Gomes Alocação Dinâmica

Alocação Dinâmica em C

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

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

Estruturas dinâmicas Ponteiros

MC-102 Aula 19 Ponteiros II

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

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

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

Programação. Cap. 12 Gestão de Memória Dinâmica

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

Fundamentos de Programação

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

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

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

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

Estruturas Dinâmicas - Ponteiros

- Mapa de memória de um processo - Ponteiros

ALOCAÇÃO DINÂMICA DE MEMORIA Lista 10. A linguagem C/C++ possui recursos para alocação dinâmica de memoria.

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

Alocação Dinâmica de Memória - Exercício

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

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 11 Gestão de Memória Dinâmica

DAS5102 Fundamentos da Estrutura da Informação

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Modulo 11:Endereços e ponteiros

Ponteiros & tabelas (cont.) K&R: Capítulo 5

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

1 Exercícios com ponteiros

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

Curso de Programação C em Ambientes Linux Aula 05

INF 1007 Programação II

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

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

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

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

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

1 Exercícios com ponteiros

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

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

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

MCTA001 Algoritmos e Estruturas de Dados I Aula 02: Ponteiros e estruturas

Aula 24 Ponteiros, vetores e structs

Professora Jeane Melo

BCC202 - Estrutura de Dados I

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

MCTA028 Programação Estruturada Aula 09: - Ponteiros (parte 2)

A sintaxe para se declarar uma variável do tipo ponteiro é dada por:

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

Métodos Computacionais. Vetores e Matrizes Dinâmicas

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

Introdução à Computação

Alocação Dinâmica de Memória

MCTA028 Programação Estruturada Aula 09: - Ponteiros (parte 2)

Função "malloc" e "calloc":

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

Correção dos exercícios

Instituto Federal da Bahia Análise e Desenvolvimento de Sistemas INF029 Laboratório de Programação Aula 03: Ponteiros

5. Vetores e alocação dinâmica

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

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

Tipos Abstratos de Dados. Estrutura de Dados

10 a Aula - Operadores de Molde ( Casting ). Atribuição de Memória. Ponteiros. Enumerados. Mestrado em Engenharia Física Tecnológica

11a. Aula Ponteiros e Vetores

Programação II. Aula 1

Programação de Computadores II

Fundamentos de Programação

Aula 25: Alocação Dinâmica

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2017/2018

Transcrição:

PROGRAMAÇÃO DE COMPUTADORES V - TCC- 00.323 Modulo 12: alocação dinâmica de memória Aura - Erick aconci@ic.uff.br, erickr@id.uff.br

Roteiro porque e como utilizar a alocação dinâmica funções: malloc ( ), calloc ( ), realloc ( ) e free ( ). Trabalho 8 2

A alocação é estática As declarações abaixo alocam espaço de memória 3 variáveis. A alocação é estática (nada a ver com a palavrachave static), ou seja, acontece antes que o programa comece a ser executado: char c; int i; int v[10];

funções malloc e free de stdlib. Às vezes, a quantidade de memória a alocar só se torna conhecida durante a execução do programa. Para lidar com essa situação é preciso recorrer à alocação dinâmica de memória. A alocação dinâmica é gerenciada pelas funções malloc e free, que estão na biblioteca stdlib. Para usar esta biblioteca, você deve incluir a correspondente interface no seu programa por meio de #include <stdlib.h>

Alocação dinâmica é o processo que obter memória em tempo de execução (quando o programa está sendo usado). Ela é utilizada quando não se sabe ao certo quanto de memória será necessário para o armazenamento das informações, podendo ser determinadas em tempo de execução conforme a necessidade do programa. Dessa forma evita-se o desperdício de memória.

No C padrão existem 4 funções para alocações dinâmica pertencentes a biblioteca stdlib.h. São elas : malloc ( ), calloc ( ), realloc ( ) e free ( ). Sendo mais utilizadas são malloc ( ) e free ( ). As funções malloc() e calloc() são responsáveis por alocar memória, a realloc() por realocar a memória e por último a free() fica responsável por liberar a memória alocada.

A alocação dinâmica é muito utilizada em casos que usam muito volume de dados. A sintaxe da função malloc() é : void * malloc ( size_t size ) esta função recebe como parâmetro size que é o número de bytes de memória que se deseja alocar. O tipo size_t é definido em stdlib.h como sendo um inteiro sem sinal. Esta função retorna um ponteiro do tipo void podendo assim ser atribuído a qualquer tipo de ponteiro.

Como se faz? Suponha que seja necessário no meio do código alocar uma memória com 1500 bytes, para isto seria necessário apenas digitar as seguintes linhas de código: cha * str ; str = malloc ( 1500 ) ; ( o nome é uma abreviatura de memory allocation )

A função malloc aloca um bloco de bytes consecutivos na memória do computador e devolve o endereço desse bloco. O número de bytes é especificado no argumento que voce vai passar para a função. O endereço devolvido por malloc é do tipo genérico: void *. O programador, você, armazena esse endereço num ponteiro de tipo apropriado, para seu programa e caso!

Alocação dinâmica é muito utilizada em casos que não se sabe antes o volume de dados.

Quando não se sabe antes a quantidade de elementos a serem utilizados deve-se utilizar a alocação dinâmica. O exemplo anterior é muito simples, mas mostra em que situação se deve utilizar alocação dinâmica. Vemos que não se sabe a quantidade de valores que vai ser inserido no vetor, por esse motivo declaramos um vetor de 99 posições. Mas e se a pessoa, por exemplo, deseja colocar apenas 3 elementos no vetor. Como o vetor foi declarado com o tamanho igual a 99, o que acontece é o desperdício de memória. Mas, e caso passe de 100 haverá um estouro. Portanto a melhor solução é utilizar alocação dinâmica.

O mesmo exemplo mostrado anteriormente com o uso de alocação dinâmica (usando a função malloc() ) :

Heap é a região de memória livre do seu computador. Agora o usuário pode digitar o tamanho do vetor que quiser que não haverá desperdício de memória e o vetor a ser alocado será do tamanho digitado pelo usuário. A função malloc() utilizada no programa, devolve um ponteiro do tipo void, desta forma pode-se ser atribuído a qualquer tipo de ponteiro (no exemplo é atribuído a um ponteiro do tipo inteiro). A memória alocada pela função malloc(), como também por outras funções com o mesmo fim que vamos ver no decorrer desta aula, deve ser obtida do heap.

Há espaço? É necessário verificar se a memória livre ( heap ) é suficiente para o armazenamento e isto pode ser feito como mostrado na segunda seta no exemplo anterior : Caso a função malloc() devolver o valor nulo significa que não há memória suficiente e nesse caso o programa apresenta na tela a mensagem : Memória insuficiente e imediatamente termina o programa através da função exit().

Perigo!!! As variáveis alocadas estaticamente dentro de uma função desaparecem quando a execução da função termina. Já as variáveis alocadas dinamicamente continuam a existir mesmo depois que a execução da função termina. Se for necessário liberar a memória ocupada por essas variáveis, é preciso recorrer à função free.

free ( ) ; A função free ( ) usada neste exemplo, na terceira seta, e que você deve usar com as demais funções de alocação dinâmica serve para liberar a memória alocada. E sua sintaxe é a seguinte: void free ( void *p ) ; O p é um ponteiro que aponta para a memória alocada anteriormente, no programa anterior, o ponteiro vet.

dangling pointers?? A função free libera a porção de memória alocada. A instrução free (ptr) avisa ao sistema que o bloco de bytes apontado por ptr está livre. A próxima chamada de alocação poderá tomar posse desses bytes. A função free não deve ser aplicada a uma parte de um bloco de bytes alocado: aplique free apenas ao bloco todo.

Convém não deixar ponteiros soltos (= dangling pointers) no seu programa, pois isso pode ser explorado por hackers para atacar o seu computador. Portanto, depois de cada free (ptr), atribua NULL a ptr: free (ptr); ptr = NULL;

OBS. Cada invocação de malloc aloca um bloco de bytes consecutivos maior que o solicitado: os bytes adicionais são usados para guardar informações administrativas sobre o bloco de bytes (essas informações permitem que o bloco seja corretamente desalocado, mais tarde, pela free. O número de bytes adicionais pode ser grande, e maior que o número de bytes solicitado no argumento de malloc. Não é ineficiente, portanto, alocar pequenos blocos de bytes; é preferível alocar um grande bloco por vez.

outras funções padrões de alocação dinâmica: calloc ( ) Esta função também tem como objetivo alocar memória e possui a seguinte sintaxe: void *calloc ( unsigned int num, unsigned int size); num representa a quantidade de memória a ser alocada e size é o seu tamanho. Esta função inicia o espaço alocado com 0. Podemos usar, no exemplo anterior, calloc ( ) só alterando na segunda seta:

O mesmo exemplo: A função sizeof( ) retorna o tamanho em bytes do tipo de dado, que no nosso exemplo é inteiro, int, isto é importante para que o programa seja portável.

realloc ( ) Esta função é responsável por realocar a memória cuja a sintaxe é: void * realloc ( void * p, size_t size ) Desta forma pode-se alterar o tamanho da memória anteriormente alocado por *p para o tamanho especificado por um novo valor (size).

exemplo de realloc ( )

Obs. Neste último programa usamos a função strcpy() que copia a string entre aspas para a string destino, que no nosso caso é uma variável com o nome de string. Para utilizar esta função foi necessário inserir no cabeçalho #include <string.h>. Nos exemplos mostrados system( Pause ) tem o mesmo papel que o getch() e serve para que o programa dê uma pausa. Para se utilizar o system( Pause ) é necessário inserir no cabeçalho #include<stdlib.h>.

Referencias http://www.ime.usp.br/~pf/algoritmos/ http://juliobattisti.com.br/tutoriais/katiaduarte/cbasico009.asp http://www.ime.usp.br/~pf/algoritmos/aulas/aloca.html http://www.inf.puc-rio.br/~inf1007/material/slides/alocacaodinamica.pdf http://www.di.ufpb.br/liliane/aulas/alocacao.html http://www.inf.ufpr.br/cursos/ci067/docs/notasaula/notas-32_aloca_c_cao_dinamica_mem.html http://linguagemc.xpg.uol.com.br/aloc_dinamica.html https://www.youtube.com/watch?v=fd0bi4h08iu https://pt.wikipedia.org/wiki/gerenciamento_de_mem%c3%b3ria 25

8º Trabalho - Entrega: 11 / 03 /2016 Escreva duas novas versões do 7º Trabalho onde seja usada : malloc ( ) e free ( ), calloc ( ) e free ( ), para um vetor que tenha em cada elemento a estrutura produtos_supermercado e cujo número de elementos seja definido pelo usuário apenas em tempo de execução.