Sie sind auf Seite 1von 21

Alocao Dinmica de Memria

Alocao Esttica x Dinmica


Linguagens de programao como Pascal, C e C++ permitem dois tipos de alocao de memria: Esttica e Dinmica Na alocao esttica, o espao de memria para as variveis reservado no incio da execuo, no podendo ser alterado depois
int a; int b[20];

Na alocao dinmica, o espao de memria para as variveis pode ser alocado dinamicamente durante a execuo do programa

Alocao Dinmica

Uso da memria:
uso de variveis globais (e estticas):
espao reservado para uma varivel global existe enquanto o programa estiver sendo executado

uso de variveis locais:


espao existe apenas enquanto a funo que declarou a varivel est sendo executada liberado para outros usos quando a execuo da funo termina

variveis globais ou locais podem ser simples ou vetores:


para vetor, necessrio informar o nmero mximo de elementos pois o compilador precisa calcular o espao a ser reservado

Alocao Dinmica

Uso da memria:

alocao dinmica:
espao de memria requisitada em tempo de execuo espao permanece reservado at que seja explicitamente liberado
depois de liberado, espao estar disponibilizado para outros usos e no pode mais ser acessado espao alocado e no liberado explicitamente, ser automaticamente liberado quando ao final da execuo

Alocao Dinmica

Alocao Dinmica

Alocao Dinmica
A memria alocada dinamicamente acessada atravs de Apontadores (pointers) que na verdade so variveis que armazenam o endereo de uma rea de memria A memria alocada dinamicamente faz parte de uma rea de memria chamada heap
Basicamente, o programa aloca e desaloca pores de memria do heap durante a execuo.

Alocao Dinmica

Funes da biblioteca padro stdlib.h contm uma srie de funes pr-definidas:


funes para tratar alocao dinmica de memria constantes pr-definidas ....

Alocao Dinmica
Funo sizeof:
retorna o nmero de bytes ocupado por um tipo

Funo malloc:
recebe como parmetro o nmero de bytes que se deseja alocar retorna um ponteiro genrico para o endereo inicial da rea de memria alocada, se houver espao livre:
ponteiro genrico representado por void* ponteiro convertido automaticamente para o tipo apropriado ponteiro pode ser convertido explicitamente

retorna um endereo nulo, se no houver espao livre:


representado pelo smbolo NULL

Alocao Dinmica
Exemplo: alocao dinmica de um vetor de inteiros com 10 elementos
malloc retorna o endereo da rea alocada para armazenar valores inteiros ponteiro de inteiro recebe endereo inicial do espao alocado

Alocao Dinmica
Exemplo (cont):

Alocao Dinmica
Exemplo (cont):
v armazena endereo inicial de uma rea contnua de memria suficiente para armazenar 10 valores inteiros v pode ser tratado como um vetor declarado estaticamente
v aponta para o inicio da rea alocada v[0] acessa o espao para o primeiro elemento v[1] acessa o segundo .... at v[9]

Alocao Dinmica
Exemplo (cont): tratamento de erro aps chamada a malloc
imprime mensagem de erro aborta o programa (com a funo exit)

Alocao Dinmica
funo free:
recebe como parmetro o ponteiro da memria a ser liberada
a funo free deve receber um endereo de memria que tenha sido alocado dinamicamente

Alocao Dinmica

Apontadores Notao em C
Definio de p como um apontador para uma varivel do tipo T
T *p;

Alocao de memria para uma varivel apontada por p


p = (T*) malloc(sizeof(T));

Desalocao de memria
free(p);

Conteudo da varivel apontada por P


*p;

Valor nulo para um apontador


NULL;

Endereo de uma varivel a


&a;

Alocao Dinmica

Erros Comuns
Esquecer de alocar memria e tentar acessar o contedo da varivel Copiar o valor do apontador ao invs do valor da varivel apontada Tentar acessar o contedo da varivel depois de desaloc-la Esquecer de desalocar memria
Ela desalocada ao fim do programa ou procedimento funo onde a varivel est declarada, mas pode ser um problema em loops

Qual ser a sada?

Dvidas.... int *a no a declarao de um vetor de int? Em C, todo vetor um ponteiro Portanto pode-se fazer coisas como:

Ponteiros para Estruturas


Apontadores so normalmente utilizados com tipos estruturados

Das könnte Ihnen auch gefallen