• Nenhum resultado encontrado

As funções malloc e free

N/A
N/A
Protected

Academic year: 2019

Share "As funções malloc e free"

Copied!
5
0
0

Texto

(1)

UNIVERSIDADE FEDERAL DE MINAS GERAIS

Departamento de Ciência da Computação

Disciplina Curso Turno Período

Algoritmos e Estruturas de Dados I EE e CA Vespertino 1◦

Professor

Camillo J. S. Oliveira

Alocação Dinâmica de Memória

Na linguagem C pode-se reservar blocos de bytes dinamicamente na memória em tempo de execução (durante a execução) do programa. O espaço da memória reservado paras estas alocações é feita no heap.

Tem-se duas funções relacionadas com esse tipo de operação. A função malloc1 para a alocação de memória e a funçãofreepara liberar a alocação de memória alocada pormalloc. Estas funções fazem parte da biblioteca padrão da linguagem C e os seus protótipos encontram-se emstdlib.hou alloc.h.

As funções

malloc

e

free

O protótipo da funçãomalloc é:

void ∗malloc ( s i z e _ t ) ;

A função mallocrecebe como parâmetro o número de bytesa ser alocado e retorna um endereço para o 1o

byte do bloco debytes alocado. size_t refere-se a umunsigned integral typee expressa um tamanho ou contagem debytese está definido em stddef.h.

Não existindo memória suficiente no heap para a alocação a função malloc retorna um endereço nulo (NULL(’\0’,0)).

É conveniente verificar SEMPRE a alocação de memória no heap, verificar se realmente foi alocada a memória no heap, utilizando um comando de seleção ifpara verificar o retorno da função malloc, dar uma mensagem de alerta do que está acontecendo e abortar o programa por intermédio de uma chamada da funçãoexit(0) ou mesmo um return. Afinal se não conseguiu alocara a memória, não se tem motivos para continuar o programa.

Sempre que se reserva (aloca) um espaço de memória noheapdeve-se liberar (desalocar) o espaço alocado por intermédio da função free, que possui o protótipo:

void f r e e (void ∗) ;

A funçãofreerecebe como parâmetro o endereço do1o

bytede um bloco de memória alocado dinamicamente e não retorna nenhuma valor (void);

A seguir serão mostrados dois exemplos de programa que utilizam alocação dinâmica.

O código fonte do programa a seguir lê uma sequência de caracteres (string) da entrada padrão (teclado) e mostra em seguida o conteúdo lido. O programa aloca memória para a stringpara depois ler astring.

(2)

