Buscar

Aula 13 - Alocação Dinâmica

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

*
Alocação Dinâmica
*
Alocação Dinâmica
Muitas vezes usamos espaço desnecessário da memória declarando variáveis ou ainda ficamos limitados as variáveis declaradas.
A alocação dinâmica permite que aloquemos memória para um programa, durante sua execução.
Com esta capacidade, podemos definir, por exemplo, um vetor ou uma matriz cujo tamanho seja especificado em tempo de execução(pelo usuário, por exemplo).
Para fazermos alocação e desalocação dinâmica de memória utilizaremos funções da biblioteca <stdlib.h>
*
Alocação Dinâmica
malloc
A função "malloc" aloca memória e tem o seguinte protótipo:
 		void * malloc (unsigned int num);
Tal função aloca espaço na memória de tamanho num e devolve o endereço da primeira posição da memória alocada.
malloc cria somente um espaço e não inicializa.
Se não houver memória suficiente para atender ao que foi requisitado, a função retorna um ponteiro nulo (um ponteiro contendo NULL).
*
Alocação Dinâmica
Operador sizeof
Forma Geral:
sizeof(tipodedados) 
 Devolve a quantidade de bytes necessários para armazenar o tipo de dado indicado.
Exemplos:
printf("%d",sizeof(char));
printf("%d",sizeof(int));
printf("%d",sizeof(float));
printf("%d", sizeof(tipopessoa));
*
Alocação Dinâmica
Conversão de tipo
malloc e calloc retornam um ponteiro sem tipo, ‘genérico’ (void *), e precisamos converter para o tipo necessário.
Forma Geral:
	ponteiro = (tipo_de_dado *) malloc(...
*
Exemplo
Alocação dinâmica de um vetor de tamanho n (digitado pelo usuário.
# include <stdio.h>
# include <stdlib.h>
main()
{
	int a, i, *p;
 printf("Digite o tamanho do vetor: ");
	scanf("%d", &n);
	p = (int*) malloc(n*sizeof(int));
	if(!p)
		printf("\n\nErro! Memória Insuficiente!\n");
	else
	{
		for(i = 0; i < n; i++)
		 p[i] = i*i; //p é um vetor com n posições
	}
}
*
free
Podemos também liberar dinamicamente a memória que não é mais necessária, usando a função:
			void free(void* ptr);
Basta passar para ‘free’ o ponteiro que aponta para o início da memória a ser liberada.
*
Exemplo
# include <stdio.h>
# include <stdlib.h>
main()
{
	int a, i, *p;
 printf("Digite o tamanho do vetor: ");
	scanf("%d", &n);
	p = (int*) malloc(n*sizeof(int));
	if(!p)
		printf("\n\nErro! Memória Insuficiente!\n");
	else
	{
		for(i = 0; i < n; i++)
		 p[i] = i*i; 
	}
	free(p);
}
*
Alocação Dinâmica
Outras funções:
calloc
A função calloc() também serve para alocar memória, mas possui um protótipo um pouco diferente: 
	void *calloc (unsigned int num, unsigned int size);
A função aloca uma quantidade de memória igual a num * size e retorna o endereço da primeira posição alocada;
Se não houver memória suficiente para alocar a memória requisitada a função calloc() retorna um ponteiro nulo. 
A função calloc inicializa as posições alocadas com 0.
*
Alocação Dinâmica
realloc
A função realloc() serve para realocar memória e tem o seguinte protótipo: 
	void *realloc (void *ptr, unsigned int num);
A função modifica o tamanho da memória previamente alocada apontada por *ptr para aquele especificado por num.
O valor de num pode ser maior ou menor que o original. 
Um ponteiro para o bloco é devolvido porque realloc() pode precisar mover o bloco para aumentar seu tamanho. Se isso ocorrer, o conteúdo do bloco antigo é copiado no novo bloco, e nenhuma informação é perdida. 
Se ptr for nulo, aloca size bytes e devolve o endereço; se size é zero, a memória apontada por ptr é liberada. 
Se não houver memória suficiente para a alocação, um ponteiro nulo é devolvido e o bloco original é deixado inalterado. 
*
Escreva um programa que aloque dinamicamente memória para armazenar 1 (um) número real e atribua o endereço alocado a um ponteiro pt. Leia um valor real e armazene-o no endereço alocado. Em seguida imprima o endereço alocado (%p) e o valor lido.
Exercício 1
#include <stdio.h>
#include <stdlib.h>
main()
{
 float *pt;
 pt = (float *) malloc (sizeof(float));
 printf ("Digite um numero real:");
 scanf ("%f", pt);
 printf ("O endereco alocado para pt foi: %p\n", pt);
 printf ("O valor lido foi: %.2f", *pt);
}
*
Escreva um programa que lê um número inteiro N e aloca dinamicamente um vetor com N posições. Em seguida seu programa deve chamar uma única função que deverá ler uma sequência de N inteiros positivos naquele vetor, e calcular a média e a soma dos elementos do vetor. A main deve imprimir os resultados da função.
Exercício 2
*
Uma empresa de seguros deseja cadastrar os seguintes dados de cada um de seus clientes: matrícula do cliente, nome do cliente, valor da apólice, idade do cliente, estado civil do cliente (S, C ou D). Escreva um programa que contenha uma estrutura capaz de armazenar os dados de cada cliente. O programa também deve ler o número de clientes da empresa, armazenar os dados de todos os clientes em um vetor alocado dinamicamente, e chamar uma função que calcula e imprime a média de valores de apólice dos clientes casados, o nome e o estado civil do cliente com o maior valor de apólice, e a porcentagem de clientes com menos de 40 anos.
Exercício 3

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais