As funções malloc e free

Livre

0
0
5
1 year ago
Preview
Full text

  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.

  1 Tem-se duas funções relacionadas com esse tipo de operação. A função malloc para a alocação de

  memória e a função free para liberar a alocação de memória alocada por malloc. Estas funções fazem parte da biblioteca padrão da linguagem C e os seus protótipos encontram-se em stdlib.h ou alloc.h.

  As funções malloc e free

O protótipo da função malloc é: void ∗ malloc ( s i z e _ t ) ;

  o A função malloc recebe como parâmetro o número de bytes a ser alocado e retorna um endereço para o 1 byte do bloco de bytes alocado. size_t refere-se a um unsigned integral type e expressa um tamanho ou contagem de bytes e 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 if para 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ção exit(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 no heap deve-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 ∗ ) ; o

  A função free recebe como parâmetro o endereço do 1 byte de 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 string para depois ler a string.

  1 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 no heap. 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" ) ; /∗ pula 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

  O operador sizeof é um operador em tempo de compilação e unário que retorna o tamanho em bytes da substituído pelo valor em bytes referente a uma variável sizeof(a), onde a é uma variável ou especificador de tipo sizeof(double).

  O operador sizeof ajuda 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 string possui.

  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 da string pelo caractere ’X’ maiúsculo e as consoantes por ’y’ minúsculos.

  6. Faça um programa aloque memória suficiente no heap, leia uma string e 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 string e transforme toda a string para maiúsculas.

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

  9. Faça um programa que aloque memória suficente no heap, leia uma string e inverta o conteúdo da string sem utilizar um outro vetor. Fazer a inversão utilizando um único vetor.

  10. Faça um programa aloque memória dinamicamente suficiente para uma sequência de caracteres, leia

  2

  uma sequência de caracteres e informe se essa sequência de caracteres é um palíndromo 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 valor 5. 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 : t i

  2 S

  = (V ) i − V t−i

  

=1

n

  8. Se uma variável aleatória X toma os valores x , x , . . . , x , então o desvio padrão para esta amostra de

  1

  2

  n números (ou desvio padrão amostral) pode ser calculado da seguinte maneira. Primeiro calcula-se a média de X, x, por intermédio de: ∑ n n 1 x + x

  · · · + x

i

  1

  2

  x x = = n n i

  =1

  O desvio padrão amostral é calculado como: u u v n

  1 t i

  2

  dp = (x − x) n − 1 i

  =1

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

  Palíndromo vem do grego palin (para trás) e dromos (corrida, pista). É qualquer sequência que tenha a propriedade de

ser lida tanto da direita para a esquerda, como da esquerda para a direita, tais como, palavra ou frase. Num palíndromo,

normalmente são desconsiderados os sinais ortográficos assim como o espaço entre as palavras. Exemplos de frase palíndromo

são: Socorram-me, subi no ônibus em Marrocos; Anotaram a data da maratona; Assam a massa; A torre da derrota; Saudável

leva duas; A sacada da casa. Exemplos de palavras: asa, osso, ata, ana, sopapos, arara, metem, matam, aviva, mamam, ama.

  9. Dado dois vetores preenchidos com valores em ordem crescente de classificação (ordenados). Faça um programa que leia os tamanhos dos vetores, leia o conteúdo dos dois vetores, gere e mostre um terceiro vetor com todos os elementos em ordem crescente de classificação (ordenado).

Novo documento

Tags

Documento similar

JÚLIO CÉSAR MEDEIROS DA SILVA PEREIRA Trabalho, folga e cuidados terapêuticos: A sociabilidade escrava na Imperial Fazenda Santa Cruz, na segunda metade do século XIX
0
6
306
Casa de Oswaldo Cruz – FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde FERNANDA REBELO
0
5
325
Casa de Oswaldo Cruz - FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
0
3
309
CASA DE OSWALDO CRUZ – FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
1
1
243
Casa de Oswaldo Cruz - FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
0
1
168
Casa de Oswaldo Cruz – FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde JOÃO LUIZ GARCIA GUIMARÃES
0
1
180
Casa de Oswaldo Cruz-FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
0
0
124
O Sertão nos Trilhos: ferrovia, ambiente e saúde no debate sobre a integração do Norte de Minas Gerais (Diamantina, 1902 -1922)
0
3
176
Casa de Oswaldo Cruz – FIOCRUZ Programa de Pós-Graduação em História das Ciências e da Saúde
0
0
169
O que é Filosofia e por que vale a pena estudá-la
0
0
16
Critérios de decisão entre hipóteses científicas rivais em Kuhn, Lakatos e Laudan
0
0
14
Projeto Interdisciplinar da Festa de Aniversário da Escola Estadual Cidade de Hiroshima HIROSHIMA – 70 anos da Bomba Ressonâncias e Repercussões
0
1
9
Transdisciplinaridade, interdisciplinaridade e disciplinaridade na história da ciência
0
0
15
A composição e estrutura dos cabelos
0
0
10
O Ensino de Equilíbrio Químico a partir dos trabalhos do cientista alemão Fritz Haber na síntese da amônia e no programa de armas químicas durante a Primeira Guerra Mundial
0
0
11
Show more