[Musiikki soi] DAVID J. MALAN: Okei. Tämä on CS50. Ja tämä on alku viikko 5. Ja kuten olet ehkä huomannut, osa materiaalista on saada hieman enemmän monimutkainen, hieman tiheämpi. Ja se on hyvin helppoa, varsinkin jos olet ollut tapana jo jonkin aikaa, voidaan yrittää raapustaa alas eniten mitä teemme, sanomme luokassa. Mutta ymmärtää, että ei ole ehkä ihanteellinen pedagoginen lähestymistapa oppimiseen tällaista materiaalia, ja materiaali yleisemmin. Ja niin meillä on ilo ilmoittaa, että CS50 oma Gheng Gong on alkanut valmistella kanoninen joukko muistiinpanoja kurssille, toivo joka on, että yksi, nämä ole ainoastaan viite-ja voimavara tarkistamiseksi materiaalia ja menossa taaksepäin materiaalia, joka saattaa olla pakeni voit ensimmäisellä kerralla, mutta myös niin, että päät voivat olla ylös kuin alas, kun se tulee aika luento, jotta voisitte käydä enemmän mietteliäänä, sillä vastakohtana enemmän scribbly. Että sanoi, mitä löydät sivusto on tällaisia ​​asiakirjoja kuten tämä. Ja ilmoitus, vasemmassa yläkulmassa, siellä ei vain sisällysluettelo, vaan myös aika-koodeja, jotka heti hypätä sinua asianmukaiseen osaan video verkossa. Ja mitä Chang täällä on tehnyt on pääosin dokumentoitu mitä tapahtui tässä Erityisesti luento. Ja monet luennot ovat jo verkossa nyt tämän URL. Ja jatkamme lähettää loput Näiden mukaan tämän viikon lopulla, joten älä hyödyntää tätä resurssia. Joten pitemmittä puheitta, aloimme kuoria takaisin kerros, joka on ollut string jonkin aikaa. Ja mitä sanomme merkkijono oikeastaan ​​on viime viikolla? Niin char tähti. Ja nieriää tähti, hyvin, mitä ei se oikeastaan ​​tarkoittaa? No, koko tämän ajan, jos olemme soitellut toiminto, kuten getString ja varastointi niin sanottu paluu arvo getString vuonna variable-- sitä kutsutaan tyyppinumeroiden string-- olemme kirjallisesti rivi koodia sinne yllä. Ja se on vasta kun näen käsiala suurennettu täällä En ymmärrä, kuinka kamalaa tämä on. Kuitenkin Oletetaan, että oikealla puolella on silti kohtuullinen kuvaus siitä, mitä on jatkuneet kaiken tämän aikaa getString. getString tietenkin saa merkkijono. Mutta mitä se oikeastaan ​​tarkoittaa? Se tarkoittaa sitä saa kimpale muisti käyttöjärjestelmä soittamalla toiminto, jota kutsutaan malloc. Mutta siitä lisää myöhemmin. Ja sitten se asuttujen että kimpale muistia kirjaimilla käyttäjällä on kirjoitettu, ja sen jälkeen, tietenkin, null hahmo, tai kenoviiva nolla aivan lopussa. Samaan aikaan, vasemmalla puolella tämän tarinan, kaikki tällä kertaa, olemme julistaa muuttuja, kuten s. Ja että muuttuja on mitä nyt alkaa soittaa osoitin. Se ei ole laatikko jonka sisällä laitamme merkkijonon, Daven, sinänsä, vaan panemme että neliö laatikko vasemmalla mitä? Joo? Yleisö: osoite missä se sijaitsee muistissa. DAVID J. MALAN: Aivan. Osoite, jossa Daven sijaitsee muistissa. Ja ei kun kaikki Daven sijaitsee, sinänsä, vaan nimenomaan osoite mitä? Joo? Yleisö: Ensimmäinen merkki. DAVID J. MALAN: ensimmäinen merkki vuonna Daven, joka tässä tapauksessa Ehdotin oli mielivaltaisesti ja epärealistisen 1, OX1, mikä tarkoittaa vain heksadesimaalinumero 1. Mutta se on luultavasti olla paljon suurempi numero että voisimme tehdä kanssa 0x etuliitteenä, mikä heksamerkki. Ja koska meidän ei tarvitse tietää, missä loput merkkiä Daven ovat, koska mitä yksinkertainen muotoilu päätös, joka on tehty monta vuotta sitten? Joo? Yleisö: Backslash 0. DAVID J. MALAN: Joo, aivan. Kenoviiva- 0 voit, vaikkakin lineaarinen aika, kulkea merkkijono, kävellä vasemmalta oikealle, jossa silmukka, tai kun silmukka, tai jotain että, ja määrittää, oh, tässä on loppuun tässä merkkijono. Niin vain osoitteen alussa merkkijonon, voimme käyttää kokonaisuudessaan se, koska koko tämän ajan, merkkijono on juuri merkkiä tähti. Joten se on varmasti hieno jatkaa CS50 kirjasto ja tämä abstraktio, niin sanotusti, mutta me alkaa nähdä tarkalleen mitä on tekeillä alla koko tämän ajan. Joten ehkä muistatte tässä esimerkissä Myös viime hetkellä vertailla 0, joka ei oikeastaan ​​verrata. Mutta aloimme ratkaista. Mutta ehkä kertaus, voisin kiinnostaa jotakuta vaaleanpunainen norsu tänään, myös Chang? Miten sinusta edessä? [Äänetön]. Tule ylös. Ja sillä välin, niin keksitte, katsotaanpa harkita hetkeksi mitä tämä koodi on juuri tekemässä. Se julistaa kaksi muuttujaa ylös top, s ja t, ja soittaa getString. Tämä ei ole kovin käyttäjäystävällinen ohjelma, koska se ei kerro mitä tehdä. Mutta katsotaanpa vain olettaa, että olemme keskittyen mehukas osa. Ja sitten teemme, jos vertaistuki vastaa t, se pitäisi sanoa printf, kirjoitit sama asia. Hei. Mikä sinun nimesi on? JANELLE: Janelle. DAVID J. MALAN: Janelle, nice to meet you. Joten haaste käsi elefantin on ensin piirtää meille kuvan siitä, mitä on ovat edustettuina näissä kahdessa ensimmäisessä linjat. Joten s ja t voivat olla edustettuna miten ruudulla? Ja voit vain vetää sen sormea ​​tällä valkokankaalla. Joten siellä on kaksi puolikkaat kummallakin puolella yhtälö. Joten siellä s vasemmalla, ja Sitten getString oikealla. Ja sitten on t vasemmalla, ja sitten getString oikealla. Joten miten voisi alamme piirtävät kuvan, että edustaa mitä tapahtuu täällä muistissa, sanoisit? Ja sallikaa minun antaa teille selittää mitä teet kuten mennä. JANELLE: OK. No, ensinnäkin se olisi kysyä saat syötteen. Ja se store-- Anteeksi. DAVID J. MALAN: OK. Hyvä. Ja tätä kutsutaan mitä? Voi, OK. Jatkakaa. En tarkoittanut keskeyttää. JANELLE: Anteeksi. Niin se olisi sen syöttäminen osoite of-- ole varma. En tarkalleen muista numero, mutta uskon, että se on alkaen 0. DAVID J. MALAN: Ei se mitään, koska tein numerot ylös, joten ei ole oikea vastaus. JANELLE: Alkaen 0 kaaren. DAVID J. MALAN: OK, joten elementti 0. Toki. JANELLE: Ja sitten jos oli kuin vain kahden kirjeitse DAVID J. MALAN: OK, takaisin sinulle. JANELLE: Niin elementti 0, ja Sitten elementti 1 tai elementti 2. DAVID J. MALAN: Ja mikä pala kuva olet piirustus juuri nyt? Puhelu getString? Tai ilmoitus s? JANELLE: ilmoitus S, uskon. Voi, getString, koska se Sisään syötetty kuhunkin [? alueella. ?] DAVID J. MALAN: Hyvä. Täsmälleen. Vaikka tämän tehokkaasti palauttaa matriisin, muistaa, kun palaamme merkkijonon, voimme indeksinä että merkkijono käyttäen 01 ja 2. Teknisesti nämä ovat luultavasti edustajanaan yksittäisiä osoitteita, mutta se on hieno. Niin kai, jos voin vain nopeasti toimittaa mihin jäimme viime kerralla, jos jokin jouset oli g b e, kenoviiva 0, mikä edustaa Gaben tulo, miten voisi edustamme s nyt? Jos tämä on muisti, joka on palauttanut getString? JANELLE: Olisiko asiamiehet kaari? DAVID J. MALAN: By kaari? No, no. Sanotaan vain, kuvallisesti, haluan vain mennä eteenpäin ja ehdottaa, että jos tämä on s, tämä on paluu arvo getString. Ja olet laatinut tätä 0, 1, 2, joka on täysin järkevää, koska me voi indeksoida osaksi merkkijono sellaisenaan. Mutta vain olla johdonmukaisia viimeisen kerran, anna minun mennä eteenpäin ja mielivaltaisesti ehdottaa, että tämä on osoite 1, tämä on osoite 2, tämä on osoitteen 3, ja niin edelleen. Ja niin, vain olla erittäin selvää, mitä tapahtuu mennä s seurauksena, että ensimmäinen rivi koodia, sanoisit? JANELLE: Osoite 1? DAVID J. MALAN: Aivan. Joten puuttua 0x1. Ja sillä välin, anna minun mennä eteenpäin ja päällekkäisiä paljon siitä, mitä olet tehnyt ja lisätä oman t täällä. Jos minun pitäisi kirjoittaa Gabe jälleen, toisen kerran, kehoitteen getString, missä, tietenkin on Gabe menossa? No, presumably-- JANELLE: Kuten täällä? DAVID J. MALAN: Joo. JANELLE: Tai se on myös samalla laatikot? DAVID J. MALAN: Saanen ehdottaa, joo, tarkalleen, joten nämä ylimääräiset laatikot. Mutta mitä avain on, että nyt, vaikka vaikka olen laatinut nämä melko lähellä together-- 0x1, tämä on 0x2-- todellisuudessa, tämä nyt voisi olla osoite 0x10, Esimerkiksi, ja 0x11 ja 0x12, ja niin edelleen. Ja niin, jos näin on, mitä tulee päätyä täällä t? JANELLE: 0x10? DAVID J. MALAN: Aivan. Niin 0x10. Ja nyt, viimeinen kysymys. Olet ylivoimaisesti oli työskennellä vaikeinta norsu toistaiseksi. Nyt, jos vedän ylös koodi uudelleen, kun teen, linjassa kolme, jos vertaistuki vastaa t, mitä olen oikeastaan verrataan että olemme piirretään täällä? JANELLE: kaksi osoitetta? DAVID J. MALAN: Aivan. Joten sanon on S yhtä yhtä t? Toisin sanoen, on 1 yhtä yhtä suuri kuin 10? Ja tietenkin, Ilmeinen vastaus on nyt, ei. Ja niin tämä ohjelma on viime kädessä painoon mitä sanoisit? JANELLE: Olisiko, kirjoitit sama asia? DAVID J. MALAN: Joten jos s on 1 ja t on 10? JANELLE: Kirjoitit eri asioita. DAVID J. MALAN: Aivan. Kirjoitit eri asioita. Kunnossa. Joten aplodit, jos voisimme täällä. [APPLAUSE] Se oli tuskallista. Tiedän. Hienosti tehty. Nyt katsotaanpas jos emme voi tease lisäksi mitä korjaus oli. Ja tietysti, kun korjasimme this-- jonka minä nyt edustan green-- teimme pari parannuksia täällä. Ensimmäinen, kuten järki tarkista, olen ensimmäinen tarkkailun jos s vastaa null ja t on nolla. Ja vain olla selkeä, kun pitää s tai t olla tyhjä koodin näin? Kun voi s tai t olla tyhjä. Joo? Yleisö: [kuulumaton]. DAVID J. MALAN: Aivan. Jos merkkijonon että käyttäjä kirjoitit on aivan liian pitkä mahtua muistiin, tai jotkut outo nurkka kaltainen tapaus, getString, kuten tulemme näkemään, kirjaimellisesti tänään, sen dokumentointi, sanoo se palauttaa null kuten erityistä kiinteän pisteen arvo, tai vain eräänlainen erityinen tunnusmerkki se tarkoittaa, että jotain meni pieleen. Joten haluamme tarkistaa että, koska se kääntyy pois että null on erittäin vaarallinen arvo. Usein jos yrität tehdä jotain null johon function-- kulkee sen syötteenä varten instance-- että toiminto voisi hyvin kaatuu ja sen mukana ottaa alas koko ohjelma. Joten tämä kolmas linja on nyt vain järki tarkistaa, virheiden tarkistus, jos haluatte. Se on hyvä tapa nyt meitä päästä tahansa me yritä käyttää arvoa, joka voisi mahdollisesti olla tyhjä. Nyt neljännellä rivillä täällä, "Jos strcmp (s, t)," hyvin, mikä se viittaa? No, me sanoi tämän olevan hyvin ytimekkäästi nimetty toiminto merkkijonon vertailu. Ja sen tarkoitus elämässä on vertailla Ensimmäisessä väitteessään sitä vastaan ​​toisen, mutta ei niinkään niiden osoitteet, kuten teimme tahattomasti hetki sitten punaisen koodin, mutta pikemminkin verrata näitä kahta jousille inhimillisesti intuitiivinen tavalla vertaamalla tätä, tätä, tätä, tätä, ja sitten pysähtymättä jos ja kun jokin tai molemmat sormet osuu kenoviiva 0. Niin joku vuosi sitten toteutettu strcmp toteuttaa meille toiminnallisuutta että toivoimme olisimme saaneet mukaan vain vertaamalla kahta yksinkertaista arvoja. Nyt rehellisesti, pidän piirustus kaikki nämä eri numeroita. Mutta todellisuus on, olen ollut tekevät näitä ylös koko ajan. Ja niin haluan vain mennä eteenpäin ja raapustaa nämä pois tehdä kohta, että lopussa Päivän ja eteenpäin, emme todellakaan aio välitä mitä käsitellään asiat ovat todella muistiin. Joten en aio tehdä näitä Erilaisia ​​numeroita niin paljon enää, Olen vain abstrakti tätä pois hieman enemmän ystävällinen vain nuolia. Toisin sanoen, jos s on osoitin, No, katsotaanpa vain vetää se, kirjaimellisesti, kuten osoitin, nuoli alkaen itse jotain muuta, ja murehdi liikaa lisää minutia näistä osoitteista joka taas Tein kuitenkin. Mutta näemme näistä osoitteista, joskus, kun virheenkorjaus koodi. Nyt Samalla tämä ohjelma täällä korjauksia, tietenkin, että ongelma vertaamalla nämä kaksi merkkijonoa. Mutta törmäsimme toinen ongelma. Tämä oli kopio ohjelmoida viimeisen kerran, jolloin yritin hyödyntää vain ensimmäisen merkin merkkijono. Mutta mikä oli oire näimme viime kerralla kun käyttäjä kirjoitetaan arvo, kuten Gabe pienillä, S, sitten valittu s kohti t, kuin kolmannella rivillä siellä, ja sitten yritin isolla t kiinnike 0? Mikä oli vaikutus muuttuviin t kiinnike 0 täällä? Yleisö: Se muutti s. DAVID J. MALAN: Joo, Vaihdoin s, samoin. Koska se, mitä todella tapahtuu? No, anna minun nähdä, jos voin puhdistaa tätä kuvaa seuraavasti. Jos s on taas sana g, a, b, e, kenoviivan, 0, ja s Jatkamme piirustuksen laatikko täällä, mutta ei enempää osoitteita. Lopetetaan tehdä asioita. Haluan vain piirtää kuva yksinkertaistaa maailmaa. Kun Julistan t narulla t, joka luo että kimpale muistia. Square sattuu olemaan 32 bittiä useimmissa tietokoneissa. Itse asiassa, jos olet koskaan kuullut tietokone, jossa on 32-bittinen arkkitehtuuri, todella fancy-puhua, että vain tarkoittaa, että se käyttää 32-bittisiä osoitteita. Ja teknisenä syrjään, Jos olet joskus miettinyt, miksi vanhemmissa tietokoneissa, jos todella yritti keitto niiden kanssa paljon muistia, voi vain olla enintään neljä gigatavua RAM-muistia, hyvin se johtuu siitä, kirjaimellisesti, vanha tietokone voi esittää ainoastaan laskea jopa 4 miljardia, 4 miljardia tavua, koska se on 32-bittisten numerot osoitteita. Mutta joka tapauksessa, tässä Esimerkiksi tarinan paljon yksinkertaisempi. t on vain yksi osoitin, tai todella char tähti, eli merkkijono. Ja miten haluan päivittää tätä kuvaa nyt, että toisella rivillä koodia, jälkeen piste, piste, piste? Kun teen nuora t on s puolipiste, Miten tämä kuva muuttuu? Joo? Yleisö: [kuulumaton]. DAVID J. MALAN: Joo. Täsmälleen. Sain laittaa nuoli t laatikko samaan osoitteeseen, Sama ensimmäinen kirjain antoi. Tai teknisesti, jos tämä kaveri oli vielä 0x1, se on niin kuin minulla olisi 0x1 täällä ja 0x1 täällä. Mutta jälleen kerran, kuka välittää noin osoitteet? Se on vain ajatus, että nyt on merkitystä. Joten tämä on mitä täällä tapahtuu. Niin tietysti, jos et t kiinnike 0, joka on array merkintä, sekä course-- ja rehellisesti, se näyttää kuin olisi array täällä, mutta nyt on tämä outo juttu. Tiedä, että ohjelmointikieli, C tarjoaa tätä ominaisuutta, jolloin, vaikka t on osoitin, tai s on osoitin, voit silti käyttää, että tuttu, mukava hakasulkeen merkintätapa mennä ensimmäinen osa, tai toinen elementti tai sen osaa että osoitin osoittaa ja koska oletettavasti se on, kuten tässä tapauksessa, osoittaen joitakin array. Miten siis korjata? Rehellisesti sanottuna tämä on, jos se sai hieman ylivoimainen ensi silmäyksellä. Mutta tässä on uusi ja parannettu versio. Joten ensimmäinen, Saan eroon CS50 kirjasto, vain paljastaa, että s on todellakin char tähti, vain synonyymi. Ja t on myös char tähti. Mutta mitä on tekeillä oikealla puolella viivaa missä t annetaan arvo? Mikä on malloc? Mitä se strlen? Mikä on sizeof (char)? Miksi hitossa tämä line näyttävät niin monimutkaista? Mitä se tekee korkealla tasolla? Mitä se tallentaminen t? Joo? Yleisö: Se jaettaessa tietty määrä muistia. Se tallentaa, luulisin, kirjeet [äänetön]. DAVID J. MALAN: Perfect. Perfect. Se kohdentaa tiettyihin määrä muistia tallentaa oletettavasti tulevaisuudessa kirjaimia. Ja erityisesti, malloc Siksi palaamassa mitä? Yleisö: Palatakseni [äänetön]? DAVID J. MALAN: Aivan. Palauttamalla osoitteen että muisti, joka on hieno tapa sanoa, palauttaa osoitteen ensimmäinen tavu että muisti. Velvollisuutena on minun muistavan kuinka paljon muistia Olen itse kohdistettu tai pyytänyt malloc varten. Nyt, kuinka paljon se on? No, vaikka siellä paljon sulkeissa täällä, malloc kestää vain yhden argumentin. Ja olen täsmennetään strlen S, niin anna minua niin monta tavua kuin on S, mutta lisätään yksi. Miksi? Joo? Yleisö: kenoviiva 0. DAVID J. MALAN: Aivan. Meidän täytyy tehdä vähän taloudenhoito. Joten koska siellä kenoviiva 0, olisimme paremmin muistaa. Muuten olemme menossa luoda merkkijono, joka ei ole tätä erityistä terminaattori. Samaan aikaan, vain olla erittäin anaali, minulla on sizeof (char), vain jos joku juoksee minun koodi ei CS50 laite, mutta ehkä eri tietokoneeseen kokonaan, jos merkkiä ovat yksi tavu, sopimuksen mukaan, mutta kaksi tavua, tai jotain suurempaa kuin. Se on vain olla super, Super vastenmielinen virheitä. Vaikka todellisuudessa se on todennäköisimmin olemaan 1. Nyt puolestaan ​​menen eteenpäin ja kopioi merkkijono, t kiinnike i vastaa t kiinnike s. Ja minä taivun viime viikolla lähdekoodin nähdä mitä tapahtuu. Mutta avain nouto, ja Siksi laitoin sen nyt vihreä, johtuu siitä, että hyvin viimeinen rivi, t kiinnike 0 vastaa toupper, vaikutus on aktivointiin joka merkkijonon? t ja / tai s? Että viimeisen rivin koodia. Vain t, koska mitä tapahtui tällä kertaa, jos olen hieman kumoa että viimeinen vaihe, mitä on tapahtunut on, kun soitan malloc, Olen lähinnä saada kimpale muistia joka on samankokoinen kuin alkuperäinen, koska se on aritmeettinen tein. Olen tallentaminen t osoitteeseen Kyseisen kimpale muistia. Vaikka tämä näyttää hienolta ja kaunis, mukava ja tyhjä, todellisuus on olemassa, mitä jaamme pitää soittaa, roskat arvot täällä. Että kimpale muistia pitää hyvin hyvin on käytetty ennen, muutaman sekunnin, muutama minuutti sitten. Joten siellä voisi ehdottomasti olla numeroita tai kirjaimia siellä sattumalta. Mutta ne eivät ole voimassa, kunnes itse asuttaa tämä kimpale muistia todellisilla merkkiä, niin minä tehdä, että silmukka. Kaikki hyvin? Joten nyt kliimaksi Nämä kolme esimerkkiä jotka näennäisesti rikki viime kerralla, Tämän Swap Esimerkiksi tämä toiminto työskenteli mielessä että se vaihtoivat ja b. Mutta se ei toimi, mitä muut mielessä? Joo? Yleisö: [kuulumaton]. DAVID J. MALAN: Aivan. Jos minun pitäisi kutsua tätä toimintoa alkaen another-- esimerkiksi alkaen toimivat kuin tärkein, jos Minulla on muuttuja, x ja y, niin minä tein viime viikolla, sama koodi, ja kuljen vuonna x ja y Vuorottelu ja soita Swap-- tätä, tietenkin on oikea versio on mitä aiomme see-- se ei toimi. Niin mikä on korjata? No, niin vain olla selvää, anna minun mennä eteenpäin ja-- anna minulle yksi toinen tänne, ja katso jos voin näyttää viimeinen, joka tulee in-- Katsotaan jos löydän Tässä todellinen fast-- OK, [äänetön]. OK, siellä se on. Joten unohda komennot olen vain kirjoittamalla. Haluan sen hakea osoitteessa viime hetken esimerkki viime aika, joka on nyt nimeltään no Vaihda. Joten ei Swap on silloin jäimme viime kerralla, jolloin olen alustettu x 1 ja y 2. Sitten soittaa Swap, kulkee 1 ja 2. Ja sitten tämä toiminto työskenteli jossain mielessä, mutta se ei ollut vakituista Vaikutus x ja y. Joten kysymys käsillä on, miten nyt me itse korjata tämän ongelman? Mikä on ratkaisu käsillä? No, swap.c, joka on uusi tänään huomaa pari eroja. x ja y ovat samoja. Mutta mikä on selvästi erilaista linjaa 25? Mitä uutta siellä, jos muistat miltä se näytti hetki sitten? Yleisö: [kuulumaton]. DAVID J. MALAN: Joo. Niin et-merkkejä ovat uusi pala syntaksin ei ainoastaan ​​tässä ohjelmassa, mutta myös yleisemmin CS50. Toistaiseksi en usko olemme nähneet yhtään esimerkkiä tai oikeastaan ​​puhuneet niistä mitään yksityiskohta, muu kuin, ehkä, preemptively jaksossa, et-merkki näin. No, se kääntyy pois et-merkki on yksi viimeisen kappaletta uusia syntaksin aiomme oppia. Kaikki se tarkoittaa, osoite joidenkin muuttuja. Millä osoite ei x elää? Mutta mitä osoitetta ei y elää? Koska jos perustavanlaatuinen ongelma ennen on, että x ja y ovat johdettiin kopioina, mitä todella haluamme tehdä on tarjota Swap kanssa kuin aarre kartta, joka johtaa siihen, missä x ja y tosiasiallisesti ovat RAM-muistia, niin että Swap voi seurata, että kartta ja mennä minne x tai y merkitsee paikalla ja muuttaa todelliset arvot 1 ja 2 siellä. Niin Swap muututtava hieman liikaa. Ja ensi silmäyksellä, tämä saattaa tuntua hieman samanlainen merkkiä tähden. Ja se todellakin on. Joten on osoitin minkälaisia ​​tietoja, perustuu tähän korostettu osaan? Joten se on int. Joten ei ole enää int, se osoite int. Ja vastaavasti b on nyt menossa olevan osoitteen int. Joten kun nyt soittaa Swap päässä Main, En aio antaa Swap 1 ja 2. Aion antaa sille kuin Ox-jotain ja Ox-jotain, kaksi osoitetta, joka johtaa Swap niiden sijainnit minun tietokoneen muistiin. Joten nyt minun jäljellä täytäntöönpano muututtava hitusen. Mikä on tietysti erilainen nyt Näiden kolmen riviä koodia? Ei näitä hemmetin tähteä kaikki paikka, okei? Joten mitä täällä tapahtuu? Joo? Yleisö: Se on tietenkin [kuulumaton]. DAVID J. MALAN: Aivan. Joten tässä context--, ja tämä ei ollut paras design tosin päätöksessä vuotta sitten. Tässä yhteydessä, jossa sinulla on vain tähti, ja sinulla ei ole tietotyyppiä, kuten int, heti vasemmalle, sen sijaan sinulla on yhtäläisyysmerkki, selvästi, Tässä yhteydessä, kun sanot tähti, se tarkoittaa, että mene osoite se on. Seuraa aarrekartan, niin sanoakseni. Ja sillä välin, linjassa 37, se tarkoittaa samaa asiaa. Mene osoitteeseen, ja laittaa mitä siellä? Riippumatta on Paikkakunta että b täsmennetään. Toisin sanoen, mene b. Ota tuo arvo. Mene ja kohti yhtä allekirjoittaa, sijoitusoperaattori, Laita se arvo siellä. Samoin int temp on vain int. Mitään ei tarvitse muuttaa noin temp. Se on vain ylimääräinen lasi Annenberg joidenkin maitoa tai appelsiinimehua. Mutta en tarvitse sanoa, mennä b. Mene tuohon määränpäähän ja laittaa arvo temp siellä. Joten mitä tapahtuu sitten? Kun olen itse soittaa Swap tällä kertaa, jos Tässä ensimmäinen lokero täällä edustaa Main, tämä toinen lokero edustaa Swap, kun Kuljen ampersand x ja ampersand y Main Swap, vain olla selkeä, mikä on tämä pinokehys vastaanottavalle? Joo? Yleisö: [kuulumaton]. DAVID J. MALAN: Aivan. Osoite x ja osoite y. Ja voit ajatella näitä kuten postiosoitteet. 33 Oxford Street ja 35 Oxford Street, ja te haluat siirtää kaksi rakennusta jotka ovat kyseisissä paikoissa. Se on tavallaan naurettavaa ajatus, mutta siinä kaikki me tarkoitamme osoite. Missä päin maailmaa voi löydät nämä kaksi ints? Missä ihmeessä voitte löytää ne kaksi rakennusta? Joten jos lopuksi, kun kaikki tällä kertaa mennä tänään lähdekoodin ja kääntää Swap ja ajaa ./swap lopuksi, että Ensimmäistä kertaa me itse nähdä, että arvoni ovat todella vaihtaneet onnistuneesti. Ja nyt voimme jopa ottaa merkille vaikkapa gdb. Joten anna minun mennä samaan tiedostoon. Anna minun mennä eteenpäin ja ajaa gdb of ./swap. Ja nyt, vuonna Swap, aion mennä eteenpäin ja asettaa taitekohta Main. Ja nyt aion mennä eteenpäin ja suorita ohjelma. Ja nyt näemme minun koodi pysähdyin että linja. Jos menen eteenpäin ja tulosta x, mitä minun pitäisi nähdä täällä? Se on kysymys. Sano uudestaan? Yleisö: [kuulumaton]. DAVID J. MALAN: So satunnaisia ​​numeroita, ehkä. Ehkä onnistaa, ja se on mukava ja yksinkertainen, kuten 0. Mutta ehkä se on jokin satunnainen numero. Tässä tapauksessa minulla kävi tuuri. Se vain sattuu olemaan 0. Mutta se on todellakin onni, koska vasta I kirjoita seuraava ja sitten tulostaa x on, että riviä koodia, linja 19, on teloitettu. Samaan aikaan, jos kirjoitan seuraavan kerran, ja nyt tulostaa y, aion nähdä 2. Nyt, jos kirjoitan seuraavaksi, se tulee saada hieman sekava, koska nyt printf tulee näkyä näyttö, kuten se teki. x on 1. Tehdään tämä uudestaan. Ja nyt, tässä tarina asiat mielenkiintoisia. Ennen kuin soitan Vaihda tai jopa askel siihen, otetaan vähän kurkistaa. x on, jälleen, 1. Y on, tietenkin, nopea järki tarkista, 2, joten ei ole vaikea siellä. Mutta mikä on ampersand x? Vastaus, se on tavallaan upea näköinen. Mutta int tähti suluissa on vain GDP: n tapa sanoa tämä on osoite. Se ei ole int, se on osoitin int, tai muuten tunnetaan osoite. Mikä on tämä hullu juttu? Emme ole koskaan nähneet jotain aivan tuollaisena. Joten tämä on osoite tietokoneeni muisto jossa x sattuu asumaan. Se Ox-jotain. Ja tämä on suoraan sanoen miksi Olen ryhtyi piirtämään nuolia, numeroiden sijasta, sillä kuka todella välittää että int on tietyllä osoite, joka on niin iso. Mutta bffff0c4, nämä ovat kaikki todellakin heksadesimaaliyksikön, jotka ovat 0-F. Joten emme aio asua liian pitkään, mitä nämä asiat ovat. Mutta jos tulostaa y, En tietenkään katso 2. Mutta et-y, näen tämän osoitteen. Ja varoitusajalla, utelias, kuinka kaukana ovat x ja y? Voit jättää useimmat osoite. Neljä tavua. Ja se vastaa meidän aiemmin väittävät, että kuinka suuri on int? Neljä tavua. Niin se näyttää kaikki on riviin kauniisti, niin saatat toivoa, muistissa. Joten nyt haluan vain eteenpäin loppuun tämän tarinan. Mennään eteenpäin ja kirjoita vaihe, sukeltaa Swap-toiminto. Nyt huomaa, jos en kirjoita, se on identtinen osoitteen x. Jos kirjoitan b, se on identtinen osoitteeseen y. Joten mitä minun pitäisi nähdä, jos olen sanoa, mene osoitteeseen? Joten tulosta tähti. Joten tähti tarkoittaa mennä sinne, tässä yhteydessä. Ampersand tarkoittaa mitä osoitteen. Joten tähti keinoin 1. Ja tulostaa tähti b antaa minulle 2. Ja anna minun olettaa, että tällä hetkellä että ainakin koodin, joka etenee suorittaa nyt voi olla perustellun kautta tällä tavalla. Mutta me palaamme asiaan idea ennen pitkää. Joten tämä versio Swap on nyt oikea ja mahdollistaa voimme vaihtaa tässä tietotyyppi. Joten kysyttävää sitten Swap? Star? Käytössä osoite? Ja näet, kanssa Harjoitus 4, tavallaan, mutta ongelma asettaa 5, varmasti, miten nämä asiat ovat hyödyllisiä ja saada paljon enemmän mukava niiden kanssa, seurauksena. Yhtään mitään? Kunnossa. Niin malloc on, jälleen, tämä toiminto että juuri varaa, muistikapasiteetti jako. Ja miksi tämä on hyödyllistä? No, koko tämän ajan, olet käyttänyt malloc. Jos ajatellaan nyt, miten getString teoksia, oletettavasti, se on pyytänyt joku kimpale muisti, milloin käyttäjä kirjoittaa merkkijonon vuonna, koska me varmasti ei tiennyt, koska CS50 henkilökunta, kuinka suuri ne jouset että ihmiset aiot kirjoittaa voisi olla. Joten, ensimmäistä kertaa, alkaa kuori takaisin miten CS50 kirjaston teoksia, Poiketen pari esimerkkiä joka johtaa meidät sinne. Jos siis avata gedit ja avata scanf 0, aiomme nähdä seuraava koodi. Scanf 0, saatavilla verkkosivuilla tänään, on melko muutaman rivin koodia Täältä 14 kautta 20. Ja katsotaan mitä se tekee. Se julistaa int, nimeltään x. Se kertoo jotain, numero kiitos. Ja nyt se sanoo, scanf% i, ja x. Joten siellä on nippu uusia juttuja siellä. Mutta scanf, voit sellaista ajatella AS vastakohta printf. printf tietenkin tulostaa näytölle. scanf tavallaan skannaa käyttäjän näppäimistön jotain hän on kirjoittanut. % I on kuin printf. Tämä tarkoittaa sitä odottaa käyttäjä voi kirjoittaa int. Ja nyt, miksi luulet minun ehkä ohimennen scanf & x? Jos elämän tarkoitus on scanf on saada jotain käyttäjältä, mikä on tarkoitettu kulkee sen, ja x, nyt? Joo? Yleisö: [kuulumaton]. DAVID J. MALAN: Aivan. Riippumatta minä, ihminen, kirjoita, minun panos aiotaan tallennettu kyseisessä paikassa. Se ei riitä, muistuttaa, että vain pass x, koska olemme nähneet jo, milloin ohitat vain raaka-muuttuja, kuten int, johonkin muuhun toiminto, Toki, se voi muuttaa sitä vaihteleva, mutta ei pysyvästi. Se ei voi olla vaikutusta Main. Se voi muuttaa vain oman paikallisen kopion. Mutta jos sen sijaan, et antaa minulle todellista int, mutta annat minulle ohjeet että int, minä nyt, että scanf, Totisesti, minä voi seurata, että käsitellä ja laittaa numero siellä joten voit käyttää sitä myös. Joten kun käytän tätä ohjelmaa, katsotaanpa. Tee scanf 0 dot slash, scanf 0. Ja jos minä nyt kirjoita numero kuten 50, kiitos 50. Jos minä nyt kirjoita numero kuin negatiivinen 1, negatiivista 1. En nyt kirjoita numero kuin 1,5, hm. Miksi ohjelma sivuuttaa minua? No, koska yksinkertaisesti, sanoin se odottaa int vain. Kunnossa. Niin, että yksi versio tästä. Otetaanpa asioita lovi ja ehdottaa, että tämä ei ole hyvä. Ja tässä piilee hyvin yksinkertainen esimerkki miten voimme alkaa kirjoittaa koodia että muut ihmiset voivat hyödyntää tai vaarantaa tekemällä pahoja asioita. Joten linja 16, niin samanlaisia hengeltään ennen, mutta en julistaa int tällä kertaa. Olen julistaa nieriää tähden, eli merkkijono. Mutta mitä se oikeastaan ​​tarkoittaa? Joten jos en määritä address-- ja Soitan sitä mielivaltaisesti, puskuri, mutta voisin kutsua sitä s, olla simple-- ja sitten teen tämän, selittää minulle, jos voisit, joka perustuu edellisen logiikka, mitä scanf tekee linja 18, jos pass% s ja puskuri, mikä on osoite? Mikä on scanf, jos haet täsmälleen samaa logiikkaa kuin versio 0, yrittävät tehdä täällä, kun käyttäjä kirjoittaa jotain? Joo? Yleisö: [kuulumaton]. DAVID J. MALAN: Aivan. Scanf, jonka logiikka aikaisemmin, vie merkkijonon että ihmisen kirjoitetut in-- se nyt merkkijono, se ei ole numero, oletettavasti, jos hän cooperates-- ja se tulee yrittää laittaa että merkkijono muistiin tahansa osoitteeseen puskuri määrittelee. Ja tämä on suuri, koska puskuri on todellakin tarkoitus olla osoite. Mutta Väitän tämä ohjelma on buginen erittäin vakavasti, koska mitä arvoa on puskuri oletuksena? Mitä olen alustetaan osaksi? Mikä kimpale muistia? En ole, eikö? Joten vaikka olen varattu nieriää tähti, joka ei ole enää nimeltään s, sitä vaan kutsutaan, buffer-- niin Katsotaanpa piirtää muuttujan nimi nyt buffer-- jos en ole kutsutaan getString tai malloc täällä, että käytännössä sitä, että puskuri on vain joitakin roskaa arvo. Nyt mitä se tarkoittaa? Se tarkoittaa, että olen kertonut scanf odottaa merkkijonon käyttäjältä. Ja tiedätkö mitä? Mitä tämä asia osoittaa to-- ja piirrän kysymysmerkki, mutta todellisuudessa se tulee olemaan jotain OX1, 2, 3, eikö? On joitakin vääriä arvo vain sattuu olemaan siellä ennen. Joten toisin sanoin, se on ikään kuin puskuri on vain osoittaa jotain muistiin. Minulla ei ole aavistustakaan mitä. Jos siis kirjoitat Gabe nyt, se tulee yrittää laittaa g-a-b-e / 0 siellä. Mutta kuka tietää, mitä se on? Ja aiemmin kaikki ajan olemme yrittäneet koskettaa muisti, joka ei kuulu meille, mitä on tapahtunut? Tai lähes joka kerta. Segmentointi vika, eikö? Tämä nuoli, minulla ei ole aavistustakaan, missä se on osoittaa. se on vain joku satunnainen arvo. Ja tietenkin, jos tulkitsemaan Satunnaisen arvon osoitteena, aiot mennä joitakin satunnaisia ​​määränpää. Joten Gabe voisi todellakin kaatua minun ohjelma tässä asiassa. Mitä voimme tehdä, että on melkein yhtä huono? Mieti tätä kolmannen ja lopullinen esimerkki scanf. Tämä versio on parempi missä mielessä? Jos olet tyytyväinen edellinen ongelma, tämä on parempi. Miksi? Yleisö: [kuulumaton]. DAVID J. MALAN: Hyvä. Joten tässä tapauksessa linjan 16 on parempi, siinä mielessä että olemme nimenomaisesti osoitetaan osa muistia. Emme käyttäen malloc, käytämme viikko 2 lähestymistapa vain julistaa array. Ja olemme sanoneet aiemmin, että merkkijonon on vain joukko merkkejä, joten tämä on täysin laillista. Mutta se on, tietenkin, kuten huomaat, kiinteä koko, 16. Niin tämä ohjelma on täysin turvassa, jos en kirjoita yhdessä merkkijonojen, kaksi merkki jouset, 15 merkkijonojen. Mutta heti kun aloitan kirjoittamisen 16, 17, 18, 1000 merkkijonoja, Missä se merkkijono ehdi? Se tulee päätyä osittain tästä. Mutta kuka tietää mitä muuta on rajojen Tämän erityisen array? Se on ikään kuin olen julisti 16 laatikot täällä. Joten sen sijaan vetää kaikki 16, me vain teeskennellä, että olen laatinut 16. Mutta jos en yritä lukea merkkijono joka on paljon pidempi, kuin 50 merkkiä, Aion aloittaa laskemisesta a, b, c, d, x, y, z. Ja tämä on oletettavasti joitakin muita muistisegmentin että, uudelleen, saattaa aiheuttaa Oma ohjelma kaatuu, koska en ole pyytänyt jotain enemmän kuin vain 16 tavua. Joten who cares? No, tässä on CS50 kirjastoon. Ja suurin osa tästä on vain kuten ohjeita alkuun asti. CS50 kirjasto, koko tämän ajan, on ollut tämän linjan mukainen 52. Olemme nähneet typedef, tai näet typedef vuonna PSET 4, joka vain luo synonyymi jolloin nieriää tähti voi olla enemmän yksinkertaisesti kutsutaan merkkijono. Joten tämä on yksi Muutaman apupyörät olemme käyttäneet salaa alla huppu. Samalla tässä on toiminto, getchar. Nyt ilmeisesti ei ole ruumiin siihen. Ja itse asiassa, jos pidän vieritys, en oikeastaan Katso kaikki toteutukset näistä toiminnoista. Koska järki tarkistaa, miksi? Yleisö: [kuulumaton]. DAVID J. MALAN: Joo. Joten tämä on header-tiedosto. Ja header-tiedostot sisältävät prototyyppejä, sekä joitakin muita juttuja, näyttää siltä, kuten typedefs. Mutta CS50.c, josta olemme koskaan antanut teille suoralta kädeltä, mutta on ollut CS50 laitteen kaikki tällä kertaa syvälle sen kansioita, huomaa, että siellä on koko Joukko toimintoja täällä. Itse asiassa, nyt selaa alaspäin. Katsotaanpa jättää useimmat niistä, nyt. Mutta selaa getInt ja miten getInt toimii. Joten tässä on getInt. Ja jos joskus todella välitti miten saada int toimii, tässä on sen dokumentointi. Ja joukossa asioita se sanoo on se kertoo sinulle mitä arvoalueita se voi palata. Se on pääosin kielteinen 2000000000 positiiviseen 2000000000, antaa tai ottaa. Ja se kääntyy pois, kaikki tämä aikaa, vaikka emme ole koskaan oli tarkistaa sitä, jos jokin menee pieleen, käy ilmi, että kaikki tällä kertaa, getInt on on palaamassa erityinen vakio, ei ole tyhjä, vaan INT_MAX, joka on vain ohjelmoijan sopimusta. Se tarkoittaa tässä erityinen arvo. Muista tarkistaa tämän, vain jos jotain menee pieleen. Mutta emme ole koskaan vaivautunut kanssa, että tähän mennessä koska jälleen, tämä on tarkoitus yksinkertaistaa. Mutta miten getInt saa toteuttaa? No, yksi, se ei ota argumentteja. Tiedämme, että. Se palauttaa int. Tiedämme, että. Joten miten se toimii alla huppu? Joten siellä on ilmeisesti ääretön silmukka, ainakin ulkonäkö yhden. Huomaa, että käytämme getString. Joten on mielenkiintoista. getInt kutsuu meidän oma funktionsa, getString. Ja nyt, mitä tämä voisi olla kyse? Miksi minulle puolustava täällä line 165? Mitä voisi tapahtua linjassa 164, vain olla selvä? Se on sama vastaus kuin ennen. Voisi vain muisti. Jokin menee pieleen getString, meidän täytyy pystyä käsittelemään sitä. Ja syy en palaa null on että teknisesti, null on osoitin. getInt on palauttaa int. Joten olen mielivaltaisesti päätti, pääasiallisesti, että 2 miljardia, antaa tai ottaa, on menossa olla erityistä arvoa kuin voin koskaan itse saada käyttäjältä. Se on vain yksi arvo aion tuhlata edustamaan virhekoodi. Joten nyt, asiat saavat hieman fancy. Ja se ei ole aivan sama toiminto kuin ennen, mutta se on hyvin samanlainen. Niin huomaa, julistan täällä, vastaa 172, sekä int n ja char. Ja sitten käytän tätä funky linja, sscanf, jossa se kääntyy pois ei skannaa merkkijono näppäimistöltä. Se seisoo olemassa olevan merkkijonon käyttäjä on jo kirjoitettu. Niin Soitin jo getString, joka tarkoittaa, että minun on merkkijono muistiin. sscanf on mitä haluat soita jäsentämiseen toimintoa. Siinä tarkastellaan merkkijonon olen kirjoitettu merkki kerrallaan, ja tekee jotain hyödyllistä. Että merkkijono tallennetaan linjaa. Ja tiedän, että vain menemällä varmuuskopioida tänne ja sanoi, oh, OK, Kutsuin sitä ei s tällä kertaa, mutta linja. Ja nyt tämä on hieman erilainen. Mutta tämä käytännössä tarkoittaa, syistä me hieman aalto meidän käsissä tänään, että me Tarkistamme onko käyttäjä kirjoitettu ja int ja ehkä toisen hahmon. Jos käyttäjä kirjoitetaan int, se on aiotaan varastoida n, koska olen läpäisee tämän osoitteen, uusi temppu olemme nähneet tänään. Jos käyttäjä on kirjoittanut samanlaisissa 123x, että x ei ehdi kirje luonteeltaan c. Nyt on käynyt ilmi, että sscanf kertoo minulle, älykkäästi, kuinka monia muuttujia on sscanf onnistuneesti pystynyt täyttämään. Joten tämän logiikan, jos toiminto Olen täytäntöönpanossa on getInt, mutta olen tarkkailun, mahdollisesti käyttäjälle olleen kirjoitettu int seuraa jotain muuta, mitä haluan sscanf n paluuarvo todella olla? Jos tarkoituksena on saada vain int käyttäjältä? Joten jos sscanf palaa 2, mitä se tarkoittaa? Käyttäjä kirjoitetaan jotain, kirjaimellisesti, 123x, joka on vain hölynpölyä. Se on virhetilanne, ja Haluan tarkistaa, että. Joten jos käyttäjä kirjoittaa tämän, jonka Tämän logiikan mukaan mitä sscanf palata, sanoisit? Niin se tulee palauttaa 2, koska 123 ei mene täällä, ja x on menossa päätyä tänne. Mutta en halua x saada täytetty. Haluan sscanf vain menestyä täyttämällä ensimmäinen muuttujia. Ja niin siksi olen haluavat sscanf palata 1. Ja jos tämä on vähän yli pään tällä hetkellä, joka on täysin kunnossa. Ymmärtää kuitenkin, että yksi arvot getInt ja getString on, että me teemme pahus Paljon virheentarkistusta näin niin että tähän mennessä, voit melko paljon kirjoita mitään näppäimistön, ja me sen kiinni. Ja me varmasti, henkilöstö, ei varmasti olla lähde vika omassa ohjelma, koska olemme puolustauduttava tarkistaa kaikki tyhmä asioita, joita käyttäjä voisi tehdä, kuten kirjoittamalla merkkijonon, kun todella halusi int. Joten now-- tulemme takaisin tähän ennen long-- mutta kaikki tällä kertaa, getString ja getInt on ollut alla huppu käyttämisen perusajatus osoitteet muistia. Joten nyt, tehkäämme asiat hieman enemmän käyttäjäystävällinen. Kuten ehkä muistatte, alkaen Binky viimeksi time-- jos hiiri cooperate-- niin meillä oli tämä koodi, joka rehellisesti, on melko järjetöntä. Tämä koodi saa aikaan mitään hyödyllistä, mutta se oli esimerkki että professori Parlante käytetään edustamaan mitä oli tekeillä ohjelma, johon muisti. Joten mukailevat tätä tarina Super lyhyesti. Nämä kaksi ensimmäistä riviä, vuonna Englanti, ei mitä, sanoisit? Vain kohtuullisesti ihmisen, mutta hieman teknisiä termejä, ottaa puukottaa. Yleisö: [kuulumaton]. DAVID J. MALAN: OK, olet perustamisesta osoitteet oman x ja y muuttujia. Ei aivan, koska x ja y eivät ole muuttujat perinteisessä mielessä. x ja y ovat osoitteita tai tallentaa osoitteen. Joten kokeile tätä vielä kerran. Ei huono alku, vaikka. Joo? Yleisö: [kuulumaton]. DAVID J. MALAN: Hyvä. Mielestäni on hieman puhtaampi. Julistaa kaksi osoitinta, kahden kokonaisluvun. Ja me kutsuen heitä x ja y. Tai jos me tehdä tämä kuva taas muistuttaa yksinkertaisesti, että kaikki teemme on, että ensimmäinen rivi vetää laatikon näin, joitakin roskat arvoa siinä, ja kutsuen sitä X ja sitten toiseen ruutuun näin, joitakin roskat arvo siinä, kutsuen sitä y. Olemme julisti kaksi viitteitä, että viime kädessä tallentaa osoitteen int. Niin että kaikki on. Joten kun Binky teki tämän, savi aivan näytti tältä. Ja Nick vain eräänlainen kääritty ylös nuolia, ikään kuin he ei osoita minnekään erityisesti, koska ne ovat vain roskat arvot. He eivät nimenomaisesti alustettu missään erityisesti. Nyt seuraava rivi koodia, muistaa, oli tämä. Joten kohtuullisen käyttäjäystävällisiä, mutta jonkin verran teknistä Englanti, mikä on tämä rivi koodia teet? Joo? Yleisö: [kuulumaton]. DAVID J. MALAN: Perfect. Se kohdentaa kimpale muisti, joka on koko int. Ja se puoli vastausta. Vastasit oikeus puolet ilme. Mitä tapahtuu vasemmalla puolella yhtäläisyysmerkki? Joo? Yleisö: ja osoittaa se muuttuja x? DAVID J. MALAN: ja määrittää se muuttuja x. Joten kertaus, oikea puoli allokoi tarpeeksi muisti tallentaa int. Mutta malloc nimenomaan palauttaa osoitteen Kyseisen kimpale muistia, jota olet juuri ehdottanut saa varastoida x. Joten mitä Nick teki viimeisen kerran Binky on Hän raahasi että osoitin ulos, savi, huomauttaa nyt valkoinen kimpale muistia , joka on yhtä suuri kuin koko int. Ja todellakin, että on tarkoituskin edustaa neljä tavua. Nyt seuraava rivi koodia teki tämän, tähti x saa 42. Joten 42 on suoraviivainen päälle oikea puoli, elämän tarkoitusta. Vasen puoli, tähti x tarkoittaa mitä? Sekin voi olla gone-- se on OK. OK. Yleisö: Periaatteessa, Siirry [kuultavissa] DAVID J. MALAN: Hyvä. Yleisö: [kuulumaton]. DAVID J. MALAN: Aivan. Vasemmanpuoleista tarkoittaa mennä x. x on osoite. Se on kuin 33 Oxford Street, tai OX1. Ja tähti x tarkoittaa mene, että käsitellä ja laittaa mitä siellä? 42. Niin tosiaan, se on juuri sitä mitä Nick teki. Hän aloitti mukaan, olennaisesti, henkisesti osoittaa sormella x, nuolen valkoiseen ruutuun oikealla puolella, ja laittoi numero 42 siellä. Mutta sitten asiat menivät vähän vaarallista, eikö? Binky n noin menettää päänsä. Star y on yhtä kuin 13, huonoa onnea, tarkoittaa mitä? Joten tähti y keino mennä osoitteeseen y. Mutta mikä on osoite y? Okei, se on roskaa arvo, eikö? Piirsin sen kysymysmerkki. Nick veti sen käpertyneenä nuoli. Ja heti kun yrität do tähti y sanoen sinne, mutta ei ole oikeutettua osoite, se on jokin väärä sijainti, Ohjelman tulee kaatumaan. Ja Binky pää on menossa lentää pois täältä, kuten se teki. Joten lopulta, tämä ohjelma oli vain täysillä virhe. Se oli buginen ohjelma. Ja se jouduttiin tekemään. Ja ainoa tapa, todella, se korjataan Olisi esimerkiksi tätä linjaa, jota emme edes päästä, koska ohjelma kaatui liian aikaisin. Mutta jos me korjata, mitä vaikutus ei tee y equal x on? No, se lähinnä muistuttaa y at arvosta riippumatta x on suunnattu. Joten Nickin tarina, tai Binky tarina, molemmat x ja y ovat osoittaen valkoinen kimpale muistia, niin, että lopulta, kun älä tähti y vastaa 13 uudelleen, päädyt laskemisesta 13 sopivaan paikkaan. Joten kaikki nämä linjat ovat täysin oikeutettua, paitsi tämä yksi, kun se tapahtui, ennen kuin tosiasiallisesti myönnetty y jotain arvoa. Nyt onneksi et täytyy järkeillä läpi kaikki Tällaisten kysymysten itse. Anna minun mennä eteenpäin ja avata ylös pääteikkunassa täällä ja avata, vain hetken, Super lyhyt ohjelma, joka Lisäksi on tavallaan turhaa. Se on ruma. Se ei saavuteta mitään hyötyä. Mutta se osoittaa kysymyksiä muistia, joten katsotaanpa katsomaan. Main, super yksinkertainen. Se ilmeisesti kutsuu funktiota, f, ja palaa sitten 0. Se on tavallaan vaikea sotkea tähän asti. Joten Main on melko hyvä, toistaiseksi. Joten f on ongelmallista. Ja vain ei laita paljon vaivaa sen nimestä täällä, pitää keskittyä koodin. f on kaksi riviä. Ja katsotaanpa mitä nyt tapahtuu. Niin toisaalta here-- ja haluan tehdä Tämän yhdenmukainen aiempien example-- toisaalta, vasen puoli on tekee mitä, vuonna Englanti? Se on-- Yleisö: Creating osoitin. DAVID J. MALAN: Creating osoitin int ja sen hakeminen x. Joten se on luoda yksi niistä laatikot En pidä piirustus kosketusnäytöllä. Ja nyt on oikea puolella, malloc, tietenkin, ei myönnä kimpale muistia. Ja vain olla selkeä, miten paljon muistia on se ilmeisesti myöntämistä, jos vain tavallaan tehdä matematiikka täällä? Joten se on 40 tavua. Ja tiedän, että vain koska tiedän int, on CS50 laite, ainakin, on neljä tavua. Joten 10 kertaa 4 on 40. Joten tämä on tallentamisen x, osoite Ensimmäisen ulos 40 ints että on varattu tilaa takaisin, takaisin, takaisin, takaisin. Ja sitähän on avain noin malloc. Se ei vie vähän muistia täällä, vähän siellä, vähän täällä. Se antaa sinulle yksi kimpale muistia, vierekkäin, alkaen toiminta järjestelmä. Nyt mitä tästä, x kiinnike 10 on yhtä kuin 0? Mielivaltainen riviä koodia. Se ei saavuteta mitään hyötyä. Mutta on mielenkiintoista, koska x kiinnike 10--? Joo? Yleisö: [kuulumaton]? DAVID J. MALAN: x kiinnike 10 ei tarvitse olla tyhjä. Null yksityiskohtaisesti vasta tulee pelata jousten, lopussa merkkijonon. Mutta hyvä ajatus. Kuinka suuri tämä joukko, jopa vaikka olen varattu 40 tavua? Se on 0 yhdeksään, eikö? Se on 10 ints yhteensä. 40 tavua, mutta 10 ints, indeksoitu 0 kautta 0. Mikä siis on, että x kiinnike 10? Se on todella jokin tuntematon roskat arvo. Se on muisti, joka ei kuulu minulle. Minun ei pitäisi olla koskematta, että tavu numero 41, 42, 43, 44. Aion hieman liian pitkälle. Ja todellakin, jos juoksen tämän ohjelma, se saattaa hyvinkin kaatua. Mutta joskus, me onnistaa. Ja niin vain osoittamaan this-- ja rehellisesti, eihän sitä koskaan tiedä ennen kuin älä se-- juostaan ​​tätä. Se ei oikeastaan ​​kaatua. Mutta jos muutan tätä varten Esimerkiksi olla kuin 1000, jotta tämä todella tahallinen, katsotaanpa jos saamme sen kaatuvan tällä kertaa. OK, se ei kaadu. Entä 100000? Katsotaan sen uudestaan, ja nyt uusintana se. OK. Huh huh. Kunnossa. Joten ilmeisesti nämäkään segmentit muistia, niin sanoakseni, ovat kohtuullisen suuria, joten voimme onnekas uudestaan ​​ja uudestaan. Mutta lopulta, kun saat naurettava ja todella mennä pitkälle ruudulla, kosketat muistin että todella, ei todellakaan kuulu sinulle. Mutta suoraan sanottuna, nämä Erilaisia ​​vikoja ovat menossa olla vaikeampaa selvittää itse. Mutta onneksi, kuten ohjelmoijat, olemme työkaluja, joiden avulla voimme tehdä tämän meille. Joten tämä on ehkä yksi rumin ohjelmia, jopa rumempi kuin gdb tuotannosta. Mutta se on aina rivin tai kaksi, jotka ovat erittäin hyödyllisiä. Valgrind on ohjelma, joka auttaa Ettekö debug ohjelman, sinänsä, mutta löytää muistiin liittyviä ongelmia, erityisesti. Se automaattisesti ajaa koodi te ja etsiä ainakin kaksi asiaa. Yksi, teit jotain vahingossa tuntu muisti jotka eivät kuulu sinulle? Se auttaa sinua löytämään ne tapaukset. Ja kaksi, se auttaa löydät jotain kutsutaan muisti vuotaa, mikä meillä on täysin huomiotta, naiivisti, jonkin aikaa ja autuaana. Mutta näyttää siltä, ​​kaikki tällä kertaa, kun olet kutsuttu getString vuonna niin monet ohjelmat, pyydät toiminta järjestelmä muisti, mutta teillä muistikuvaa koskaan antaa sille takaisin, tekee Kohdenta-, tai vapaa, kuten sitä kutsutaan. Ei, koska emme ole koskaan pyytänyt sinua tekemään niin. Mutta kaikki tällä kertaa, ohjelmat olet kirjoittanut C on vuotaa muistiin, kysyy toiminta järjestelmää enemmän ja enemmän muisti jousille ja vaikka mitä, mutta ei koskaan sen palauttamista. Ja nyt tämä on vähän ja yksinkertaistamista, mutta jos olet joskus ajaa Macissa tai tietokoneesi jo jonkin aikaa, aukko paljon ohjelmia, ehkä sulkematta ohjelmia, ja vaikka sinun tietokone ei ole kaatunut, se on jo niin paljon hitaampaa, kuin se olisi todella käytetään paljon muistia tai resursseja, vaikka jos et ole edes koskemasta näppäimistöön, joka voisi olet-- mutta ei always-- voisi olla, että ohjelmat käytät ovat itse muisti vuotaa. Ja ne pitää pyytää OS enemmän ja enemmän muistia, mutta unohtaa sen, ei todellisuudessa käyttävät sitä, mutta siis kun muisti pois muista ohjelmista, jotka saattavat haluta sitä. Niin, että yhteinen selitys. Nyt täällä on, jos Valgrind n tuotos on täysin hirvittävät niitä vähemmän ja mukavampaa samankaltaisia. Mutta mielenkiintoinen tavaraa on aina täällä. Se kertoo minulle kelpaa kirjoitus koko neljän tapahtuu tässä ohjelmassa, erityisesti, riviltä 21 memory.c. Jos menen linja 21, hm, siellä todellakin on virheellinen kirjoittaa koosta neljä. Miksi koko neljä? No, tämä number-- ja se voisi olla mitään-- on int. Joten se on neljä tavua. Joten Laitan neljä tavua jos ne eivät kuulu. Sitähän Valgrind on todella kertoo minulle. Lisäksi se myös Kerro minulle, kuten tulemme näkemään, kun ajaa tätä tulevaisuudessa PSET, jos ja kun olet vuotanut muistia, joka todellakin Minulla on, koska olen kutsuttu malloc, mutta en ole oikeastaan kutsutaan tässä tapauksessa, ilmainen, jonka me lopulta nähdä on vastakohta malloc. Joten nyt, luulen, viimeisenä esimerkkinä. Joten tämä on hieman mystistä, mutta se on ehkä Suurin syy olla varovainen muistilla, ja syy, että monet ohjelmat ja / tai web-palvelimia, vielä tänäkin päivänä, haltuunsa pahiksia jonnekin Internetissä, jotka ovat jotenkin lähettämällä vääriä paketteja palvelimelle yrittää murtautua tilejä, tai ottaa tietosi, tai vain yleensä ottaa koneeseen. Puskurin ylivuoto, kuten Nimensä välineet täynnä ei int, mutta puskuri. Ja puskuri on vain hieno tapa sanoa se nippu muistia. Ja todellakin, kutsuin merkkijono Ennen puskuria, sen sijaan, että s. Koska jos se puskuri, kuten YouTube mielessä, tai milloin olet katsomassa video, Olet ehkä nähnyt sanan puskurointi, piste, piste, piste. Se on uskomattoman ärsyttävää. Ja että juuri tarkoittaa että videon tekijä yrittää ladata paljon tavua, paljon tavuja alkaen videoita internetistä. Mutta se on hidasta, joten se yrittää ladata nippu niitä täyttää puskurin, kontti, niin että sinulla on tarpeeksi tavua, että se voi sitten näyttää videon, pysähtymättä jatkuvasti. Mutta näyttää siltä, ​​voit on puskuri tähän iso. Mutta yritä laittaa näin paljon tietoa se, ja erittäin huonoja asioita voi tapahtua. Joten esimerkiksi Katsotaanpa tämä viimeinen teaser esimerkki. Tämä on toinen ohjelma että, ensi silmäyksellä, ei tee mitään super hyödyllinen. Se sai Päätoiminto joka vaatii, että funktio f. Ja että funktio f, täällä, on char array, nimeltään C, koosta 12. Ja sitten se käyttää tätä uusi toiminto nimeltään strncpy. On käynyt ilmi, että tämä yksinkertainen, yksinkertainen rivi koodia, vain kaksi riviä, olemme tehneet minun koko ohjelman, ja siksi minun koko tietokone, ja minun käyttäjätilin, ja minun kova ajaa alttiin kenellekään kuka tietää ja on tarpeeksi hyvä ajaa Tämän ohjelman tietty komentoriviltä argumentti. Toisin sanoen, jos tämä paha laittaa sisälle argvargv [1] kirjoittamalla näppäimistöllä hyvin erityisesti muodostetun merkkijono, ei abc, 123, mutta pohjimmiltaan, binäärisymbolien jotka edustavat suoritettavia koodia, ohjelma, että hän kirjoitti, tämä yksinkertainen ohjelma, joka on edustaja tuhansia ohjelmien jotka ovat yhtä haavoittuvia, daresay, hän voi lopulta poistaa kaikki tiedostot kiintolevyllä, saat vilkkuu ajallaan niin että hän voi komentojen omasta, lähetä kaikki tiedostot itselleni. Mitään, että voin tehdä, hän tai hän voi tehdä tällä koodilla. Emme aivan ratkaise tätä vielä. Ja itse asiassa, se tulee liittyy pieni kuva kuten tämä, jota me pian ymmärtää kaikki paremmin. Mutta tänään, katsotaanpa päättyy mikä toivottavasti hieman enemmän ymmärrettävää XKCD vitsi, kunnes jatkamme ensi kerralla. Kunnossa. Nähdään keskiviikkona. [Musiikki soi] Puhuja: Ja nyt, syvä ajatuksia, joita Daven Farnham. Muisti on kuin hyppäämällä kasa kultainen lehdet sunnuntaina iltapäivällä. Tuuli puhaltaa, tossing hair-- oi, kaipaan päivän when-- [Naurua]