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

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

Alocação Dinâmica em C

5. Vetores e alocação dinâmica

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

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

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

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

INF 1007 Programação II

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

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

Estrutura de Dados. Aula 07 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

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

Estruturas dinâmicas Ponteiros

Reinaldo Gomes Alocação Dinâmica

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

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

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

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

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

LINGUAGEM C: ALOCAÇÃO DINÂMICA

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

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

Estruturas Dinâmicas - Ponteiros

DAS5102 Fundamentos da Estrutura da Informação

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

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

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

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

Princípios de Desenvolvimento de Algoritmos MAC122

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Alocação dinâmica de Memória

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

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

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

Ponteiros. Baseado nos slides do Prof. Mauro.

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

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

Aula 25: Alocação Dinâmica

1 Exercícios com ponteiros

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

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

- Mapa de memória de um processo - Ponteiros

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

Ponteiros e Alocação de Memória

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.

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

Ponteiros. Introdução

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

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

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

Linguagem C Ponteiros

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

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

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

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

1 Exercícios com ponteiros

Ponteiros de Variáveis

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

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

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

Linguagem C. Ponteiros. Alex Vidigal Bastos.

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

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

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

Laboratório de Programação II

MC-102 Aula 19 Ponteiros II

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

Alocação Dinâmica de Memória

Aula 24 Ponteiros, vetores e structs

BCC202 - Estrutura de Dados I

Introdução à Computação

Universidade de Brasília. Departamento de Ciência da Computação. Curso C: Estruturas. Prof. Ricardo Pezzuol Jacobi

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

Estrutura de dados 1. Ponteiros

Ponteiros. Embora o programador não tenha acesso ao endereço de uma variável, existem algumas situações onde é necessário a utilização deste endereço.

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?

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

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

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

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.

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

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

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

ED1 - Aula 01 Introducao e revisão

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

Ponteiro. Ponteiro. Objetivo. Compreender a definição e dominar a implementação de ponteiros em C.

Ponteiros. Ponteiros. Ponteiros. Ponteiros. Ponteiros. Introdução a Programação. Profa. Roseli Romero

Transcrição:

Exercícios 1) Crie uma função que recebe os coeficientes de uma função do 2o. grau e retorna as raízes sem usar vetor. 2) Faça um programa que acha o maior e o menor inteiro dentro de um vetor de 10 inteiros, calcule a soma e imprime a soma. Obs: usar apenas as váriaveis a seguir: int v[10], i, *maior, *menor; Alocação Dinâmica Introdução à Computação Prof. Denis Wolf Alocação de memória Uso da memória: uso de variáveis globais (e estáticas): O espaço reservado para uma variável global existe enquanto o programa estiver sendo executado. 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. reservar memória requisitando ao sistema, em tempo de execução, um espaço de um determinado tamanho. Alocação dinâmica de memória A linguagem C oferece meios de requisitarmos espaços de memória em tempo de execução. 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. 3 4 Alocação da Memória Principal 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. Código do Programa Variáveis Globais e Estáticas Memória Alocada Dinamicamente Pilha Memória Livre (Heap) 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. Código do Programa Variáveis Globais e Estáticas Memória Alocada Dinamicamente Pilha Memória Livre 5 6 1

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. Função básica para alocar memória é malloc() int *vet; vet = malloc(10*4); Após estes 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)); 7 8 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)); 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 simplesmente 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. 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 */ 9 10 Alocação Dinâmica de Memória As funções calloc e malloc permitem alocar blocos de memória em tempo de execução. Protótipo da função malloc: void * malloc(size_t n); /* retorna um ponteiro void para n bytes de memória não iniciados. Se não há memória disponível malloc retorna NULL */ Alocação Dinâmica de Memória As funções calloc e malloc permitem alocar blocos de memória em tempo de execução. Protótipo da função calloc: void * calloc(size_t n, size_t 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 */ 11 12 2

Alocação Dinâmica de Memória O ponteiro retornado por tanto pela função malloc quanto pela calloc devem ser convertido para o tipo de ponteiro que invoca a função int *pi = (int *) malloc (n*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 */ Alocação Dinâmica VETORES E MATRIZES 13 14 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 144 104 v O acesso a cada elemento do vetor é feito através de uma indexação da variável v. 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 15 16 Relação entre Vetores e Ponteiros /* Incrementa elementos de um vetor */ void incr_vetor (int *v, int tam) { int i; for (i = 0; i < tam; i++) v[i]++; int main () { int a[ ] = {1, 3, 5; incr_vetor(a, 3); 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. Suponha que desejamos armazenar uma quantidade n de valores inteiros,porém essa quantidade somente é conhecida pelo usuário. Como proceder a reserva de memória necessária para os dados? Se declararmos um vetor grande podemos incorrer em dois riscos: ainda assim ser pequeno o bastante para não caber os dados ou grande demais e desperdiçar memória Solicitar a memória necessária assim que a quantidade for conhecida 17 18 3

#include <stdlib.h> int main () { int *v, n, i; printf("qual o tamanho do vetor que deseja:"); scanf("%d", &n); v = (int *) calloc(n, sizeof(int)); /* aloca um vetor de n posições inteiras */ for (i =0; i<n; i++) { printf( Informe o %dº elemento: ", i+1); scanf("%d", &v[i]); /* armazena o valor no vetor na posição i */ for (i =0; i<n; i++) printf("%d ", v[i]); free(n); /* libera a memória alocada para o vetor */ return 0; 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. 19 20 #include <stdlib.h> float **Alocar_matriz_real(int m, int n) { float **v; /* ponteiro para a matriz */ int i; /* variável auxiliar */ if (m < 1 n < 1) { /* verifica parâmetros */ printf ("** Erro: Parametro invalido **\n"); v = (float **) calloc(m, sizeof(float *)); /* aloca as linhas da matriz */ if (v == NULL) { printf ("** Erro: Memoria Insuficiente **"); for ( i = 0; i < m; i++ ) { /* aloca as colunas da matriz */ v[i] = (float*) calloc(n, sizeof(float)); if (v[i] == NULL) { printf ("** Erro: Memoria Insuficiente **"); return v; /* retorna o ponteiro para a matriz */ 21 22 float ** liberar_matriz_real (int m, int n, float **v) { int i; /* variável auxiliar */ if (v == NULL) if (m < 1 n < 1) { /* verifica parâmetros 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 */ /* retorna um ponteiro nulo */ void main () { float **mat; /* matriz a ser alocada */ int l, c; /* numero de linhas e colunas */... /* outros comandos, inclusive inicialização de l e c */ mat = Alocar_matriz_real (l, c); /* outros comandos utilizando mat[][] normalmente */ if (Liberar_matriz_real (l, c, mat)!= NULL) { printf("erro ao desalocar a matriz!\n"); exit(1);... 23 24 4

Exercícios 1) Escreva um programa em linguagem C que solicita ao usuário a quantidade de alunos de uma turma e aloca um vetor de notas (números reais). Depois de ler as notas, imprime a média aritmética. Obs: não deve ocorrer desperdício de memória; e após ser utilizada a memória deve ser devolvida. Exercícios 2) Desenvolva um programa que calcule a soma de duas matrizes MxN de números reais (double). A implementação deste programa deve considerar as dimensões fornecida pelo usuário (Dica: represente a matriz através de variáveis do tipo double **, usando alocação dinâmica de memória).. 5