Buscar

Aula 2 - Alocação EstáticaxDinamica em c

Prévia do material em texto

Alocação Dinâmica x Estática
Prof msc Wollace Picanço
Revisão: Ponteiros
Ponteiro é uma variável usada para armazenar o endereço de outras variáveis, permitindo assim a referência indireta de valores. Os endereços contidos em uma variável do tipo ponteiro podem ser alterados diretamente através de operações aritméticas.
Revisão: Ponteiros
Exemplo 1:
#include <stdio.h>
// & ->referencia um endereço de memória
// * ->referencia conteúdo de um endereço
int main()
{
 int a, *b;
 a = 50;
 	printf ("valor anterior da variavel A %d \n", a);
 b = &a;
 	 printf ("valor da variavel B %d \n", a);
 
 *b = 10;
 	 printf ("valor da variavel A %d \n", a);
 	 printf ("valor da variavel B %d \n", b);
 	printf ("valor da variavel apontando por B %d \n", *b);
 return 0;
}
Alocação Dinâmica
As declarações abaixo alocam espaço na memória para algumas variáveis. A alocação é estática (nada a ver com a palavra-chave static), ou seja, acontece antes que o programa comece a ser executado:
char c; 
int i; 
int v[10]; 
Alocação Dinâmica
Em muitas aplicações, 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. A alocação dinâmica é administrada pelas funções malloc, realloc e free, que estão na biblioteca stdlib.  Para usar essa biblioteca, inclua a correspondente interface no seu programa:
#include <stdlib.h>
Alocação Dinâmica: A função malloc
A função  malloc  (o nome é uma abreviatura de memory allocation) aloca espaço para um bloco de bytes consecutivos na memória RAM (= random access memory) do computador e devolve o endereço desse bloco.  O número de bytes é especificado no argumento da função. No seguinte fragmento de código, malloc aloca 1 byte:
char *ptr; 
ptr = malloc (1);
 scanf ("%c", ptr);
Alocação Dinâmica: A função malloc
O endereço devolvido por malloc é do tipo genérico  void *.   O programador armazena esse endereço num ponteiro de tipo apropriado. No exemplo anterior, o endereço é armazenado no ponteiro ptr, que é do tipo ponteiro-para-char.  A transformação do ponteiro genérico em ponteiro-para-char é automática; não é necessário escrever :
ptr = (char *) malloc (1);.
Alocação Dinâmica: A função malloc
A fim de alocar espaço para um objeto que precisa de mais que 1 byte, convém usar o operador sizeof, que diz quantos bytes o objeto em questão tem:
typedef struct {
 int dia, mes, ano;
 } data; 
data *d; 
d = malloc (sizeof (data)); 
d.dia = 31; 
d.mes = 12; 
d.ano = 2016;
Alocação Dinâmica: A função Free
As variáveis alocadas estaticamente dentro de uma função, também conhecidas como variáveis automáticas ou locais, desaparecem assim que a execução da função termina. 
Já as variáveis alocadas dinamicamente continuam a existir mesmo depois que a execução da função termina. Se for necessário liberar a memória ocupada por essas variáveis, é preciso recorrer à função free.
calloc() inicializa zero o buffer, enquanto malloc() deixa a memória não inicializada. 
int main() {
 int *p, *q;
 int x; 
 p = (int*) malloc(sizeof(int)); // aloca dinamicamente uma variável do tipo inteiro ( a variável é um ponteiro )
 *p = 3; // armazena 3 na variável p do tipo inteiro
 q = p; // faz o ponteiro q receber o ponteiro p alocado
 printf("%d %d\n", *p, *q); // imprime o conteúdo dos endereços apontados pelos ponteiros p e q
 x = 7; // atribui o valor 7 a variável x do tipo inteiro 
 *q = x; // atribui o valor da variável x ao conteúdo do endereço apontado pelo ponteiro q
 printf("%d %d\n", *p, *q); // imprime o conteúdo dos endereços apontados pelos ponteiros p e q
 p = (int*) malloc(sizeof(int)); // aloca dinamicamente uma variável do tipo inteiro 
 *p = 5; // armazena 5 na variável do tipo ponteiro
 printf("%d %d\n", *p, *q); // imprime o conteúdo dos endereços apontados pelos ponteiros p e q
 // aguarda o usuário pressionar uma tecla qualquer para finalizar o programa
}
sizeof
	função sizeof determina o número de bytes para 	um 	determinado tipo de dados. 
	x = sizeof(int); //retorna 4
malloc
A função malloc aloca um espaço de memória e retorna um ponteiro do tipo void para o início do espaço de memória alocado.
free
A função free libera o espaço de memória alocado.
Continua na próxima aula....

Continue navegando