Leandro Almeida  As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa.

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-
Programação II Estruturas de Dados
Programação II Estruturas de Dados
Programação II Estruturas de Dados
Alocação Dinâmida de Memória
Alocação Dinâmica de Memória
LPG - I: Alocação Dinâmica de Memória - Ponteiros
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Universidade de Brasília
Linguagem C Strings.
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Slides: Prof. João Fabro UTFPR - Curitiba
Fundamentos de Programação 1
Escola Secundária c/ 3º CEB da Batalha
Listas Encadeadas.
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
Prof.° Jean Daniel Henri Merlin Andreazza Estrutura de Dados
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
Alocação Dinâmica de Memória
Implementação de FILAS com Alocação Dinâmica
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Alocação Dinâmica de Memória
Seminário 1: Revisão de C
UNIDADE 5 ESTRUTURAS DE DADOS HOMOGÊNEAS
Prof. Ricardo Santos PONTEIROS
Estruturas de Dados Aula 5: Matrizes
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
Aula P.02 – BCC202 Revisão sobre Ponteiros Túlio Toffolo
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
Vetores Bidimensionais – Debug - Ponteiros – Listas Encadeadas Simples
Algoritmos e Estruturas de Dados
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.
Prof. Alessandro Gonçalves
Programação de Computadores I – Arquivos
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Versão: _01.
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.
Ponteiros em C Prof. Kariston Pereira
Linguaguem de Programação II
Estrutura de Dados Revisão Professor Luiz José Hoffmann Filho
Linguaguem de Programação II
Ponteiros. Programação II Professora: Mai-Ly vanessa horário: ter 9h-11h; sex 11h-13h Aula 1.
Algoritmo e Estrutura de Dados I Aulas 15 – Linguagem C Alocação Dinâmica de Memória Márcia Marra
Linguagem de Programação
COMPILADORES 07 Prof. Marcos.
Programação em C Aula 9.
USP – ICMC – SSC SSC0300 2º Semestre 2015 Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Eletrônica ] 1 Prof. Dr. Daniel Rodrigo.
USP – ICMC – SSC SSC0300 2º Semestre 2015 Disciplina de Linguagem de Programação e Aplicações [ Eng. Elétrica / Eletrônica ] 1 Prof. Dr. Daniel Rodrigo.
ponteiros Estrutura de Dados Prof. André Cypriano M. Costa
Programação de Computadores I – Arquivos Profa. Mercedes Gonzales Márquez.
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.
Alocação Dinâmica de Memória e Tipo Abstrato de Dados Cristiano Arbex Valle Vinicius Fernandes dos Santos
Estrutura de Dados STRUCTS Dilvan Moreira. Objetivos  Entender o que são e como usar:  Estrutura de Dados para a Linguagem C  Structs (Registros)
Jean Carlo Mendes
FUNDAMENTO DE PROGRAMAÇÃO PROF. WELLINGTON FRANCO
Fundamentos de Programação 1
Transcrição da apresentação:

