Alocação Dinâmica em C

Documentos relacionados
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

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

5. Vetores e alocação dinâmica

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

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

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

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

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

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

Métodos Computacionais. Vetores e Matrizes Dinâmicas

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

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

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

Estruturas de Dados. Profa. Juliana Pinheiro Campos

LINGUAGEM C: ALOCAÇÃO DINÂMICA

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

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

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

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

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

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

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

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

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

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

Reinaldo Gomes Alocação Dinâmica

Princípios de Desenvolvimento de Algoritmos MAC122

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

- Mapa de memória de um processo - Ponteiros

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

Estruturas Dinâmicas - Ponteiros

Estruturas dinâmicas Ponteiros

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

Linguagem C Ponteiros

Mais sobre Ponteiros em C

Ponteiros. Baseado nos slides do Prof. Mauro.

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

DAS5102 Fundamentos da Estrutura da Informação

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

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

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

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

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 de Variáveis

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

Algoritmos e Estruturas de dados

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

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

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

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

Aula 25: Alocação Dinâmica

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

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

Aula 24 Ponteiros, vetores e structs

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

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

Ponteiros e Alocação de Memória

1 Exercícios com ponteiros

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

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

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

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

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

Introdução à Computação

Ponteiros. Considere um carteiro recém-chegado na vila Na vila, a referência para se encontrar a casa é pelo morador

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

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

Introdução a Programação de Jogos

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

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

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

Introdução a Ponteiros e Vetores em C

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

Centro Universitário Franciscano Curso de Sistemas de Informação Disciplina de algoritmos e programação II. Ponteiros

MC-102 Aula 19 Ponteiros II

Algoritmos e Estruturas de Dados I (DCC/003) Variável Indexada Vetor

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

Funções em Linguagem C Parte II

Alocação dinâmica de Memória

BCC202 - Estrutura de Dados I

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

Ponteiros, ponteiros e vetores e alocação dinâmica de memória

Essencialmente, um ponteiro nada mais é do que uma variável que ao invés de conter um valor, contém um endereço de memória.

Estrutura de dados 1. Ponteiros

1 Exercícios com ponteiros

Ponteiros. Introdução

Programação Estruturada

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

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

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

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

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

Transcrição:

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação Alocação Dinâmica em C Profa Rosana Braga Adaptado de material preparado pela profa Silvana Maria Affonso de Lara 1º semestre de 2010 1

Roteiro da Aula Alocação Dinâmica de Memória Vetores e alocação dinâmica Alocação da memória principal Funções para alocar e liberar memória Alocação dinâmica de matrizes 2

Vetores e alocação dinâmica A forma mais simples de estruturarmos um conjunto de dados é por meio de vetores Definimos um vetor em C da seguinte forma: int v[10]; Esta declaração diz que v é um vetor de inteiros dimensionado com 10 elementos, isto é, reservamos um espaço de memória contínuo para armazenar 10 valores inteiros. Assim, se cada int ocupa 4 bytes, a declaração reserva um espaço de memória de 40 bytes 3

Vetores e alocação dinâmica O acesso a cada elemento do vetor é feito através de uma indexação da variável v. 144 Em C, a indexação de um vetor varia de zero a n-1, onde n representa a dimensão do vetor. v[0] acessa o primeiro elemento de v v[1] acessa o segundo elemento de v... Mas v[10] invade a memória 104 v 4

Vetores e alocação dinâmica float v[10]; int i; /* leitura dos valores */ for (i = 0; i < 10; i++) scanf("%f", &v[i] ); Observe que passamos para scanf o endereço de cada elemento do vetor ( &v[i] ), pois desejamos que os valores capturados sejam armazenados nos elementos do vetor. Se v[i] representa o (i+1)-ésimo elemento do vetor, &v[i] representa o endereço de memória onde esse elemento está armazenado Existe uma associação entre vetores e ponteiros, pois a variável v, que representa o vetor, é uma constante que armazena o endereço inicial do vetor, isto é, v, sem indexação, aponta para o primeiro elemento do vetor. 5

