1 / 15

Alocação Dinâmica de Memória

Alocação Dinâmica de Memória. Objetivos. Utilizar espaços da memória de tamanho arbitrário Criar estruturas de dados usando encadeamento. Motivação. Alocação de espaço sob demanda: Muitas vezes o espaço de memória necessário para um conjunto de dados varia durante a execução do programa.

theo
Download Presentation

Alocação Dinâmica de Memória

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Objetivos • Utilizar espaços da memória de tamanho arbitrário • Criar estruturas de dados usando encadeamento.

  3. Motivação • Alocação de espaço sob demanda: Muitas vezes o espaço de memória necessário para um conjunto de dados varia durante a execução do programa. • Encadeamento prove um estilo eficiente de representar conjuntos de dados em C e para implementar as estruturas de armazenamento de Tipos Abstratos de Dados

  4. Funções para alocação Dinâmica • Funções principais • malloc() – Aloca um espaço na memória e retorna um ponteiro para o espaço alocado • free() - Libera espaço alocado na memória para que possa ser utilizados por outras aplicações ou por outras chamadas de malloc.

  5. Alocação Estática voidalocestat(){ int a[100]; int n,i; puts("Informe o número de elementos a serem lidos:"); scanf("%d", &n); for(i=0; i<n;i++) { scanf("%d",&a[i]); } } Alocação Dinâmica voidalocdin(){ int *a; int n,i; puts("Informe o número de elementos a serem lidos:"); scanf("%d", &n); a = malloc(n*sizeof(int)); if(a== NULL){ puts("Erro de alocação de memória.\n"); system("PAUSE"); exit(0); } for(i=0; i<n;i++) { scanf("%d",&a[i]); } } Exemplo

  6. Exemplo – Alocando um Vetor de inteiros voidalocdin2(){ int *a; int n,i; puts("Informe o número de elementos a serem lidos:"); scanf("%d", &n); a = malloc(n*sizeof(int)); if(a== NULL){ puts("Erro de alocação de memória.\n"); system("PAUSE"); exit(0); } for(i=0; i<n;i++) { scanf("%d",a+i); } }

  7. Exemplo – Alocando um Vetor de caracteres voidalocdinchar(){ char *a; int n,i; puts("Informe o número de elementos a serem lidos:"); scanf("%d", &n); a = malloc(n); // não precisa especificar o tamanho if(a== NULL){ puts("Erro de alocação de memória.\n"); system("PAUSE"); exit(0); } for(i=0; i<n;i++) { scanf("%c",a+i); } }

  8. Alocando um vetor de float ou double, float *a; int n,i; scanf("%d", &n); a = malloc(n*sizeof(float)); ou double *a; int n,i; scanf("%d", &n); a = malloc(n*sizeof(double));

  9. Alocando um vetor de Estruturas struct Pessoa{ int idade; char nome[10]; float altura; float peso; } p1,p2; voidalocdinstruct(){ Pessoa *a; int n,i; puts("Informe o número de elementos a serem lidos:"); scanf("%d", &n); a = malloc(n*sizeof(struct Pessoa));

  10. Alocando um Vetor de Estruturas typedefstruct { int x,y; } Ponto; Ponto *a; int n,i; puts("Informe o número de elementos a serem lidos:"); scanf("%d", &n); a = malloc(n*sizeof(Ponto));

  11. Apontadores e espaços alocados • Seja a declaração: int *a; a = malloc(10*sizeof(int)); • Depois que a alocação foi feita não é possível aumentar o tamanho do espaço alocado. • Porém, é possível fazer o ponteiro apontar para outro espaço. • Assim na seqüência: a = malloc(10*sizeof(int)); ... a = malloc(20*sizeof(int)); ... a = malloc(5*sizeof(int)); Os espaços alocados pelas duas primeiras chamadas de malloc ficarão “perdidos”, ficam alocados e sem uma referência para acessá-los.

  12. Liberando espaço com free • Sempre que um espaço alocado fica sem referência este é perdido, não podendo ser utilizado novamente, nem pelo programa que o alocou nem por outros programas em execução na memória. • Antes de fazer um apontador apontar para outro espaço, o espaço que este aponta deve ser liberado com free: a = malloc(10*sizeof(int)); .... free(a); a = malloc(20*sizeof(int)); .... free(a); a = malloc(5*sizeof(int));

  13. Liberando espaço com free • A função free libera espaços contíguos alocados por malloc. • No exemplo a = malloc(10*sizeof(int)); .... free(a); free vai liberar todos o bloco de memória de equivalente ao que foi alocado por malloc. (10 * o tamanho de um inteiro)

  14. Exercício • Escreva um programa que contenha um conjunto de funções para manipular imagens. Neste programa uma imagem é um vetor de pontos, podendo ter milhões de pontos. Um ponto possui a seguinte estrutura: • Um par de coordenadas (x,y). x e y são inteiros • Uma cor. cor é um inteiro (short) de 0 a 255).

  15. Exercício • Você deve: • declarar uma estrutura do tipo ponto. • Considerar que os pontos de uma imagem serão guardados em um vetor dinâmico do tipo ponto. • Implementar as operações: • lê figura de um arquivo texto (arquivo texto contendo um conjunto de pontos, precedido pelo número de pontos) • Modifica cor de um ponto; • Modifica cor da figura; • Imprime conjunto de pontos da figura; • Salva figura no arquivo;

More Related