Anda di halaman 1dari 20

Alocao Dinmica

Dilvan Moreira

Objetivos

Entender o que so e como usar:


Gerenciamento

de Memria Alocao Dinmica em C

Gerenciamento de Memria

A memria utilizada por um programa de computador dividida em:


Segmento de Cdigo Segmento de Dados Stack Heap

Heap
Espao Livre de Memria

Cada programa em execuo tem seu prprio Seg. Cdigo, Seg. De Dados, Stack e Heap

Stack Segmento de Dados Segmento de Cdigo

Gerenciamento de Memria

O Segmento de Cdigo a parte da memria que armazena o cdigo de mquina do programa esttico em tamanho e contedo (de acordo com o Heap executvel) Geralmente, o bloco de Espao Livre de Memria segmento de cdigo somente leitura Stack

As instrues do programa compilado e em execuo no pode ser alterado

Segmento de Dados Segmento de Cdigo

Gerenciamento de Memria

O Segmento de Dados a parte da memria que armazena as variveis globais e variveis estticas inicializadas no cdigo do programa Heap O tamanho do segmento calculado de acordo com os valores das variveis definidas Stack O acesso de leitura-escrita
Espao Livre de Memria

Os valores das variveis neste Segmento de Dados segmento podem ser alterados durante a execuo do programa Segmento de Cdigo

Gerenciamento de Memria

O Stack a parte da memria que armazena as variveis locais e chamadas de funes do programa Usa a estratgia LIFO (last-in-first-out) para gerenciar a Heap entrada/sada de dados na memria O tamanho da Stack varivel e Espao Livre de Memria depende do sistema operacional e compilador utilizados Stack Utilizar mais memria Stack do que Segmento de Dados disponvel provoca um erro de Segmento de Cdigo execuo: stack buffer overflow

Gerenciamento de Memria

Heap um espao reservado para alocao dinmica de memria dos programas Memria alocada dinamicamente pode ser usada e liberada a Heap qualquer momento A linguagem C fornece funes Espao Livre de Memria prprias para lidar com alocao dinmica de memria Stack

malloc calloc free

Segmento de Dados Segmento de Cdigo

Malloc (Memory Alocation)

Funo para requisitar alocao dinmica de memria Recebe como parmetro o tamanho em bytes de memria a ser alocada Retorna um ponteiro para o incio da memria alocada

Se ocorrer algum erro de alocao de memria, a funo malloc retorna NULL

Malloc (Memory Alocation)

Exemplo:

Alocar dinmicamente um espao de memria para 30 inteiros (vetor).

int *vet = NULL; vet = (int*) malloc(30 * sizeof(int));

Tipo de dados que o ponteiro ir receber

Nmero de inteiros que desejamos alocar

Tamanho em bytes do tipo int na linguagem C

possvel alocar memria para qualquer tipo de dados, incluindo as estruturas (structs)

Calloc (Cleared Alocation)

Faz alocao de memria em blocos e inicializa a memria alocada com zero (cleared)

A memria alocada com malloc no inicializada (contm lixo). Fica a cargo do programador inicializar a memria alocada.

Recebe como parmetro o nmero de elementos a serem alocados e o tamanho em bytes dos elementos Retorna um ponteiro para o incio da memria alocada

Se ocorrer algum erro de alocao de memria, a funo malloc retorna NULL

Calloc (Cleared Alocation)

Exemplo:

Alocar dinmicamente um espao de memria para 30 inteiros (vetor).

int *vet = NULL; vet = (int*) calloc(30, sizeof(int));

Tipo de dados que o ponteiro ir receber

Nmero de inteiros que desejamos alocar

Tamanho em bytes do tipo int na linguagem C

Free

Toda memria alocada deve ser LIBERADA.

uma boa prtica de programao

A funo free recebe como entrada o ponteiro para a memria alocada Exemplo:
/* alocando memria */ int *vet = NULL; vet = (int*) malloc(30 * sizeof(int)); /* liberando memria */ free(vet);

Alocando memria com sucesso

Em algumas situaes, pode no haver mais memria disponvel para o programa

recomendado que o programador verifique sempre se a memria foi alocada com sucesso!

Uma forma usual escrever uma funo para auxiliar a alocao dinmica de memria
int *alocar_memoria(int tamanho) { int *new_mem; new_mem = malloc(tamanho*sizeof(int)); if (new_mem == NULL){ printf(Nao foi possivel alocar memria); exit(1); } return new_mem; }

Lista Encadeada

Estruturas de dados lineares

Flexibilidade em comparao aos vetores O programador define as regras para:


Insero,

Remoo, Busca e Atualizao

Algumas listas especializadas


Fila:

primeiro a entrar, primeiro a sair Pilha: ltimo a entrar, primeiro a sair

Lista Encadeada

Uma lista encadeada simples


Cada

elemento possui um valor Um elemento aponta para prximo elemento da lista O ltimo elemento aponta para NULL

Estrutura:
struct No{ int valor; struct No *p_prox; };

Lista Encadeada

Iniciando uma lista


void iniciar_lista(struct No **p_Raiz){ *p_Raiz = NULL; }
O

primeiro elemento da lista denominado Raiz A lista sempre comea vazia


Raiz

aponta para NULL

Lista Encadeada

Insero de elementos
Novos elementos podem ser inseridos qualquer posio da lista Alocao dinmica para cada novo elemento Exemplo: insero no incio da lista (desloca a raiz para frente)

void inserir (struct No **p_Raiz, int valor){ struct No *p_Novo; p_Novo = (struct No *) malloc(sizeof(struct No))); p_Novo->valor = valor; if(*p_Raiz == NULL){ *p_Raiz = p_Novo; p_Novo->p_prox = NULL; }else{ p_Novo->p_prox = *p_Raiz; *p_Raiz = p_Novo; } }

Lista Encadeada

Percorrendo a lista
Utiliza os ponteiros para caminhar entre os elementos da lista Exemplo: Percorrendo da raiz at o ltimo elemento da lista

void percorrer (struct No *p_Raiz){ if(p_Raiz == NULL) printf("\nLista vazia"); else{ struct No *p_atual; p_atual = *p_Raiz; while(p_atual != NULL){ printf("%d", p_atual->valor); p_atual = p_atual->p_prox; } } }

Lista Encadeada

Removendo elementos
Elementos removidos devem ser liberados na memria (free) Nenhum elemento da lista deve apontar para um elemento removido Exemplo: removendo o incio da lista

void remover (struct No **p_Raiz){ if(*p_Raiz == NULL) printf("\nLista ja esta vazia\n"); else{ struct No *p_atual; p_atual = *p_Raiz; *p_Raiz = (*p_Raiz)->p_prox; free(p_atual); } }

Exerccio

Considere a estrutura abaixo e as operaes de lista encadeada desta aula


struct No{ int valor; struct No *p_prox; };

Implemente uma funo para buscar um elemento (por meio do campo valor) e remov-lo de qualquer posio da lista