Dynaaminen muisti Rakenteiset tietotyypit

Samankaltaiset tiedostot
Dynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.

Rakenteiset tietotyypit Moniulotteiset taulukot

Loppukurssin järjestelyt

Loppukurssin järjestelyt C:n edistyneet piirteet

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Lyhyt kertaus osoittimista

1. Mitä seuraava ohjelma tulostaa? Vastaukseksi riittää yksi rivi joka esittää tulosteen. (6 p)

Tietorakenteet ja algoritmit

Osoittimet ja taulukot

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Moduli 5: Kehittyneitä piirteitä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Tietueet. Tietueiden määrittely

Moduli 4: Moniulotteiset taulukot & Bittioperaatiot

Tietorakenteet ja algoritmit

A TIETORAKENTEET JA ALGORITMIT

Osoitin ja viittaus C++:ssa

Harjoitustyö: virtuaalikone

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

TIETORAKENTEET JA ALGORITMIT

Sisältö. C-ohjelmointi Luento 5: Osoittimet. Keko (heap) Pino (stack) Muistinhallinta Java vs C. Prosessin rakenne

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

Sukupuu -ohjelma. Ossi Väre ( ) Joni Virtanen ( )

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Osoittimet ja taulukot

Listarakenne (ArrayList-luokka)

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

7. Oliot ja viitteet 7.1

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Olio-ohjelmointi Syntaksikokoelma

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Jakso 4 Aliohjelmien toteutus

Tietotyypit ja operaattorit

Tieto- ja tallennusrakenteet

Tietorakenteet ja algoritmit

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

Muuttujien roolit Kiintoarvo cin >> r;

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Tietorakenteet ja algoritmit

Taulukot. Jukka Harju, Jukka Juslin

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Algoritmit 2. Luento 2 To Timo Männikkö

Ohjelmoinnin peruskurssi Y1

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Sisältö. 2. Taulukot. Yleistä. Yleistä

Ohjeet. AS C-ohjelmoinnin peruskurssi Aalto-yliopiston sahkotekniikan korkeakoulu Tentti , Raimo Nikkila

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

C-ohjelmointi: Osoittimet

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Algoritmit 2. Luento 2 Ke Timo Männikkö

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Algoritmit 1. Luento 4 Ke Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

SIMULINK S-funktiot. SIMULINK S-funktiot

Ohjelmointi 1 Taulukot ja merkkijonot

Choose Finland-Helsinki Valitse Finland-Helsinki

5.6. C-kielen perusteet, osa 6/8, Taulukko , pva, kuvat jma

Tietorakenteet ja algoritmit

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

15. oppitunti. Taulukot. Osa. Mikä on taulukko?

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Sisältö. 22. Taulukot. Yleistä. Yleistä

18. Abstraktit tietotyypit 18.1

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Binäärioperaatiot Tiedostot ja I/O

Jakso 4 Aliohjelmien toteutus

3. Binääripuu, Java-toteutus

Luento 4 Aliohjelmien toteutus

Tietorakenteet ja algoritmit

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Luennon sisältö. Taulukot (arrays) (Müldnerin kirjan luku 10) Yksiulotteiset taulukot. Mikä taulukko on? Taulukko-osoitin. tavallinen osoitin

C-ohjelmointi, syksy 2006

C-ohjelmointi, syksy Yksiulotteiset taulukot Moniulotteiset taulukot Dynaamiset taulukot. Binääritiedostot. Luento

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 1. Luento 6 Ke Timo Männikkö

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Ohjelmoinnin perusteet Y Python

Kielioppia: toisin kuin Javassa

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

Harjoitus 4 (viikko 47)

C-ohjelmointi Luento 5: Osoittimet Tiina Niklander

TAITAJA 2007 ELEKTRONIIKKAFINAALI KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

TAMPEREEN TEKNILLINEN YLIOPISTO

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

ITKP102 Ohjelmointi 1 (6 op)

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Binäärioperaatiot Tiedostot ja I/O

Jakso 4 Aliohjelmien toteutus

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

Osa III. Edelliset kolme lukua ovat käsitelleet viittausten ja osoittimien käyttöä. Tämän luvun aiheita ovat:

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

Transkriptio:

C! Dynaaminen muisti Rakenteiset tietotyypit 1.3.2016

Agenda Kertausta Dynaaminen muisti Valgrind-perusteet ja esimerkkejä Yhteenveto tietorakenteista Vilkaisu 3. kierroksen tehtäviin Esim: miten linkitetty lista toimii? Seuraava luento 15.3. 2

Palautetta / kierros 2 Make sure students understand that you NEED to end the string with a 0 Useissa tapauksissa 0-merkki unohtunut I did not understand why i had many '#' -characters in my result Olisi kiva jos kerrottaisiin, ettei destiä ole alustettu nollilla ja jos haluaa käyttää strcattia ensimmäinen merkki pitää muuttaa nollaksi stringien käsittelyyn tarkoitetut funktiot ovat täysin noituutta the clumsiness of c's string handling My local test server passed my code, but tmc test server rejected it due to compilation error? how is that possible? 3

