FUNDAMENTO DE PROGRAMAÇÃO PROF. WELLINGTON FRANCO

Slides:



Advertisements
Apresentações semelhantes
Marco Antonio Montebello Júnior
Advertisements

LPG - I: Alocação Dinâmica de Memória - Ponteiros
LPG - I: Ponteiros e Vetores/Matrizes UDESC - SBS
Escola Secundária c/ 3º CEB da Batalha
Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba
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
Definição de Tipos Estruturas e Ponteiros
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Alocação Dinâmica de Memória
Estruturas de Dados Aula 5: Matrizes
Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
Leandro Almeida  As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa.
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
COMPILADORES 07 Prof. Marcos.
Programação em C Aula 9.
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.
INE5408 Estruturas de Dados Ponteiros, passagem de parâmetros e modelos de memória.
PROGRAMAÇÃO ORIENTADA A OBJETOS EM C++ Professor: Dilvan Moreira.
INE5408 Estruturas de Dados Alocação Dinâmica de Memória.
Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP Alocação Dinâmica de Memória.
Estrutura de Dados (DPADF 0056) Aula 7 – Encadeamento de Memória Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior.
Algoritmos e Estruturas de Dados I – Ponteiros Profa. Mercedes Gonzales Márquez.
Estruturas de Dados Aula 2: Estruturas Estáticas
Vetores e Matrizes em C/C++
ESTRUTURA DE DADOS Professor: Marcelo Mendes Turma: MBI-1
INF1007: Programação 2 2 – Alocação Dinâmica
INE5408 Estruturas de Dados
INE5408 Estruturas de Dados
INF1007: Programação 2 5 – Tipos Estruturados
Fundamentos de Programação 1
Estrutura de Dados Revisão
Prof. Wellington Franco Sub-Rotinas:Funções e Procedimentos
3.1 Classes e Objetos Em um programa orientado a objetos normalmente existem vários objetos de um mesmo tipo. Por exemplo, um programa de controle de.
INF1007: Programação 2 9 – Tipos Abstratos de Dados
Prof. Wellington Franco
FUNDAMENTO DE PROGRAMAÇÃO
Estruturas de Dados Aula 5: Matrizes
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
Algoritmos e Estruturas de Dados I – Ponteiros
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
FUNDAMENTO DE PROGRAMAÇÃO
Introdução à Programação BCC 201 Aula
Programação de Computadores I – Arquivos
FUNDAMENTO DE PROGRAMAÇÃO PROF. WELLINGTON FRANCO
Algoritmos e Estruturas de Dados I
FUNDAMENTO DE PROGRAMAÇÃO
UNIDADE 7 Tipos estruturados
aritmética de ponteiros
INE 5201 – INTRODUÇÃO À CIÊNCIA DA COMPUTAÇÃO
Algoritmos e Programação MC102
Programação de Computadores I – Ponteiros
Listas Encadeadas.
Aula 22 Modularização 22/10/08.
Fundamentos de Programação 1
Relembrando... Variáveis : endereçam uma posição de memória que contem um determinado valor dependendo do seu tipo (char, int, float, double, ...) void.
Programação de Computadores I – Arquivos
Programação de Computadores I – Ponteiros
Curso básico de PHP. 1 Vantagens: Gratuito Multiplataforma Estável Rapidez Comunicação.
Computação Eletrônica Vetores e Matrizes
Algoritmos e Estruturas de Dados I – Ponteiros
Estruturas de Dados em C
Estruturas definidas pelo programador
Programação de Computadores LINGUAGEM C – AULA 03 – PROF. WELLINGTON TELLES.
Estruturas de Dados Aula 5: Matrizes 16/03/2015. Matrizes Conjuntos bidimensionais declarados estaticamente float mat[4][3]; acesso de elemento: mat[2][0]
Linguagem de Programação
Fundamentos de Programação 1
Programação II Mateus Raeder.
parâmetros e modelos de memória
Transcrição da apresentação:

FUNDAMENTO DE PROGRAMAÇÃO PROF. WELLINGTON FRANCO LINGUAGEM C ALOCAÇÃO DINÂMICA

INTRODUÇÃO

INTRODUÇÃO O sistema operacional reserva também os espaços necessários para armazenarmos as variáveis globais (e estáticas) existentes no programa. O restante da memória livre é utilizado pelas variáveis locais e pelas variáveis alocadas dinamicamente. Cada vez que uma determinada função é chamada, o sistema reserva o espaço necessário para as variáveis locais da função.

INTRODUÇÃO Com alocação dinâmica, declaramos uma variável do tipo ponteiro que posteriormente recebe o valor do endereço de um elemento ou do primeiro elemento de uma sequência de endereços, alocado dinamicamente.