Vetores e alocação dinâmica num vetor temos as seguintes equivalências: v + 0 aponta para o primeiro elemento do vetor v + 1 aponta para o segundo elemento do vetor v + 9 aponta para o último elemento do vetor Portanto, escrever &v[i] é equivalente a escrever (v+i) De maneira análoga, escrever v[i] é equivalente a escrever *(v+i) (é lógico que a forma indexada é mais clara e adequada) Note que o uso da aritmética de ponteiros aqui é perfeitamente válido, pois os elementos dos vetores são armazenados de forma contínua na memória 6

Vetores e alocação dinâmica Passar um vetor para uma função consiste em passar o endereço da primeira posição do vetor. Se passarmos um valor de endereço, a função chamada deve ter um parâmetro do tipo ponteiro para armazenar este valor. Assim, se passarmos para uma função um vetor de int, devemos ter um parâmetro do tipo int*, capaz de armazenar endereços de inteiros Salientamos que a expressão passar um vetor para uma função deve ser interpretada como passar o endereço inicial do vetor. Os elementos do vetor não são copiados para a função, o argumento copiado é apenas o endereço do primeiro elemento. 7

Vetores e alocação dinâmica /* 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; } A saída do programa é 2 4 6, pois os elementos do vetor serão incrementados dentro da função. 8

Alocar memória dinamicamente a linguagem C oferece meios de requisitarmos espaços de memória em tempo de execução. Uso da memória (1) uso de variáveis globais (e estáticas). O espaço reservado para uma variável global existe enquanto o programa estiver sendo executado. (2) uso de variáveis locais. Neste caso, o espaço existe apenas enquanto a função que declarou a variável está sendo executada, sendo liberado para outros usos quando a execução da função termina. Assim, a função que chama não pode fazer referência ao espaço local da função chamada. (3) reservar memória requisitando ao sistema, em tempo de execução, um espaço de um determinado tamanho. 9

Alocar memória dinamicamente O espaço alocado dinamicamente permanece reservado até que explicitamente seja liberado pelo programa. Por isso, podemos alocar dinamicamente um espaço de memória numa função e acessá-lo em outra. A partir do momento que liberarmos o espaço, ele estará disponibilizado para outros usos e não podemos mais acessá-lo. Se o programa não liberar um espaço alocado, este será automaticamente liberado quando a execução do programa terminar. 10

Alocação da Memória Principal Código do Programa Variáveis Globais e Estáticas Memória Alocada Dinamicamente Memória Livre Pilha 11

Alocação da Memória Principal Para executar um determinado programa, o S.O. carrega na memória o código do programa, em linguagem de máquina. Além disso, o S.O. reserva os espaços necessários para armazenar as variáveis globais (e estáticas) do programa O restante da memória livre é utilizado pelas variáveis locais e pelas variáveis alocadas dinamicamente. 12

Alocação da Memória Principal Cada vez que uma função é chamada, o S.O. reserva o espaço necessário para as variáveis locais da função. Este espaço pertence à pilha de execução e, quando a função termina, é liberado. A memória não ocupada pela pilha de execução pode ser requisitada dinamicamente. Se a pilha tentar crescer mais do que o espaço disponível existente, dizemos que ela estourou e o programa é abortado com erro. 13

Alocação Dinâmica de Memória As funções calloc e malloc permitem alocar blocos de memória em tempo de execução size void * malloc( ); número de bytes alocados /* retorna um ponteiro void para n bytes de memória não iniciados. Se não há memória disponível malloc retorna NULL */ 14

Alocação Dinâmica de Memória As funções calloc e malloc permitem alocar blocos de memória em tempo de execução void * calloc(n, size); /* calloc retorna um ponteiro para um array com n elementos de tamanho size cada um ou NULL se não houver memória disponível. Os elementos são iniciados em zero */ o ponteiro retornado por malloc e calloc deve ser convertido para o tipo de ponteiro que invoca a função 15

Alocação da Memória Principal Exemplos Código que aloca 1000 bytes de memória livre: char *p; p = malloc(1000); Código que aloca espaço para 50 inteiros: int *p; p = malloc(50*sizeof(int)); Obs.: O operador sizeof() retorna o número de bytes de um inteiro. 16

