A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Alocação Dinâmica de Memória

Apresentações semelhantes


Apresentação em tema: "Alocação Dinâmica de Memória"— Transcrição da apresentação:

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 Exemplo Alocação Estática Alocação Dinâmica void alocdin(){ int *a;
void alocestat(){ 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 void alocdin(){ 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]);

6 Exemplo – Alocando um Vetor de inteiros
void alocdin2(){ 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
void alocdinchar(){ 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; a = malloc(n*sizeof(double));

9 Alocando um vetor de Estruturas
struct Pessoa{ int idade; char nome[10]; float altura; float peso; } p1,p2; void alocdinstruct(){ 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
typedef struct { 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)); 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;


Carregar ppt "Alocação Dinâmica de Memória"

Apresentações semelhantes


Anúncios Google