Virtuaalimuistin rakenne mm. paikalliset muuttujat 0xFFFF FFFF FFFF FFFF Dynaamisesti varattu muisti Koodi ja vakiomerkkijonot 0x0000 0000 0000 0000 4

Pino ja pinokehys int multiply(int para, int parb) { int result = para * parb; return result; } void calc(int value) { int num = 10; int res = multiply(num, value); }.(aikaisemmat funktiot). 0x0004DA23 paluuosoite 20 value 10 num? res 0x0004D95A paluuosoite 10 para 20 parb 200 result Pinokehys (yksi jokaista funktiokutsua kohden) calc() multiply() 5

Miksi dynaaminen muisti? Pitkäikäinen data Funktion paikalliset muuttujat häviävät funktiosta poistuttaessa Tarvitaan N:lle alkiolle tilaa mutta koodausaikana ei tiedetä N:ää N voi vaihdella ohjelman aikana, voi kasvaa suureksikin Ei tulisi käyttää enempää muistia kuin tarvitaan Muistinkäsittelyvirheet joskus helpompi havaita Valgrind Pinossa virheelliset muistiviittaukset aiheuttavat hämmentäviä ongelmia 6

Dynaaminen muisti ja keko (heap) Ohjelma voi varata muistia dynaamisesti tarvitsemansa määrän void *malloc(koko) Vaihtuvanmittaiset tietorakenteet Ajon aikana luotavat tietorakenteet Dynaamisesti varattu muisti pitää vapauttaa käytön jälkeen Muistivuoto: vapauttamaton muisti vie resursseja järjestelmän muulta käytöltä Dynaamisesti varattu muisti säilyy vapauttamiseen asti Osoitinta voidaan välittää funktiolta toiselle 7

