Você está na página 1de 15

Alocao Dinmica de Memria em C

Eduardo Nbrega

Alocao Dinmica de Memria


Usado para alocar memria de acordo com a demanda apresentada durante a execuo do programa. O objetivo evitar o desperdicio de memria

Alocao Dinmica de Memria


Exemplo clssico:
Um programa para gerenciamento de lista de espera de uma companhia area.
A quantidade de dados (i.e., registros de passageiros) pode variar bastante entre uma execuo do programa e outra (ou, pelo menos, de uma temporada para outra).

Alocao Dinmica de Memria


Exemplo clssico(cont.)
Duas formas de abordagem:
1 - Consiste em especificar um valor mximo de dados de entrada, e utilizar um arranjo capaz de conter estes dados, onde cada elemento contm um registro de passageiro).
A mais fcil, mas menos eficiente,

Alocao Dinmica de Memria


Abordagem 1
#define MAXIMO_DE_PASSAGEIROS 200 typedef struct { short dia, mes, ano; } tData; typedef struct { char tData char char } tRegistro; nome[30]; dataDeNascimento; identidade[12]; numeroDoBilhete[10]; No podemos alterar o tamanho em tempo de execuo Desperdicio de memria em caso de baixa demanda

tRegistro listaDeEspera[MAXIMO_DE_PASSAGEIROS];

Alocao Dinmica de Memria


Soluo:
Alocao de memria durante a execuo do programa e de acordo com a demanda de dados.

Este tipo de alocao denominado alocao dinmica de memria Alocao esttica de memria, cujo espao a ser alocado conhecido em tempo de programao (i.e., antes mesmo de o programa ser executado).

Funes de Alocao Dinmica de Memria


Alocao dinmica de memria em C feita por meio de ponteiros e das quatro funes de biblioteca resumidas na Tabela 1. Para utilizar estas funes inclua o arquivo stdlib.h ou o arquivo alloc.h.*

FUNO DESCRIO RESUMIDA malloc() Aloca um nmero especificado de bytes em memria, e retorna um ponteiro para o incio do bloco de memria alocado. calloc() Similar a malloc(), mas esta funo inicializa todos os bytes alocados com zeros. Esta funo tambm permite a alocao de memria para mais de um bloco numa mesma chamada. realloc() Modifica o tamanho de um bloco previamente alocado. free() Libera o espao de um bloco de memria previamente alocado com malloc(), calloc() ou realloc().

Tabela 1: Funes de Alocao Dinmica de Memria *No DevC++ no precisamos incluir estas bibliotecas

Funes de Alocao Dinmica de Memria


malloc() recebe como argumento o tamanho, em bytes, do bloco a ser dinamicamente alocado. Por exemplo, supondo que prtParaRegistro seja um ponteiro para o tipo tRegistro:
prtParaRegistro = malloc(sizeof(tRegistro));

O uso do sizeof recomendado, principalmente, por questes de portabilidade. Se a memria no puder se alocada, um ponteiro nulo (NULL) ser retornado.

Alocaria (se fosse possvel) um bloco capaz de conter uma estrutura do tipo tRegistro e retornaria um ponteiro contendo o endereo inicial deste bloco.

Exemplo1 - malloc
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { // ponteiro para uma varivel do tipo inteiro int *ponteiro; // aloca memria para um int ponteiro = malloc(sizeof(int)); // testa se a memria foi alocada com sucesso if(ponteiro) printf("Memoria alocada com sucesso.\n"); else printf("Nao foi possivel alocar a memoria.\n"); // atribui valor memria alocada *ponteiro = 45; // obtm o valor atribudo printf("Valor: %d\n\n", *ponteiro); // libera a memria if(ponteiro) free(ponteiro); system("PAUSE"); return 0; }

Exemplo2 malloc com vetores


#include <stdio.h> #include <stdlib.h> void main() { int i; // quantidade de elementos no vetor int quant = 10; // ponteiro para o bloco de memria int *ponteiro; // aloca memria para uma matriz de inteiros ponteiro = (int*)malloc(quant * sizeof(int)); // testa se a memria foi alocada com sucesso if(ponteiro) printf("Memoria alocada com sucesso.\n"); else{ printf("Nao foi possivel alocar a memoria.\n"); exit(1); } // atribui valores aos elementos do array for(i = 0; i < quant; i++){ ponteiro[i] = i * 2; } // exibe os valores for(i = 0; i < quant; i++){ printf("%d ", ponteiro[i]); } // libera a memria if(ponteiro) free(ponteiro); printf("\n\n"); system("PAUSE"); }

Funes de Alocao Dinmica de Memria


Funo calloc()
usada para alocarmos um bloco de memria. Recebe a quantidade de elementos e o nmero de bytes do elemento Retorna um ponteiro do tipo void (genrico) para o incio do bloco de memria obtido.
void *calloc(size_t n, size_t size);
Se a memria no puder se alocada, um ponteiro nulo (NULL) ser retornado.

Exemplo1 Uso do calloc


#include <stdio.h> #include <stdlib.h> int main() { // ponteiro para uma varivel do tipo inteiro int *ponteiro; // aloca memria para um int ponteiro = (int *)calloc(1, sizeof(int)); // testa se a memria foi alocada com sucesso if(ponteiro) printf("Memoria alocada com sucesso.\n"); else printf("Nao foi possivel alocar a memoria.\n"); // atribui valor memria alocada *ponteiro = 45; // obtm o valor atribudo printf("Valor: %d\n\n", *ponteiro); // libera a memria if(ponteiro) free(ponteiro); system("PAUSE"); return 0; }

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { int i; // quantidade de elementos no vetor int quant = 10; // ponteiro para o bloco de memria int *ponteiro; // aloca memria para uma matriz de inteiros ponteiro = (int*)calloc(quant, sizeof(int)); // testa se a memria foi alocada com sucesso if(ponteiro) printf("Memoria alocada com sucesso.\n"); else{ printf("Nao foi possivel alocar a memoria.\n"); exit(1); } // atribui valores aos elementos do array for(i = 0; i < quant; i++){ ponteiro[i] = i * 2; } // exibe os valores for(i = 0; i < quant; i++){ printf("%d ", ponteiro[i]); } // libera a memria if(ponteiro) free(ponteiro); printf("\n\n"); system("PAUSE"); return 0; }

Exemplo2 Uso do calloc Vetores

Funes de Alocao Dinmica de Memria


Funo realloc()
Recebe dois argumentos. O primeiro argumento deve ser um ponteiro para um bloco de memria alocado utilizando malloc(), calloc() ou a prpria funo realloc() O segundo argumento especifica um novo tamanho desejado para o bloco. Se o novo tamanho for menor do que o tamanho atual do bloco, a diferena ser retirada do final do bloco

Exemplo de uso do realloc


#include <stdio.h> #include <stdlib.h> #include <string.h> void main() { char buffer[80], *mensagem; /* Entrada de uma string. */ puts("Digite uma linha de texto."); gets(buffer); /* Aloca memoria para mensagem e depois copia a string para ela */ mensagem = (char*)malloc(strlen(buffer)+1); strcpy(mensagem, buffer); /* Exibe a mensagem. */ puts(mensagem); /* Pega uma nova mesagem do usuario. */ puts("Digite outra linha de texto."); gets(buffer); /* Aumenta a memoria alocada, depois concatena a messagem. */ mensagem = realloc(mensagem,(strlen(mensagem) + strlen(buffer)+1)); strcat(mensagem, buffer); /* Exibe a nova mensagem. */ puts(mensagem); system("pause"); }

Você também pode gostar