View
118
Download
2
Category
Preview:
Citation preview
Alocação Dinâmica em Linguagem C
LINGUAGEM CAlocação Dinâmica
Glécio Rodrigues de Albuquerque
glecioalbuquerque@gmail.com
Alocação Dinâmica em Linguagem C
Conteúdo• Alocação Estática• Alocação Dinâmica
• Malloc• Sizeof• Free
• Alocação de Vetores• Alocação de Matrizes• Calloc• Realloc• Exercício
Alocação Dinâmica em Linguagem C
Alocação Estática• Na execução de um programa geralmente precisamos
armazenar dados temporariamente na memória. Para isso, lançamos mão das variáveis de memória.
• As variáveis de memórias são declaradas através da determinação de um tipo de dado e seu identificador (nome), podendo ainda ser seguida de seu valor inicial (default).
Alocação Dinâmica em Linguagem C
Alocação Estática• No exemplo anterior, as variáveis são definidas utilizando
alocação estática.• Em tempo de compilação já é conhecida a quantidade de
memória que será necessária para a execução do programa.
• Ao iniciar o programa, toda a memória necessária para a sua execução será alocada.
• Acontece que, às vezes, a quantidade de memória a alocar só se torna conhecida durante a execução do programa. Para lidar com essa situação é preciso recorrer à alocação dinâmica de memória.
Alocação Dinâmica em Linguagem C
Alocação Dinâmica• A alocação dinâmica é o processo utilizado para se
alocar memória em tempo de execução. • É utilizada quando não se sabe ao certo quanto de
memória será necessário para o armazenamento dos dados, podendo ser determinado em tempo de execução conforme a necessidade do programa.
• Outro ponto é a econômica de memória, já que é alocada apenas a quantidade de memória necessária para a operação.
• A alocação dinâmica é muito utilizada em problemas de estruturas de dados, a exemplo de listas encadeadas e arvores, entre outros.
Alocação Dinâmica em Linguagem C
Alocação dinâmica• Para trabalharmos com alocação dinâmica em linguagem
C, fazemos uso das seguintes funções:• malloc• calloc• realloc• free
• Além dessas funções, fazemos uso do operador sizeof.• Também, na alocação dinâmica, o conceito de ponteiros
é bastante utilizado.
Alocação Dinâmica em Linguagem C
• Ponteiro é um tipo de dado especial que armazena um endereço de memória. Possui um tipo e é precedido do simbolo “*”.
• Exemplo de uso de um ponteiro e seu comportamento na memória:
Ponteiros
Alocação Dinâmica em Linguagem C
Malloc• A função malloc aloca um bloco de bytes consecutivos
na memória do computador e devolve o endereço do primeiro byte desse bloco.
• O número de bytes é especificado como argumento da chamada da função.
• A função malloc retorna um ponteiro de tipo genérico, void *, cabendo ao programador fazer um type casting para o tipo apropriado.
• No seguinte fragmento de código, malloc aloca 01 byte:
Alocação Dinâmica em Linguagem C
Malloc• Neste outro código, a função malloc é utilizada para
alocar espaço de memória para um valor inteiro e um valor double:
Alocação Dinâmica em Linguagem C
Malloc• No caso de alocarmos espaço de memória pra um
registro (struct), precisamos saber a quantidade total de bytes necessários para armazenar a estrutura na memória.
• Para facilitar esta tarefa, fazemos uso do operador sizeof.
Alocação Dinâmica em Linguagem C
Sizeof• O operador sizeof retorna um inteiro, informando o
tamanho, em bytes, do tipo de dados passado como argumento:
Alocação Dinâmica em Linguagem C
Sizeof• Exemplos anteriores aplicando o operador sizeof:
Alocação Dinâmica em Linguagem C
NULL• Se a memória do computador já estiver toda ocupada, malloc não consegue alocar mais espaço e devolve NULL.
• Convém verificar essa possibilidade antes de prosseguir:
Alocação Dinâmica em Linguagem C
Free• As variáveis alocadas estaticamente dentro de um
escopo de código são desalocadas automaticamente quando a execução do escopo termina.
• Já as variáveis alocadas dinâmicamente continuam a existir mesmo depois que a execução do escopo termina.
• Para liberarmos a memória ocupada por essas variáveis, é preciso recorrer à função free.
• A função free recebe como parâmetro um ponteiro para o endereço inicial da memória que será desalocada.
Alocação Dinâmica em Linguagem C
Free• A função free libera a porção de memória alocada por malloc. O comando avisa ao sistema que o bloco de bytes apontado por idade está livre. A próxima chamada de malloc poderá tomar posse desses bytes.
Alocação Dinâmica em Linguagem C
Alocando Vetores• Como já vimos, é possível alocar, além de variáveis
simples, estruturas mais complexas, a exemplo de registros.
• É possível também trabalharmos dinâmicamente com outros tipos de estruturas, como por exemplo os vetores.
• De acordo com a norma ANSI, o trecho de código a seguir não é a forma correta de se declarar um vetor, a menos que n seja uma constante, definida por const ou #define.
Alocação Dinâmica em Linguagem C
Alocando Vetores• O exemplo a seguir mostra como podemos alocar e
desalocar um vetor com n elementos inteiros durante a execução de um programa:
Alocação Dinâmica em Linguagem C
Alocando Matrizes• Outra exemplo de estruturas onde podemos utilizar
alocação dinâmica são as matrizes.• Matrizes bidimensionais são implementadas como
vetores de vetores. • Uma matriz com n linhas e m colunas é um vetor onde
cada elemento de n é um vetor de m elementos. • Isto significa que temos um vetor de n posições de
poteiros, onde cada posição de n vai apontar para um vetor de m posições do tipo de dado da matriz.
Alocação Dinâmica em Linguagem C
Alocando Matrizes• Exemplo da alocação dinâmica de uma matriz n x m:
Alocação Dinâmica em Linguagem C
Desalocando Matrizes• Exemplo de desalocação da matriz n x m alocada
anteriormente:
Alocação Dinâmica em Linguagem C
Calloc• Assim como malloc, calloc tem a função de alocar espaços
na memória. Sua principal diferença é que a mesma inicializa com zeros os bits das posições de memórias alocadas.
• Outro ponto é que o uso de calloc facilita a alocação de estruturas como vetores e matrizes.
• Está definida da seguinte forma:
• A função calloc recebe como parâmetros dois inteiros sem sinal. O primeiro indica a quantidade de dados que se pretende alocar e o segundo, o tamanho, em bytes, de cada dado que será alocado.
Alocação Dinâmica em Linguagem C
Calloc• No trecho de código a seguir é alocado um vetor de
inteiros com 5 posições através da função calloc:
• É importante observar que, da mesma forma como acontece com malloc, caso a alocação não seja efetivada, ao invés de retornar um ponteiro a função irá retornar o valor NULL.
Alocação Dinâmica em Linguagem C
Realloc• A função realloc permite alocar ou realocar um espaço
de memória.• Pode ser utilizada em casos onde se deseja aumentar ou
diminuir o espaço de memória previamente alocado.• Está definida da seguinte forma:
• A função recebe um ponteiro para o qual se deseja alocar ou realocar e a quantidade de memória, em bytes, necessária para a operação.
• Assim como malloc e calloc, realloc retorna um ponteiro para o primeiro byte da memória alocada ou o valor NULL.
Alocação Dinâmica em Linguagem C
Realloc• Exemplo de uso da função realloc:
Alocação Dinâmica em Linguagem C
Realloc• Alocando e desalocando com realloc:
Alocação Dinâmica em Linguagem C
Praticando1. Escreva um programa que leia um número inteiro
positivo n, indicando a quantidade de inteiros que serão lidos, e imprima-os em ordem invertida. Por exemplo, ao receber
5, 222, 333, 444, 555 e 666
seu programa deve imprimir
666, 555, 444, 333, 222 e 5
Alocação Dinâmica em Linguagem C
Códigos e exercícios
https://drive.google.com/folderview?id=0BxsDe2LkW3V2cExTTTE3YWhmLTg&usp=sharing
Alocação Dinâmica em Linguagem C
Referências
CPLUSPLUS. C Standard General Utilities Library. Disponível em: http://www.cplusplus.com/reference/cstdlib/. Acessado em: 10/07/2015.
LINGUAGEMCDESCOMPLICADA. Linguagem C. Disponível em: https://programacaodescomplicada.wordpress.com/indice/linguagem-c/. Acessado em: 10/07/2015.
MEDINA, Marco. FERTIG, Cristina. Algoritmos e Programação: Teoria e prática. São Paulo: Novatec, 2006.
SCHILDT, Herbert. C Completo e Total. 3.ed. Makron Books do Brasil Editora, São Paulo, 1996.
Alocação Dinâmica em Linguagem C
Obrigado!!!
Recommended