Malloc esimerkki: dynaaminen taulukko (n kokonaislukua) int funktio(int n) { int *table; // uninitialized at this point table = malloc(n * sizeof(int)); if (table == NULL) return -1; // memory allocation failed for (int i = 0; i < n; i++) { table[i] = n - i; } free(table); return 0; } table: 0 1 2 3 n 8

Malloc - esimerkki ja muistin alueet char *alloc_buffer(size_t n) { char *buffer; buffer = malloc(n); strncpy(buffer, "some text", n-1); // buffer = "jotain tekstiä"; -- olisi ongelma // tarvitaanko jotain muuta? } n Pino 100 Keko 0x82de Koodi (read-only) alloc_buffer{ } buffer 0x82de some text\0 malloc strncpy 9

void* -- tyypitön osoitinmuuttuja mallocin palauttamalla osoittimella ei ole tyyppiä Osoittimeen ei sellaisenaan voi viitata void* - osoitin voidaan sijoittaa tyypitettyyn osoittimeen Tämän jälkeen viittaukset, osoitinaritmetiikka, jne. toimivat (miksi ei muuten toimisi?) Osoittimen sijoitus tyypistä toiseen vaatii eksplisiittisen tyyppimuutoksen ( explicit type cast ) Yleensä kannattaa välttää (mutta joskus tarvitaan) char *buffer = malloc(n); int *buf_int = (int *) buffer; 10

Muistin vapauttaminen Funktiokutsu: free(void* osoitin)! Viittaa dynaamisesti varatun muistilohkon ensimmäiseen osoitteeseen (eli siihen joka saatiin malloc:lla) Voidaan käyttää vain dynaamisesti varattuun muistiin Ja vain kerran / varattu muistilohko Turhaan varattu muisti on pois järjestelmän muulta käytöltä Ohjelman lopussa järjestelmä vapauttaa ohjelman käyttämät resurssit 11

Valgrind Kokoelma työkaluja ohjelman debugaukseen ja profilointiin Valgrind - analyysi tehdään ohjelman suorituksen aikana Tällä kurssilla keskitytään memcheck työkaluun, joka havaitsee muunmuassa seuraavia asioita: Virheelliset muistiviitteet Alustamattomien muuttujien epäilyttävä käyttö Muistivuodot Virheelliset muistin vapautukset memcpy, jne. funktioiden käyttö päällekkäisillä muistilohkoilla 12

Valgrind käyttö (pääsääntöisesti Linux) Ohjelma kannattaa kääntää g optiolla (mukaan tietoja ohjelmakoodin symboleista) Tehtäväprojektien makefilet sisältävät jo tämän Suoritus komentorivillä: valgrind ohjelma! ohjelma : käännöksen tuloksena syntynyt tiedosto --leak-check=full optiolla saa enemmän tietoa muistivuodoista Tuottaa tulostetta ongelmakohdista ja niiden paikasta koodissa Usein toistuvia samankaltaisia ilmoituksia: aloita tarkastelu ja korjailu alkupään virheistä 13

Valgrind ja TMC-serveri Kierroksesta 3 lähtien tehtävät tarkastetaan myös Valgrindilla Jos Valgrind-virheitä, tehtävä ei mene läpi vaikka tulostus olisi muuten oikein (ja lokaali testi onnistuu) Tarkistus tapahtuu palvelimella Koodi saattaa tehdä näennäisesti oikeita asioita, mutta olla silti virheellinen Muistivuodot, virheelliset viittaukset 14

Valgrind: erilaisia muistivuotoja Valgrind luokittelee muistivuodot sen mukaan kuinka peruuttamattomasti muistilohko on kadonnut Definitely lost: varattuun lohkoon ei ole enää osoitinta ja sitä ei voi mitenkään vapauttaa Aiheuttaa virheen TMC-testeissä Indirectly lost / possibly lost: osoittimia vielä on, mutta ne eivät ole suoraan saatavillla Still reachable: muistia ei vapautettu, mutta osoitin siihen on vielä tallella, joten se voitaisiin vapauttaa Valgrind ja TMC ovat armollisia näiden suhteen 15

Osoittimet tietorakenteessa #include <stdlib.h> #include <string.h> struct person { char *name; int age; }; int main(void) { struct person lady; struct person dude; const char *n1 = "Kirsi"; name asettaminen kannattaa tehdä huolella Suora sijoitus lady.name = Kirsi asettaisi viittauksen kirjoitussuojattuun muistiin (olisi ok jos const char* name) } lady.name = malloc(strlen(n1) + 1); strcpy(lady.name, n1); lady.age = 22; Tässä tapauksessa tila merkkijonolle varattava dynaamisesti 16

Tietueen kopiointi struct person lady = { "Kirsi", 22 }; struct person dude; dude = lady; // what?? lady: char *name = 0x01A5 int age = 22 0x01A5 (read-only) Kirsi\0 dude: char *name = 0x01A5 int age = 22 17

Tietorakenteen syväkopiointi struct person { char *name; int age; }; struct person personcopy(struct person orig) { struct person new; new.name = malloc(strlen(orig.name) + 1); strcpy(new.name, orig.name); new.age = orig.age; return new; } const char *name = 0xA110 int age = 22 Kirsi\0 const char *name = 0xA125 int age = 22 Kirsi\0 18

Taulukko tietueen jäsenenä Taulukko kopioituu tietueen osana myös Kätevä ominaisuus: paljasta taulukkoa ei voi kopioida sijoittamalla Tietueen osana taulukon kopiointi helpottuu voidaan myös välittää taulukko funktiolle ja palauttaa taulukko funktiosta struct person { char name[40]; int age; }; 19

Tietueen kopiointi lady: struct person { char name[40]; int age; }; struct person lady = { "Kirsi", 22 }; struct person dude; dude = lady; Tietorakenteen koko nyt isompi kuin aiemmissa esimerkeissä char name[40] = int age = 22 dude: char name[40] = int age = 22 Kirsi\0 Kirsi\0 Nyt nimeä voi muuttaa vaikuttamatta toiseen tietueeseen 20

Dynaaminen taulukko (teht. 06_oodi) Yhden alkion koko tavuina: [0] sizeof(struct oodi) [1] [2] struct oodi *array student 0 course grade struct date strlen(array[0].course) + 1 Oleellinen funktio taulukon varaamisessa: realloc 21

Linkitetty lista (tehtävä 07_queue) struct queue first last - Kukin listan elementti on varattu dynaamisesti erillisellä malloc:lla - Kukin elementti sisältää muistiviittauksen seuraavaan elementtiin - Tässä: viittaukset listan alkuun ja loppuun struct student student 0 name next student name next 0 student name next 0 22

Linkitetty lista (tyhjä) struct queue first last 23

Linkitetty lista (ensimmäinen alkio) first last struct queue - Varaa muistia struct student:lle (muista name-merkkijono) - Linkitä first- ja last-osoittimet (mallocin palauttama osoite) - Next-osoitin alustetaan NULL struct student student 0 name next 24

Linkitetty lista (alkion lisääminen) struct queue first last - Varaa muisti struct studentille (muista name) - Linkitä listan viimeisen alkion next-osoitin tähän uuteen - Päivitä last-osoitin uuteen viimeiseen alkioon struct student student 0 name next struct student student 0 name next 25

Linkitetty lista (alkion poistaminen) struct queue first last - Aseta poistettavaa edeltävä next-osoitin osoittamaan poistettavaa seuraavaan alkioon (tai NULL jos viimeinen) - Vapauta muisti poistettavan alkion osalta - Huom: erikoistapaukset ensimmäinen tai viimeinen struct student student 0 name next student name next 0 student name next 0 26