490 likes | 602 Views
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
E N D
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ópicos 1 Alocação Dinâmica 2 Heap 3 Pilha 4 E/S em C
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
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
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
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)
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"); }
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))
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
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
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"); }
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!
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
Pilha Heap Segmento de Dados de 64 KB Dados Heap II • Heap
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
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"); }
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
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(); }
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
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
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);
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); } }
FUNÇÃO OPERAÇÃO E/S em C I • Funções de E/S via Console
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()
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); }
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;}
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); }
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
E/S em C VII • Macro toupper()
E/S em C VIII • Funções de E/S via Console
E/S em C IX • printf() ESPECIFICAÇÃO DE FORMATO
E/S em C X • printf()
Formato Tipo %d int %ld long int %u unsigned int %f float %lf double E/S em C XI • scanf() ESPECIFICAÇÃO DE FORMATO
\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
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"); }
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 */ }
E/S em C XV • E/S ANSI – Stream/Arquivo
E/S em C XVI • E/S ANSI – Stream/Arquivo
E/S em C XVII fopen()FILE *fopen(const char *filename, const char *mode);
E/S em C XVIII fopen()FILE *fopen(const char *filename, const char *mode);
E/S em C XIX • fopen()
E/S em C XX • Exemplo 10 – Uso de fopen()
E/S em C XXI • Exemplo 11 – Uso de fopen()
#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()
E/S em C XXIII • Exemplo 13 – Uso de fopen()
E/S em C XXIV • Exemplo 14 – Uso de fwrite()
E/S em C XXV • Exemplo 15 – Uso de fread()
E/S em C XXVI • Exercício Repita os dois últimos exemplos, substituindo as funções fwrite()e fread()por fprintf() e fscanf(), respectivamente.
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