INTRODUÇÃO Mesmo que um espaço seja alocado dinamicamente no escopo local de uma função, podemos acessá-lo depois da função ser finalizada, pois a área de memória ocupada por ele permanece válida. Se o programa não liberar o espaço alocado dinamicamente, este será automaticamente liberado quando a execução do programa terminar.

FUNÇÕES DE ALOCAÇÃO DINÂMICA

FUNÇÕES DE ALOCAÇÃO DINÂMICA As principais funções são: malloc free Está na biblioteca #include <stdlib.h>

FUNÇÕES DE ALOCAÇÃO DINÂMICA A função malloc (o nome é uma abreviatura de memory allocation) aloca um bloco de bytes consecutivos na memória do computador e retorna o endereço desse bloco. O número de bytes é especificado como parâmetro desta função. No seguinte fragmento de código, malloc aloca 1 byte:

FUNÇÕES DE ALOCAÇÃO DINÂMICA /* A sintaxe de malloc é: void* malloc (unsigned int num); - onde void* significa que malloc retorna um endereço de memória genérico, - unsigned, de forma simplificada, significa sem sinal negativo, - int o tipo da variável ou valor a ser passado, - e num um valor númerico */ char *ptr; ptr = (char* )malloc(1); scanf( "%c", ptr); printf("%d",*ptr);

FUNÇÕES DE ALOCAÇÃO DINÂMICA O endereço devolvido por malloc é armazenado em um ponteiro do tipo apropriado. No exemplo anterior, o endereço é armazenado num ponteiro-para-char. Para alocar um tipo-de-dado que ocupa mais de 1 byte, é preciso recorrer ao operador sizeof, que diz quantos bytes o tipo especificado tem.

FUNÇÕES DE ALOCAÇÃO DINÂMICA É valido ressaltar que 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 função free).

FUNÇÕES DE ALOCAÇÃO DINÂMICA Se a memória do computador já estiver toda ocupada, malloc não consegue alocar mais espaço e devolve NULL. Convém verificar essa possibilidade antes de prosseguir: ptr = malloc( sizeof (float)); if (ptr == NULL) { printf( "Memoria cheia! malloc devolveu NULL!\n"); exit( EXIT_FAILURE); }

FUNÇÕES DE ALOCAÇÃO DINÂMICA Função FREE A função free libera a porção de memória alocada por malloc. A instrução free(ptr) avisa ao sistema que o bloco de bytes apontado por ptr está livre e pode ser utilizado por outros programas. A próxima chamada de malloc poderá tomar posse desses bytes

FUNÇÕES DE ALOCAÇÃO DINÂMICA Há três ponderações a serem feitas sobre a função free: A função free não deve ser aplicada a uma parte de um bloco de bytes alocado por malloc; aplique free apenas ao bloco todo; Como mencionado no parágrafo anterior, a função free libera um espaço de memória para ser alocado pelo mesmo programa ou por outro programa, mas os dados guardados neste espaço de memória permanecem na memória do computador. O ponteiro a qual é passado como parâmetro continua apontando para a porção de memória liberada por free. A estes ponteiros chamamos de ponteiros soltos.

FUNÇÕES DE ALOCAÇÃO DINÂMICA Convém não deixar ponteiros "soltos" (dangling pointers) no seu programa, pois isso pode ser explorado por hackers acessar dados do seu programa. Portanto, depois de cada free(ptr), atribua NULL a ptr:   free(ptr); ptr = NULL;

FUNÇÕES DE ALOCAÇÃO DINÂMICA Função Calloc Outra função importante para alocar memória dinamicamente é calloc(). Normalmente é utilizado para criar um vetor de tamanho dinâmico, ou seja, definido durante a execução do programa Difere da função malloc, pois além de inicializar os espaços de memória ainda atribui o valor 0 (zero) para cada um deles. É útil, pois em C quando se declara um variável o espaço no mapa de memória usado por esta provavelmente contém algum valor lixo. Um exemplo de sua utilização é dado a seguir: /*sintaxe da calloc: void* calloc(n_de_elementos , tamanho_de_cada_elemento); */ char *p; int n; ... p = (int*) calloc(n, sizeof(int));  

FUNÇÕES DE ALOCAÇÃO DINÂMICA Função: realloc Em tempo de execução, podemos verificar que a dimensão inicialmente escolhida para um vetor tornou-se insuficiente (ou excessivamente grande), necessitando um redimensionamento. A função realloc da biblioteca padrão nos permite re-alocar um vetor, preservando o conteúdo dos elementos, que permanecem válidos após a re-alocação (no fragmento de código abaixo, m representa a nova dimensão do vetor).

FUNÇÕES DE ALOCAÇÃO DINÂMICA Função: realloc /* sintaxe da realloc: void* realloc(void* ptr, unsigned int novo_tamanho); */ int *v, n, m; ... v = (int*) realloc(v, m*sizeof(int));

ALOCAÇÃO DINÂMICA EM VETORES

