90 likes | 264 Views
Mäluhaldus. Mälu olemus. Iga andmetüüp nõuab meilt kindla koguse mälu : Char – 1 bait Int – 4 baiti Float – 4 baiti Double – 8 baiti Struct – structi elementide summa Union – suurima elemendi suurus s izeof () funktsioon abiks !
E N D
Mäluolemus • Igaandmetüüpnõuab meilt kindla koguse mälu : • Char – 1 bait • Int – 4 baiti • Float – 4 baiti • Double – 8 baiti • Struct – structi elementide summa • Union – suurima elemendi suurus • sizeof() funktsioon abiks! • Antud mälumahud võivad varieeruda erinevatel protsessorite arhitektuuridel, kompilaatoritel ja operatsioonisüsteemidel
Dünaamilise mälu kasutamise põhimõtted • Lisame programmile teegi <malloc.h> • Kõiki massiive deklareerime viitadena • Programmeerija küsib igale soovitud andmehulgale vajaliku mälumahu (NB! Peab jälgima, et mitte küsida liiga palju või vähe!) • Küsitud mälus liigume soovitavalt viitasid kasutades • Küsitud mäluhulk vabastatakse, kui seda enam vaja ei ole • Mõneti sarnane failide kasutamise fopen() ja fclose() põhimõttele.
Mälu küsimine malloc() funktsiooniga • Prototüüp:void* malloc (size_tsize); • Parameetriks: küsitava mälu suurus baitides • Tagastuseks: (void) tüüpi pointer allokeeritud mäluala algusele • malloc() -> abikssizeof() funktsioon • Kõik küsitud mälu tuleb vabastada käsitsi funktsiooniga free(); • viit=(andmetüüp*)malloc(sizeof(andmetüüp)*n); • free(viit);
Malloci realisatsioon koodis • Kõik operatsioonid kolivad viitade peale üle! St nüüdsest me ei deklareeri enam kindla pikkusega massiivi, vaid viida, millele anname vastavalt vajadusele mälu! • Vanasti: intmassiiv[10]; • Nüüd: int*massiiv; massiiv =(int*)malloc(n *sizeof(int));
Pointeraritmeetika #include <stdio.h> #include <malloc.h> intmain(void) { int*p,i; p=(int*)malloc(3*sizeof(int)); *(p+0)=5; *(p+1)=3; *(p+2)=7; for(i=0;i<3;i++) printf("%p, %d\n",(p+i),*(p+i)); free(p); return 0; } *p48F9AC91 5 3 7 *(p+0) *(p+1) *(p+2)
Pointeraritmeetika jätkub #include <stdio.h> #include <malloc.h> intmain(void) { int*p,*p2,i=0; p=(int*)malloc(3*sizeof(int)); *(p+0)=5; *(p+1)=3; *(p+2)=7; for(p2 =p;i<3;p2++ ,i++) printf("%p, %d\n", p2,*p2); free(p); return 0; } *p48F9AC91 *(p + 2) *(p + 0) *(p + 1) 5 3 7 *p2
Kodutöö • Läbi vaadata ja endale lahti mõtestada • http://www.youtube.com/watch?v=_8-ht2AKyH4&list=TLn7hcrtQgrIsNuGQujVnwzM8jbtxwTgrb
Tunnitöö • Kirjutaprogrammmis: • küsibkasutajaltnnegatiivset täisarvu • salvestab arvud dünaamilist mälujaotust kasutavasse massiivi • sorteerib need arvudkahanevas järjekorras – selleks kasuta qsort() funktsiooni • väljastabniialgseseisu,kuikalõpptulemuse,eraldiväljundfailidesse • NB!Kõikelementaarsednõudedtäita (failikontroll, teegid, jne) • NB! Kõik massiiviga teostatavad operatsioonid tuleb teha viitadega