Leandro Almeida

 As declarações abaixo alocam memória para diversas variáveis.  A alocação é estática, pois acontece antes que o programa comece a ser executado: char c; int i; int v[10];  À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, é preciso dizer #include  no início do programa.

 A função malloc (abreviatura de memory allocation) 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 da função ◦ No seguinte fragmento de código, malloc aloca 1 byte: char *ptr; ptr = (char *) malloc(1); scanf( "%c", ptr);

 O endereço devolvido por malloc é do tipo "genérico" void *.  O programador armazena esse endereço num ponteiro de tipo apropriado.  No exemplo anterior, o endereço é armazenado num ponteiro-para-char.

 Para alocar um tipo-de-dado que ocupa vários bytes, é preciso recorrer ao operador sizeof, que diz quantos bytes o tipo especificado tem: typedef struct { int dia, mes, ano; } data; data *d; d = (data *) malloc( sizeof (data)); d->dia = 31; d->mes = 12; d->ano = 2008;

 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: data *ptr; ptr = (data *) malloc( sizeof (data)); if (ptr == NULL) { printf( "Socorro! malloc devolveu NULL!\n"); }

 As variáveis alocadas estaticamente dentro de uma função desaparecem quando a execução da função termina.estaticamente  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.

 A função free libera a porção de memória alocada por malloc  O comando free(ptr) avisa o sistema de que o bloco de bytes apontado por ptr está livre  A próxima chamada de malloc poderá tomar posse desses bytes.  Convém não deixar ponteiros "soltos" (= dangling pointers) no seu programa, pois isso pode ser explorado por hackers para atacar o seu computador.pode ser explorado por hackers para atacar o seu computador  Portanto, depois de cada free( ptr), atribua NULL a ptr : free( ptr); ptr = NULL;

 Eis como um vetor (=array) com n elementos inteiros pode ser alocado (e depois desalocado) durante a execução de um programa: #include main () { int *v; int n, i; printf("Digite o tamanho do vetor"); scanf( "%d", &n); v = (int *) 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; getche(); }

 O comando v = (int *) malloc(100 * sizeof (int));  tem o mesmo efeito que a alocação estática: int v[100];

 Matrizes bidimensionais são implementadas como vetores de vetores  Uma matriz com m linhas e n colunas é um vetor cujos m elementos possuem um vetor de n elementos int **A; int i,j,m,n; printf("Digite o tamanho da matriz"); scanf("%d %d",&m, &n); A = (int **) malloc( m * sizeof (int *)); for (i = 0; i < m; i++) A[i] = (int *) malloc( n * sizeof (int));

for (i = 0; i < m; i++) for (j = 0; j < n; j++) scanf("%d",&A[i][j]); for (i = 0; i < m; i++){ for (j = 0; j < n; j++) printf("%d ",A[i][j]); printf("\n"); } /* Desaloca a matriz */ for(i = 0; i < m; i++){ free(A[i]); A[i] = NULL; } free(A); A = NULL;

 Faça um programa que leia um valor n e crie dinamicamente um vetor de n elementos e passe esse vetor para uma função que vai ler os elementos desse vetor. Depois, no programa principal, o vetor preenchido deve ser impresso. Além disso, antes de finalizar o programa, deve-se liberar a área de memória alocada.

#include /*formato de preenchimento 1*/ void preencher_vetor_A (int vetor[], int tam) { for (int i = 0; i < tam; i++) { printf("\n Digite o %d elemento", i); scanf("%d",&vetor[i]); } /*outro formato de preenchimento*/ void preencher_vetor_B (int *vetor, int tam) { for (int i = 0; i < tam; i++) { printf("\n Digite o %d elemento", i); scanf("%d",&vetor[i]); } main() { int *v, qe; printf("Digite a quantidade de elementos"); scanf("%d",&qe); v = (int *) malloc(qe * sizeof(int)); preencher_vetor_B(v, qe); for (int i = 0; i < qe; i++) printf("%d ", v[i]); free(v); v = NULL; getche(); }

#include /*Formato correto de preenchimento da matriz*/ void preencher_matriz (int **matriz, int lin, int col) { int a, b; for (a = 0; a < lin; a++) { for (b = 0; b < col; b++) { printf("\n Digite o [%d %d] elemento", a, b); scanf("%d",&matriz[a][b]); } main() { int **mat, lin, col; printf("Digite a quantidade de elementos"); scanf("%d %d",&lin, &col); mat = (int **) malloc(lin * sizeof(int *)); for (int i = 0; i < col; i++) mat[i] = (int *) malloc(col * sizeof(int)); preencher_matriz(mat, lin, col); for (int i = 0; i < lin; i++) { for (int j = 0; j < col; j++) printf("%d ", mat[i][j]); printf("\n"); } for (int j = 0; j < col; j++) { free(mat[j]); mat[j] = NULL; } free(mat); mat = NULL; getche(); }