ALOCAÇÃO DINÂMICA EM VETORES Eis como um vetor (array) com n elementos inteiros pode ser alocado (e depois desalocado) durante a execução de um programa: int *v; int n, i; scanf( "%d", &n); v = malloc( n * sizeof (int)); for (i = 0; i < n; ++i) scanf( "%d", &v[i]); for (i = n; i > 0; --i) printf( "%d ", v[i-1]); free( v); v = NULL;

ALOCAÇÃO DINÂMICA EM VETORES Do ponto de vista conceitual (e apenas desse ponto de vista) a instrução: v = malloc( 100 * sizeof (int)); Tem efeito análogo ao da alocação estática: int v[100]; Convém lembrar que a norma ANSI não permite declarar: int v[n];

ALOCAÇÃO DINÂMICA EM VETORES A seguir é exemplificado como criar um vetor com a função calloc: int *p;int n;int i; ... /* Determina o valor de n em algum lugar */ n = 3;p = calloc(n, sizeof(int));  /* Aloca n números inteiros p pode agora ser tratado como um vetor com n posicoes */  //p = malloc(n*sizeof(int)); /* Maneira equivalente usando malloc. */ if (!p){ printf ("** Erro: Memoria Insuficiente **");}  for (i=0; i<n; i++) p[i] = i*i; /* p pode ser tratado como um vetor com n posicoes */...

ALOCAÇÃO DINÂMICA EM VETORES Segue o exemplo de como utilizar a função realloc: ... char *str; /* Memoria inicialmente alocada */ str = (char *) malloc(11); strcpy(str, "www.google"); printf("String = %s, Endereco = %p\n", str, str); /* Realocação de memória */ str = (char *) realloc(str, 15); strcat(str, ".com"); printf("String = %s, Endereco = %p\n", str, str); free(str);

ALOCAÇÃO DINÂMICA EM MATRIZES

ALOCAÇÃO DINÂMICA EM MATRIZES As matrizes declaradas estaticamente sofrem das mesmas limitações dos vetores: precisamos saber de antemão suas dimensões. O problema que encontramos é que a linguagem C só permite alocarmos dinamicamente conjuntos unidimensionais. Para trabalharmos com matrizes alocadas dinamicamente, temos que criar abstrações conceituais com vetores para representar conjuntos bidimensionais.

ALOCAÇÃO DINÂMICA EM MATRIZES Uma forma de alocar uma matriz dinamicamente é representado-a em um vetor unidimensional. A estratégia de endereçamento para acessar os elementos é a seguinte: se quisermos acessar o que seria o elemento mat[i][j] de uma matriz, devemos acessar o elemento v[i*n+j], onde n representa o número de colunas da matriz

ALOCAÇÃO DINÂMICA EM MATRIZES Esta conta de endereçamento é intuitiva: se quisermos acessar elementos da terceira (i=2) linha da matriz, temos que pular duas linhas de elementos (i*n) e depois indexar o elemento da linha com j. Com esta estratégia, a alocação da “matriz” recai numa alocação de vetor que tem m*n elementos, onde m e n representam as dimensões da matriz

ALOCAÇÃO DINÂMICA EM MATRIZES float *mat; /* matriz representada por um vetor */ ... mat = (float*) malloc(m*n*sizeof(float));   No entanto, somos obrigados a usar uma notação desconfortável, v[i*n+j], para acessar os elementos, o que pode deixar o código pouco legível.

ALOCAÇÃO DINÂMICA EM MATRIZES A segunda estratégia para representar matrizes por meio de alocação dinâmica é por meio do conceito de ponteiros para ponteiros. Nesta técnica, ocorre algo parecido com o que fizemos para tratar vetores de cadeias de caracteres, que em C são representados por conjuntos bidimensionais de caracteres (ex: alunos[50][81], que pode ser compreendido como uma variável capaz de armazenar 50 nomes de alunos, cada nome com no máximo 79 caracteres sendo o 80ª caractere o \0).

ALOCAÇÃO DINÂMICA EM MATRIZES De acordo com esta estratégia, cada linha da matriz alocada dinamicamente é representada por uma sequência de ponteiros para ponteiros o endereço do primeiro elemento de cada linha. A seguir é descrita está técnica por meio de código: int i; float **mat; /* matriz representada por um de ponteiro para ponteiros */ ... mat = (float**) malloc(m*sizeof(float*)); for (i=0; i<m; i++) m[i] = (float*) malloc(n*sizeof(float));

ALOCAÇÃO DINÂMICA EM MATRIZES A grande vantagem desta estratégia é que o acesso aos elementos é feito da mesma forma que quando temos uma matriz criada estaticamente, pois, se mat representa uma matriz alocada segundo esta estratégia, mat[i] representa o ponteiro para o primeiro elemento da linha i, e, conseqüentemente, mat[i][j] acessa o elemento da coluna j da linha i.