int main ( ) { char ∗s t r ;

/∗ r e s e r v a memória no heap ∗/

s t r = (char ∗) malloc ( 3 6 ) ;

/∗ t e s t a s e f o i a l o c a d a a memória ∗/

i f ( ! s t r ) {

/∗ não a l o c o u memória ∗/

puts ( " Faltou memória . . . \a\a\a" ; e x i t ( 0 ) ;

}

p r i n t f "\nNome : " ) ; g e t s ( s t r ) ;

p r i t n f ( "\n\n\nNome l i d o : %s " , s t r ) ;

/∗ l i b e r a a memória a l o c a d a para s t r ∗/

f r e e ( s t r ) ;

A função gets é uma função da biblioteca padrão da linguagem C que lê uma sequência de caracteres da entrada padrão (stdin).

O código fonte do programa a seguir lê o número de elementos de um vetor de inteiros, aloca dinamica-mente o vetor conforme o número de elementos do vetor e em seguida mostra o vetor. O vetor de inteiros será alocado de forma dinâmica noheap.

int main ( ) {

int i , tam , ∗V;

/∗ l ê o número de e l e m e n t o s do v e t o r ∗/

p r i n t f ( "\nNro . elementos : " ) ; s c a n f ( "%i %∗c " ,& tan ) ;

/∗ a l o c a memória no heap ∗/

V = (int ∗) malloc (s i z e o f(int) ∗ tam ) ;

/∗ v e r i f i c a s e f o i f e i t a a a l o c a ç ã o ∗/

i f ( !V) {

/∗ mensagem de a v i s o ∗/

puts ( " Faltou memória . . . \a\a\a" ) ; e x i t ( 0 ) ;

}

/∗ l e r o v e t o r de i n t e i r o s ∗/

for ( i = 0 ; i < tam ; i ++) { p r i n t f ( "\nV[% i ] =" ) ; s c a n f ( "%i %∗c " ,&V[ i ] ) ;

}

p r i n t f ( "\n" ) ; /∗ p u l a uma l i n h a ∗/

/∗ mostrar o v e t o r de i n t e i r o s ∗/

for ( i = 0 ; i < tam ; i ++) p r i n t f ( "%i " ,V[ i ] ) ;

/∗ l i b e r a r a memória ∗/

f r e e (V) ;

Operador sizeof

(3)

substituído pelo valor embytesreferente a uma variávelsizeof(a), ondea é uma variável ou especificador de tipo sizeof(double).

O operador sizeofajuda basicamente a gerar códigos portáveis que dependam do tamanho dos tipos de dados internos da linguagem C. Por exemplo, imagine um programa de banco de dados que precise armazenar seis valores inteiros por registro. Ao transportar o programa de banco de dados para vários computadores, não se deve assumir o tamanho de um inteiro, mas se deve determinar o tamanho do inteiro usando o operador sizeof.

Dado o fragmento de código a seguir:

int i , V [ 1 0 ] ; /∗ d e c l a r a ç ã o de um v e t o r e s t á t i c o ∗/

for ( i = 0 ; i < s i z e o f(V)/s i z e o f(int) ; i ++) { p r i n t f ( "\nV[% i ] = " , i ) ;

s c a n f ( "%i %∗c " ,&V[ i ] ) ;

}

O fragmento de código fonte anterior ilustra a utilização do operador sizeof. Trata-se de um programa que lê o conteúdo de um vetor de 10 inteiros. Caso necessite mudar de ambiente computacional apenas será necessário compilar o programa. E os valores do tamanho da variável V e o tamanho do inteiro sizeof(int) serão relativos ao sistema computacional.

Exercícios propostos: manipulação de sequências de caracteres (

strings

)

1. Faça um programa aloque espaço dinamicamente suficiente para um nome completo de uma pessoa, leia o nome e mostre quantos nomes o nome lido tem.

2. Faça um programa aloque espaço no heap suficiente, leia uma string e informe quantas vogais e consoantes a stringpossui.

3. Faça um programa que leia o tamanho de memória a ser alocado dinamicamente para uma string, leia a string e informe as quantidade a´s, e´s, i´s, o´s, u´s e consoantes existentes na sequência de caracteres.

4. Faça um programa que aloque dinamicamente um espaço suficiente para que se possa ler uma sequência de caracteres e informe o tamanho dessa sequência de caracteres. Lembre-se que toda sequência de caractere lida pela entrada padrão (stdin) tem um caractere nulo no final (’\0’).

5. Faça um programa aloque memória dinamicamente suficiente, leia uma sequência de caracteres e troque todas as vogais dastringpelo caractere ’X’ maiúsculo e as consoantes por ’y’ minúsculos.

6. Faça um programa aloque memória suficiente noheap, leia uma stringe informe se esta stringé: ALFABÉTICA : se possuir apenas caracteres alfabéticos.

ALFANUMÉRICA : se possuir apenas caracteres alfabéticos e numéricos. NUMÉRICA : se possuir apenas caracteres numéricos.

7. Faça um programa que aloque memória dinamicamente suficiente, leia uma stringe transforme toda astring para maiúsculas.

8. Faça um programa que aloque memória suficiente para duas string, leia uma string e gere uma segundastringcom o conteúdo da 1a

stringinvertida.

(4)

10. Faça um programa aloque memória dinamicamente suficiente para uma sequência de caracteres, leia uma sequência de caracteres e informe se essa sequência de caracteres é um palíndromo2 ou não é um palíndromo.

Exercícios propostos: manipulação de vetores numéricos

1. Faça um programa que leia o tamanho do vetor de inteiros, aloque memória para o vetor de inteiros e preencha (gere) o vetor da seguinte forma: nas posições pares com o valor 2 e nas posições ímpares com o valor5. Depois de preencher o vetor corretamente mostre o conteúdo do vetor preenchido.

2. Faça um programa que leia o tamanho de um vetor de inteiros, aloque memória para o vetor e, logo em seguida, leia os elementos do vetor e finalmente mostre o conteúdo do vetor.

3. Faça um programa que leia o tamanho de um vetor de inteiros, aloque memória para o vetor, leia o conteúdo do vetor e depois mostre esse vetor na ordem inversa.

4. Faça um programa que leia o tamanho de um vetor de ponto flutuante de dupla precisão, aloque memória para o vetor, logo em seguida, leia os elementos do vetor e mostre o somatório do conteúdo das posições pares do vetor e o produtório do conteúdo das posições ímpares do vetor.

5. Faça um programa que leia a dimensão de dois vetores de inteiros, aloque memória para dois vetores, leia o conteúdo de um dos vetores, gere um segundo vetor com mesmo conteúdo do primeiro vetor lido, mas dispostos na ordem inversa e mostre os dois vetores.

6. Faça um programa que leia o tamanho de um vetor de inteiros, aloque memória para o vetor, leia os elementos do vetor, mostre o conteúdo do vetor lido, realize a inversão do conteúdo do vetor e mostre o vetor. OBS. SEM UTILIZAR UM VETOR EXTRA.

7. Faça um programa que leia o tamanho (número de elementos) (t) de um vetor ponto flutuante de precisão simples, aloque memória para o vetor, leia os elementos do vetor, calcule e mostre o somatório S:

S =

t

i=1

(ViVti)2

8. Se uma variável aleatóriaXtoma os valoresx1, x2, . . . , xn, então o desvio padrão para esta amostra de

nnúmeros (ou desvio padrão amostral) pode ser calculado da seguinte maneira. Primeiro calcula-se a

média deX,x, por intermédio de:

x= 1

n

n

i=1

xi =

x1+x2· · ·+xn

n

O desvio padrão amostral é calculado como:

dp= v u u t 1

n−1

n

i=1

(xi−x)2

Faça um programa que leia o tamanho de um vetor de idades, aloque memória para o vetor de idades, leia as idades das pessoas, calcule e mostre a média e o desvio padrão das idades.

(5)

Referências

Documentos relacionados

Mesmo possuindo permeabilidade e porosidade sensivelmente diferentes entre as formações estudadas, os plugues 02 e 04 apresentaram as maiores eficiências de recuperação

Looking for a light-weight solution for avoiding the exces- sive encoding mode evaluations in traditional 3D-HTM encoding flow, the early termination block-level decision

- Se o estagiário, ou alguém com contacto direto, tiver sintomas sugestivos de infeção respiratória (febre, tosse, expetoração e/ou falta de ar) NÃO DEVE frequentar

Incidirei, em particular, sobre a noção de cuidado, estruturando o texto em duas partes: a primeira será uma breve explicitação da noção de cuidado em Martin Heidegger (o cuidado

ABSTRACT: The toxicological effects of crude ethanolic extracts (CEE) of the seed and bark of Persea americana have been analyzed on larvae and pupae of

( ) A reconstituição do braço de uma estrela-do-mar cortado é um exemplo de reprodução assexuada por regeneração. Em relação à reprodução das plantas, marque a

Meus livros: você terá acesso ao conteúdo digital de cada livro cadastrado (jogos, simuladores, infográficos e audiovisuais), bem como o arquivo em PDF do livro. Lembre-se que

O Trabalho Final de Curso (TFC), denominado Projeto 5 na Faculdade de Educação da UnB é a conclusão de mais uma etapa da minha vida acadêmica o estudo que resulta esta