PROGRAMAÇÃO E ALGORITMOS (LEI) Uiversidade da Beira Iterior, Departameto de Iformática Hugo Pedro Proeça, 2016/2017
Resumo Alocação de Memória Estática Diãmica malloc calloc realloc free Exercícios
Gestão de Memória Ao cotrário de outras liguages de programação, o C dispoibiliza um cojuto de fuções de baixo ível para a gestão de recursos (memória). Ausêcia de GarbageCollector (Java) Processo que admiistra os recursos utilizados por um programa. Caso eles ão estejam a ser utilizados liberta-os automáticamete. Esta característica aumeta a resposabilidade do programador. Resposável pela eficiete gestão de recursos Optimização de recursos, evitado-se a ecessidade de um processo (exigete em termos computacioais) em permaete execução.
Gestão de Memória Regra pricipal Todos os recursos explícitamete alocados durate a execução de um programa devem ser explicitamete libertados.
Alocação de Recursos Cosidere o seguite exercício: Implemete um programa em liguagem C que receba úmeros iterior e mostre o écra a maior sequêcia de valores positivos recebidos. O programa deverá termiar ao ser itroduzido o valor 0. Problemas: Quatos úmeros vai ser ecessário receber? Qual a quatidade de memória ecessária para os receber?
Alocação de Recursos Uma primeira abordagem será a alocação estática de recursos, por vezes referida como em tempo de compilação : O programador (o código-fote) estima um valor que julga suficiete e pede a respectiva alocação. A alocação acotece o mometo em que o programa começa a execução (o caso da fução mai), ou o iício do processo de execução da fução. #iclude <stdio.h> it mai(){ it v[10000]; (...)
Alocação de Recursos Exemplo: #iclude <stdio.h> void fuc(){ it v[10000]; (...) it mai(){ it v[10000]; (...) Alcace Local (detro da fução em que estão defiidas)
Recursos Diâmicos No caso da alocação diãmica, os recursos são pedidos e libertados durate a execução do programa, o mometo da execução de uma dada liha. Compete ao programador defiir o mecaismo de alocação / libertação, por forma a que a admiistração dos recursos seja correcta. Alocação: malloc() calloc() realloc() Libertação free()
Apotadores O que é um apotador? Variável que cotém um edereço de memória. Exemplos: it x=5; float z=3.1415; char c; 5 3.1415 x, 4 bytes z, 8 bytes Apotador: Espaço ocupado depede do limite de edereçameto da máquia, mas tipicamete tem o mesmo tamaho de um iteiro. Exlº: it *p; A00BF:FA00C p, 4 bytes a c, 1 byte
Apotadores Um apotador cotém iformação sobre uma determiada localização e quatidade de memória: Exlos: it *a; double *b; a4:b9:f:c:6 a4:b9:f:c:6 Igual tamaho! b5:a9:4:8 b5:a9:4:8
Alocação Diâmica Fução malloc() Está defiida a biblioteca stdlib.h Iclusão de ova biblioteca #iclude <stdlib.h> Protótipo: void *malloc ( usiged it size ) Exemplos: Recebe como parãmetro de etrada o total de bytes a alocar. Retora um apotador geérico para o bloco de memóriaalocado. it *v=(it*)malloc(10 * sizeof(it)); cast Total de elemetos Espaço de 1 elemeto
Alocação Diâmica Após a alocação diâmica, os recursos são utilizados exectamete da mesma forma como os recursos estáticos. Suporta tipos compostos: typedef struct{ it bi; char ome[80]; Pessoa; Alocação de um cojuto de 100 pessoas: Pessoa *v=(pessoa *) malloc(100*sizeof(pessoa)) Acesso aos recursos v[0].ome //Nome da pessoa da primeira posição
Alocação Diâmica Fução calloc() Está defiida a biblioteca stdlib.h Semelhate à fução-base (malloc) Aloca x elemetos de um determiado tipo Iicializa os recursos alocados, com o valor 0. Protótipo: void *calloc ( usiged it umber, usiged it size ) Exemplos: Recebe como parãmetros de etrada o úmero de elemetose o espaço ocupado por 1 uidade. Retora um apotador geérico para o bloco de memóriaalocado. it *v=(it*)calloc(10,sizeof(it));
Alocação Diâmica Fução realloc() Está defiida a biblioteca stdlib.h Serve para realocar (aumetar ou dimiuir de tamaho), um bloco préviamete alocado. Protótipo: void *realloc ( void *old_pt, usiged it ew_size ) Recebe como parãmetros de etrada o apotador para o bloco préviamete alocado e o ovo tamaho do bloco. Retora um apotador geérico para o bloco de memóriaalocado. Teha-se em ateção que o bloco (1º parãmetro) teve que ser préviamete alocado de forma diãmica.
Alocação Diâmica Exemplos: it *v=(it*)malloc(10*sizeof(it)),i; //Aloca 10 iteiros; for (i=1;i<10;i++) v=(it*)realloc(v,(10+i)*sizeof(it)); Caso o bloco préviamete alocado ão teha elemetos, terá que estar a apotar para NULL. it *v=null, i=0; v=(it*)realloc(v,(i+1)*sizeof(it));
Alocação Diâmica Fução free() Sefve para libertar todos os recursos diãmicamete alocados, qulquer que teha sido a fução utilizada o alocameto. Protótipo: malloc(), calloc(), realloc() void free ( void *pt ) Recebe um apotador para o bloco de memória. Teha-se em ateção que o valor da variável ão é alterado, apeas os recursos para ode apota são libertados. Exemplo: free(v); v=null;
Exercício #iclude <stdio.h> it mai(){ it *v=null, tot=0, x; do{ pritf( valor?\ ); scaf( %d,&x); if (x!=0){ tot++; v=(it*)realloc(v,tot*sizeof(it)); v[tot-1]=x; while(x!=0); mostramaiorsequeciapositivos(v,tot);
Exercício void mostramaiorsequeciapositivos(it *v, it tot){ it pos=0,i, M=0,c=0; for (i=0;i<tot;i++){ if (v[i]>0){ c++; if (c>m){ pos=i-m; M=c; else{ c=0; for (i=pos;i<pos+m;i++) pritf( %d,v[i]);