Escolar Documentos
Profissional Documentos
Cultura Documentos
Dilvan Moreira
Objetivos
Gerenciamento de Memria
Heap
Espao Livre de Memria
Cada programa em execuo tem seu prprio Seg. Cdigo, Seg. De Dados, Stack e Heap
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
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
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
Exemplo:
possvel alocar memria para qualquer tipo de dados, incluindo as estruturas (structs)
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
Exemplo:
Free
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);
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
Lista Encadeada
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
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
Implemente uma funo para buscar um elemento (por meio do campo valor) e remov-lo de qualquer posio da lista