Funções para Alocar e Liberar memória Função básica para alocar memória é malloc int *vet; vet = malloc(10*4); Após esses comandos, se a alocação for bem sucedida, vet armazenará o endereço inicial de uma área contínua de memória suficiente para armazenar 10 valores inteiros. Desta forma, consideramos que um inteiro ocupa 4 bytes. Para ficarmos independentes de compiladores e máquinas, usamos o operador sizeof( ) v = malloc(10*sizeof(int)); 17

Funções para Alocar e Liberar memória A função malloc é usada para alocar espaço para armazenarmos valores de qualquer tipo. Por este motivo, malloc retorna um ponteiro genérico, para um tipo qualquer, representado por void*, que pode ser convertido automaticamente pela linguagem para o tipo apropriado na atribuição. No entanto, é comum fazermos a conversão explicitamente, utilizando o operador de molde de tipo (cast). Então: v = (int *) malloc(10*sizeof(int)); 18

Funções para Alocar e Liberar memória Se não houver espaço livre suficiente para realizar a alocação, a função retorna um endereço nulo (representado pelo símbolo NULL, definido em stdlib.h). Podemos tratar o erro na alocação do programa verificando o valor de retorno da função malloc Ex: imprimindo mensagem e abortando o programa com a função exit, também definida na stdlib. Int * v; 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 */ } 19

Liberação de Memória int *pi = (int *) malloc (sizeof(int)); /* aloca espaço para um inteiro */ int *ai = (int *) calloc (n, sizeof(int)); /* aloca espaço para um array de n inteiros */ toda memória não mais utilizada deve ser liberada através da função free(): free(ai); /* libera todo o array */ free(pi); /* libera o inteiro alocado */ 20

Exercício 1 Escreva um programa em C que solicita ao usuário um número n e então lê um vetor de n notas e calcula a média aritmética. Usar alocação dinâmica do vetor Liberar a memória ao final Não limitar o uso de memória 21

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, o que é denominado indireção múltipla A indireção múltipla pode ser levada a qualquer dimensão desejada. 22

Alocação dinâmica de matrizes ** p0 ** p2+1 ** p3+3

Alocação dinâmica de matrizes Cada linha da matriz é representada por um vetor independente. A matriz é então representada por um vetor de vetores, ou vetor de ponteiros, no qual cada elemento armazena o endereço do primeiro elemento de cada linha

Alocação dinâmica de matrizes #include <stdio.h> #include <stdlib.h> float **Alocar_matriz_real (int m, int n) { float **v; /* ponteiro para a matriz */ int i; /* variavel auxiliar */ if (m < 1 n < 1) { /* verifica parametros recebidos */ printf ("** Erro: Parametro invalido **\n"); return (NULL); } /* aloca as linhas da matriz */ v = (float **) calloc (m, sizeof(float *)); if (v == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } 25

Alocação dinâmica de matrizes /* aloca as colunas da matriz */ for ( i = 0; i < m; i++ ) { v[i] = (float*) calloc (n, sizeof(float)); if (v[i] == NULL) { printf ("** Erro: Memoria Insuficiente **"); return (NULL); } } return (v); /* retorna o ponteiro para a matriz */ } 26

Alocação dinâmica de matrizes float **Liberar_matriz_real (int m, int n, float **v) { int i; /* variavel auxiliar */ if (v == NULL) return (NULL); if (m < 1 n < 1) { /* verifica parametros recebidos */ printf ("** Erro: Parametro invalido **\n"); return (v); } for (i = 0; i < m; i++) free (v[i]); /* libera as linhas da matriz */ free (v); /* libera a matriz */ return (NULL); /* retorna um ponteiro nulo */ } 27

Alocação dinâmica de matrizes void main (void) { float **mat; /* matriz a ser alocada */ int l, c; /* numero de linhas e colunas da matriz */... /* outros comandos, inclusive inicializacao para l e c */ mat = Alocar_matriz_real (l, c);... /* outros comandos utilizando mat[][] normalmente */ mat = Liberar_matriz_real (l, c, mat);... } 28

Exercício 2 Modificar o programa de alocação dinâmica de matrizes dado anteriormente (slides 25 a 28) para que leia aloque dinamicamente duas matrizes de 3 por 4, leia seus elementos e imprima a matriz soma.