1 / 49

Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.br rangeldequeiroz@gmail

Alocação de Memória. e Funções de E/S. Técnicas de Programação. Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.edu.br rangeldequeiroz@gmail.com. Carga Horária: 60 horas. Carga Horária: 60 horas. Alocação de Memória. Tó p icos 1 Alocação Dinâmica 2 Heap 3 Pilha

heba
Download Presentation

Prof.: José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.br rangeldequeiroz@gmail

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Alocação de Memória e Funções de E/S Técnicas de Programação Prof.:José Eustáquio Rangel de Queiroz rangel@dsc.ufcg.edu.br rangeldequeiroz@gmail.com Carga Horária:60 horas Carga Horária:60 horas

  2. Alocação de Memória Tópicos 1 Alocação Dinâmica 2 Heap 3 Pilha 4 E/S em C

  3. Alocação Dinâmica I • Alocação Dinâmica • Declaração de uma variável  Alocação de memória pelo compilador para armazenamento da variável • Alterações de requisitos do programa/ da variável  Edição para realização das alterações e recompilação do programa

  4. Alocação Dinâmica II • Alocação Dinâmica • Alocação de espaço de armazenamento durante a execução  Redução no número de alterações nos tamanhos das variáveis • Alocação Dinâmica  Retorno de um apontador para o início do intervalo de memória pela biblioteca de execução de C

  5. Alocação Dinâmica III • Alocação Dinâmica • Alocação de memória durante a execução  Uso da função malloc • Sintaxe #include <alloc.h> void *malloc(size_t num_bytes); num_bytes número de bytes a ser alocado

  6. Alocação Dinâmica IV • Uso de malloc • Satisfatório  Retorno de um apontador para o início do intervalo • Insatisfatório  Retorno de NULL (ocorrência de erro)

  7. Alocação Dinâmica V • Exemplo 1 – Uso de malloc #include <stdio.h> #include <alloc.h> void main(void) { char *string; int *int_dados; float *float_dados; if ((string = (char *) malloc(50))) printf(“Sucesso na alocação de uma string de 50 bytes\n"); else printf("Erro na alocação da string\n"); if ((int_dados = (int *) malloc(100 * sizeof(int))) != NULL) printf(" Sucesso na alocação de int_dados[100]\n"); else printf(" Erro na alocação de int_dados[100]\n"); if ((float_dados = (float *) malloc(25 * sizeof(float))) != NULL) printf(" Sucesso na alocação de float_dados[25]\n"); else printf(" Erro na alocação de float_dados[25]\n"); }

  8. Alocação Dinâmica VI • Uso de malloc – Conversão do tipo de apontador • Alocação de um apontador para n dados do tipo int int *dados; dados = (int *) malloc(n * sizeof(int)) • Alocação de um apontador para k dados do tipo float float *dados; dados = (float *) malloc(k * sizeof(float))

  9. Alocação Dinâmica VII • Liberação da memória alocada após o uso • Chamada da função free() #include <alloc.h> void free(apont); apont apontador para o início do intervalo de memória a ser liberado

  10. Alocação Dinâmica VIII • Uso da função calloc() • malloc()  Número de bytes a ser alocado • calloc()  Número de elementos de um tamanho específico a serem alocados • Sintaxe #include <alloc.h> void *calloc(size_t num_itens, size_t tam_item); num_itens Número de itens a serem alocados tam_item Tamanho (em bytes) de cada item

  11. Alocação Dinâmica IX • Exemplo 2 – Uso de calloc #include <stdio.h> #include <alloc.h> void main(void) { char *string; int *int_dados; float *float_dados; if ((string = (char *) calloc(50, sizeof(char)))) printf(“Sucesso na alocação de uma string de 50 bytes\n"); else printf("Erro de alocação da string\n"); if ((int_dados = (int *) calloc(100, sizeof(int))) != NULL) printf(" Sucesso na alocação de int_dados[100]\n"); else printf(" Erro de alocação de int_dados[100]\n"); if ((float_dados = (float *) calloc(25, sizeof(float))) != NULL) printf(" Sucesso na alocação de float_dados[25]\n"); else printf(" Erro de alocação de float_dados[25]\n"); }

  12. Alocação Dinâmica X • Uso de calloc • Satisfatório  Retorno de um apontador para o início do intervalo • Insatisfatório  Retorno de NULL (ocorrência de erro) • Liberação após o uso a partir da função free() Se o programa NÃO usar free() para liberar a memória após o uso, a liberação ocorrerá automaticamente. Todavia, é ACONSELHÁVEL liberar a memória assim que esta não mais for necessária!

  13. Heap I • Heap • Reservatório de memória não usado, a partir do qual a biblioteca de execução de C reserva memória quando programas alocam dinamicamente a memória • Modelo de memória small Área de memória entre o topo da área de dados do programa compilado e a pilha

  14. Pilha Heap Segmento de Dados de 64 KB Dados Heap II • Heap

  15. Heap III • Heap • Residente no segmento de dados do programa • Quantidade de heap disponível para um programa  Fixa • Falha de alocação para quantidades de memória superiores a 64 KB

  16. Heap IV • Exemplo 3 – Falha de alocação por falta de espaço #include <stdio.h> #include <alloc.h> void main(void) { char *m1, *m2, *m3; if ((m1 = (char *) malloc(30000)) == NULL) printf("Erro de alocação da matriz 1\n"); else if ((m2 = (char *) malloc(30000)) == NULL) printf("Erro de alocação da matriz 2\n"); else if ((m3 = (char *) malloc(30000)) == NULL) printf("Erro de alocação da matriz 3\n"); else printf(“Sucesso na alocação de todas as matrizes \n"); }

  17. Heap V • Contorno da Limitação de 64 KB para o Heap • Uso de farmalloc() e farcalloc() • Parâmetros idênticos àqueles passados para malloc() e calloc() • Necessidade de uso de um ponteiro far para os dados

  18. Heap VI • Exemplo 4 – Alocação com farmalloc() #include <stdio.h> #include <alloc.h> #include <conio.h> void main(void) { char *string; int *int_dados; float *float_dados; clrscr(); if ((string = (char *) malloc(50000))) printf(“Sucesso na alocação de uma string de 50 Kbytes\n"); else printf("Erro na alocação da string\n"); if ((int_dados = (int *) malloc(100000 * sizeof(int))) != NULL) printf(" Sucesso na alocação de int_dados[100000]\n"); else printf(" Erro na alocação de int_dados[100000]\n"); if ((float_dados = (float *) malloc(250 * sizeof(float))) != NULL) printf(" Sucesso na alocação de float_dados[250]\n"); else printf(" Erro na alocação de float_dados[250]\n"); getch(); }

  19. Pilha I • Uso da função alloca() • Alocação de memória durante chamadas de funções específicas • Parâmetros idênticos àqueles passados para malloc() • Isenção do uso da função free() para a liberação de memória previamente alocada • Liberação automática da memória alocada quando a execução da função terminar

  20. Pilha II • Recomendações no uso de alloca() • Restauração correta do apontador da pilha  Declaração de variáveis locais na função • Garantia de uma estruturação correta da pilha  Declaração de uma variável localapós a declaração da variável de apontamento para a qual alloca atribui seu resultado

  21. Pilha III • Recomendações no uso de alloca() • Exemplo da forma de declaração recomendada char *apont; char pilha_certa[1]; pilha_certa[0] = NULL; apont = alloca(tamanho);

  22. Pilha IV • Exemplo 5 – Alocação com alloca() void main(void) { func(1000); func(32000); func(65000); } #include <stdio.h> #include <malloc.h> void func(size_t tam) { int i; char *apont, pilha_certa[1]; pilha_certa[0] = NULL; if ((apont = alloca(tamanho)) == NULL) printf("Erro na alocação de %u Bytes da pilha\n", tam); else { for (i = 0; i < tam; i++) apont[i] = i; printf("Um buffer de %u Bytes foi alocado e usado\n", tam); } }

  23. FUNÇÃO OPERAÇÃO E/S em C I • Funções de E/S via Console

  24. main ( ) { char ch; clrscr(); printf ( “\nDigite um caractere”); ch = getchar( ); printf (“\n Todos sabem que você digitou %c”, ch); } E/S em C II • Exemplo 6 – Uso de getchar()

  25. E/S em C III • Exemplo 7 – Uso de getch() main ( ) { char ch; ch = getch( ); printf (“ \ nSomente agora saberemos”); printf (“que você digitou %c”, ch); }

  26. E/S em C IV • Exemplo 8 – Uso de gets() #include <stdio.h>int main(){ char buffer[10]; clrscr(); printf(”\nDigite seu nome"); gets(buffer); printf(”\nO nome é: %s\n", buffer); return 0;}

  27. E/S em C V • Exemplo 9 – Uso de puts() main ( ) { char nome[40]; clrscr(); printf (“\nDigite seu nome: ”); gets (&nome[0]); puts (“Bom dia ”); puts (nome); }

  28. do putchar(letra = getchar()); while(letra != ‘\n’); do { letra = getchar(); putchar(letra); } while(letra != ‘\n’); E/S em C VI • getchar()/ putchar() • Não são funções, são macros • Alguns compiladores não permitema inserção de espaços entre os nomes das macros e os parênteses

  29. E/S em C VII • Macro toupper()

  30. E/S em C VIII • Funções de E/S via Console

  31. E/S em C IX • printf() ESPECIFICAÇÃO DE FORMATO

  32. E/S em C X • printf()

  33. Formato Tipo %d int %ld long int %u unsigned int %f float %lf double E/S em C XI • scanf() ESPECIFICAÇÃO DE FORMATO

  34. \n Nova linha \r ENTER \t Tabulação (TAB) \b Retrocesso (BACKSPACE) \“ Aspas \ \ Barra \v Tabulacão vertical \a Sinal sonoro E/S em C XII • Caracteres de Controle

  35. E/S em C XIII • Exemplo #include<stdio.h> main() { clrscr(); puts("012345678901234567890"); printf("%-7.2f\n",123.234); printf("%7.2f\n",123.234); printf("%-5.2f\n",123.234); printf("%5.2f\n",3.324); printf("%10s\n","Alô"); printf("%-10s\n","Alô"); printf("%5.7s\n","123456789"); }

  36. E/S em C XIV • Exemplo main() { char str[80]; clrscr(); puts("Digite abcdefghijklmnopqrstuvwxyz:"); scanf("%20s",str); puts(str); scanf("%20s",str); /* o programa não parará nesta chamada a scanf() porque */ puts(str); /* ainda haverá caracteres nãotransferidos no buffer de entrada */ }

  37. E/S em C XV • E/S ANSI – Stream/Arquivo

  38. E/S em C XVI • E/S ANSI – Stream/Arquivo

  39. E/S em C XVII fopen()FILE *fopen(const char *filename, const char *mode);

  40. E/S em C XVIII fopen()FILE *fopen(const char *filename, const char *mode);

  41. E/S em C XIX • fopen()

  42. E/S em C XX • Exemplo 10 – Uso de fopen()

  43. E/S em C XXI • Exemplo 11 – Uso de fopen()

  44. #include < stdio.h > #include < stdlib.h > int main() { FILE *pf; float pi = 3.1415; float pi_lido ; if((pf = fopen("arquivo.bin ", " wb ")) == NULL) /* Abre arquivo binário para escrita */ { printf("Erro na abertura do arquivo "); exit(1); } if(fwrite(&pi , sizeof(float ), 1,pf) != 1) /* Escreve a variável pi */ printf("Erro na escrita do arquivo "); fclose(pf ); /* Fecha o arquivo */ return(0); } E/S em C XXII • Exemplo 12 – Uso de fopen()

  45. E/S em C XXIII • Exemplo 13 – Uso de fopen()

  46. E/S em C XXIV • Exemplo 14 – Uso de fwrite()

  47. E/S em C XXV • Exemplo 15 – Uso de fread()

  48. E/S em C XXVI • Exercício Repita os dois últimos exemplos, substituindo as funções fwrite()e fread()por fprintf() e fscanf(), respectivamente.

  49. Joseana Macêdo Fechine José Eustáquio Rangel de Queiroz UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE CIÊNCIAS E TECNOLOGIA DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO {joseana, rangel}@dsc.ufcg.edu.br

More Related