29
Alocação Dinâmica em Linguagem C LINGUAGEM C Alocação Dinâmica Glécio Rodrigues de Albuquerque [email protected]

Alocação Dinâmica em Linguagem C

Embed Size (px)

Citation preview

Page 1: Alocação Dinâmica em Linguagem C

Alocação Dinâmica em Linguagem C

LINGUAGEM CAlocação Dinâmica

Glécio Rodrigues de Albuquerque

[email protected]

Page 2: Alocação Dinâmica em Linguagem C

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

Page 3: Alocação Dinâmica em Linguagem C

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).

Page 4: Alocação Dinâmica em Linguagem C

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.

Page 5: Alocação Dinâmica em Linguagem C

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.

Page 6: Alocação Dinâmica em Linguagem C

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.

Page 7: Alocação Dinâmica em Linguagem C

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

Page 8: Alocação Dinâmica em Linguagem C

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:

Page 9: Alocação Dinâmica em Linguagem C

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:

Page 10: Alocação Dinâmica em Linguagem C

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.

Page 11: Alocação Dinâmica em Linguagem C

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:

Page 12: Alocação Dinâmica em Linguagem C

Alocação Dinâmica em Linguagem C

Sizeof• Exemplos anteriores aplicando o operador sizeof:

Page 13: Alocação Dinâmica em Linguagem C

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:

Page 14: Alocação Dinâmica em Linguagem C

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.

Page 15: Alocação Dinâmica em Linguagem C

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.

Page 16: Alocação Dinâmica em Linguagem C

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.

Page 17: Alocação Dinâmica em Linguagem C

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:

Page 18: Alocação Dinâmica em Linguagem C

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.

Page 19: Alocação Dinâmica em Linguagem C

Alocação Dinâmica em Linguagem C

Alocando Matrizes• Exemplo da alocação dinâmica de uma matriz n x m:

Page 20: Alocação Dinâmica em Linguagem C

Alocação Dinâmica em Linguagem C

Desalocando Matrizes• Exemplo de desalocação da matriz n x m alocada

anteriormente:

Page 21: Alocação Dinâmica em Linguagem C

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.

Page 22: Alocação Dinâmica em Linguagem C

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.

Page 23: Alocação Dinâmica em Linguagem C

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.

Page 24: Alocação Dinâmica em Linguagem C

Alocação Dinâmica em Linguagem C

Realloc• Exemplo de uso da função realloc:

Page 25: Alocação Dinâmica em Linguagem C

Alocação Dinâmica em Linguagem C

Realloc• Alocando e desalocando com realloc:

Page 26: Alocação Dinâmica em Linguagem C

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

Page 27: Alocação Dinâmica em Linguagem C

Alocação Dinâmica em Linguagem C

Códigos e exercícios

https://drive.google.com/folderview?id=0BxsDe2LkW3V2cExTTTE3YWhmLTg&usp=sharing

Page 28: Alocação Dinâmica em Linguagem C

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.

Page 29: Alocação Dinâmica em Linguagem C

Alocação Dinâmica em Linguagem C

Obrigado!!!