[Musiikki soi] DAVID J. MALAN: Okei tämä on CS50 ja tämä on alku viikon viisi. Joten tänään, alla oman istuintyynyt, et löydä mitään. Mutta ennen, sinun pitäisi löytää nämä, pikku Ilmimerkkinä arvostusta kaikki työ, että laitat peliin viidentoista. Yksinkertaisesti irrota hieman ympyrä pohja alkaa pelaa Loput luokassa. Niin muistaa, että tai tietää, että ongelma asetettu neljä, joka meni tänä viikonloppuna, liittyy kirjallisesti toisen pelin. Mutta tällä kertaa se liittyy käyttämällä Varsinainen graafinen käyttöliittymä, ei tekstisisältöä rajapinnoille Game of Viisitoista oli. Ja peli, joka edessänne, jos et ole vielä nähnyt tätä seuraavaksi, näyttää vähän jotain tällaista. Aion mennä minun terminaalin ikkuna täällä GDB. Ja aion mennä eteenpäin ja ajaa Henkilökunta ratkaisu, joita voi käyttää suorittamisen jälkeen päivitetty 50 normaalisti. Mutta aion laittaa se hieman Salaus, hieman Pääsiäismuna, ns God Mode, jonka laittamalla Jumala argv1. Ja minun täytyy seurata omaa suuntiin, käynnissä se omassa Harjoitus hakemistoon. Nyt näet täydellisen version ja peli Breakout. Itse asiassa tämä ei ole kättä tilassa. Joten se on todella - wowed vaikka saatat olla - melko triviaali toteuttaa Jumalan tilassa Breakout, toisin kuin peli Fifteen, jonka jotkut teistä ehkä puututtava varten hakkeri painos. Vuonna Breakout riittää Jumalaan tila yksinkertaisesti tehdä mitä, intuitiivisesti mela? Vain tehdä sama riippumatta vaaka-asennossa on pallo. Ja niin kauan kuin teet tämän lockstep jossa pallo liikkuu tämä peli koskaan, koskaan, koskaan unohda pallo ja voit voittaa joka kerta. Mutta tällä viikolla hakkeri painos siellä on enemmän kuin vain Jumalan tilassa. On useita muita ominaisuuksia. Niistä laserit. Niin, että jos todella kärsimätön sinua voi aloittaa ampuminen alas tiilet ja muutama muu. Ja niille teistä, jotka haluat kalibroida standardin vs. hakkeri painos, näen, että tämän viikon hakkeri painos tarkoituksella on hieman toteutettavissa vaikkapa kuin Jumala tila oli Game of Viisitoista. Joten jos etsit venyttää ja etsit joitakin ylimääräisiä hauskaa ominaisuuksia tehdä sukellus jos kiinnostaa. Nyt käytännössä, saanen yhden asian samoin. GDB, jonka jotkut teistä ehkä ole vielä kosketti henkilökohtaisesti, joka on hieno. Mutta nyt on todella aikaa tottua tähän ja mukava tätä työkalua koska se tekee elämästänne paljon helpompaa, todella. Per Rob luento GDB pari viikko sitten muistaa että GDB on debuggeri. Se on työkalu, jonka avulla voit ajaa Ohjelma mutta ajaa se askel askeleelta, rivi riviltä, ​​jotta voit penkoa, niin että näet asioita tapahtuu, niin että voit tulostaa muuttujien arvot. Lyhyesti sanottuna, se antaa sinulle niin paljon enemmän teho kuin printDef tekee. Nyt tosin käyttöliittymä on melko mystistä. Musta ja valkoinen teksti käyttöliittymä suurimmaksi osaksi. Komennot ovat hieman kova muistaa aluksi. Mutta vaikka se saattaa mennä puoli tunti, tunti, esittää, että etukäteen investointien aikaa siihen, luota minuun. Varmasti by lukukauden lopussa se säästää voit suuruusluokkaa aikaa kuin. Joten alkuviikosta sukeltaa Ja suhteen Breakout, tietää, että olet voi tehdä tätä niin kauan kuin sinulla on jakelu koodi tai oman koodin käynnissä oman Pst4 hakemistoon. Tiedä, että voit käyttää GDB. / Purkautuminen. Tämä tulee avaamaan ikkuna näin. Annan itselleni lisää päätelaitteen ikkunan. Ja mitä sitten aion mennä eteenpäin ja tehdä, se ei ole vain ajaa sitä. Aion ensin asettaa taitekohta Recall, jonka avulla voit keskeyttää suorittamisen tietyssä paikassa. Vain pitää asiat yksinkertaisina aion rikkoa rivillä yksi vain kirjoittamalla numero yksi. Saanen todella avata uudelleen tämä ikkuna koska se alkaa vähän pieni siellä. Joten mitä olen nyt aikoo tehdä tässä jos avaan minun terminaali-ikkuna. Tule, sinne siis. Joten nyt jos menen takaisin Dropbox, Pst4 ja ajaa GDB. / purkautuminen tulee, huomaa Aion rikkoa asettaa taitekohta on linjalla yksi. Ja nyt aion mennä eteenpäin ja tyyppi ajaa. Ja kun minä, huomaa mitään näyttää tapahtuvan. Ei ole pop up. Ei ole graafista käyttöliittymä vielä. Mutta se on ymmärrettävää, koska olen kirjaimellisesti linjalla yksi minun ohjelma. Ja huomaa, että olen nopea toimitettu, nyt erityisesti 62, koska kaikki kamaa päälle tämä tiedosto on asioita, kuten kommentit ja vakioita ja mielenkiinnotonta kamaa nyt. Joten nyt olen sisällä tärkein, näyttää siltä, ​​rivillä 62. Ja tämä on juuri jakelu koodia, muistaa. Jos avaan jopa menemällä vastaavasti minun pudotuslaatikkokansion hakemiston Pst4, osaksi breakout.c. Ja jos minä selaa alas ja alas ja alas, ja anna minun mennä eteenpäin ja käynnistä minun linja numerot. Mitä näen, jos olen selaa linja 62, on juuri linjaa olemme pysäytetään. Joten tämä linja täällä, 62, on jos aiomme olla. Joten nyt GDB, jos menen eteenpäin ja kirjoita nyt seuraava, kirjoita se tulee suorittamiseen linja. Ja voila, meillä on ns g ikkuna. Jos tiedä, mitä GWindow ei, ei hätää. Spec tutustuttaa sinut sen, koska sekä useita walkthrough videoita upotettu spec. Mutta nyt tehkäämme tästä hieman mielenkiintoisemman. Jatkan tätä ikkunaa puolelle hieman. Haluan tehdä ikkunaa hieman isompi, jotta voin nähdä enemmän. Ja nyt haluan mennä eteenpäin ja tehdä seuraavaksi uudelleen. Ja on minun tiilet. Jos kirjoitan seuraavan kerran nyt näen pallo. Ja jos kirjoitan seuraavan kerran nyt näen meloa. Ja onneksi tämä gedit ei ole todella yhteistyöhaluisia osoittaa minulle kaikkea haluan. Mutta nyt jos teen seuraavaksi taas ensi kerran, olen vain julistaa joitakin muuttujia. Ja voin tulostaa minkä tahansa nämä kaverit pois. Tulosta tiilet, tulosteita elämää. Ja nyt, jos olen edelleen tehdä Seuraavaksi huomaat, että otan sisällä että silmukka. Mutta koodi tulee suorittaa juuri niin kuin odottaa. Joten kun lyön tätä toimintoa, odota napsautettavassa, se tulee tehdä se kirjaimellisesti. Olen siis näytti menettänyt ohjelmakaudella. GDB ei ole antaa minulle toisen nopeasti. Mutta ei hätää. Siirry peliäni, valitse jonnekin. Ja voila, nyt se etenee linja 86. Joten jälleen, se on korvaamaton, lopulta virheenjäljitykseen ongelmia. Koska voit kirjaimellisesti astua koodia, tulostaa asioita ja paljon, paljon enemmän. Mutta nyt ne työkalut yksin pitäisi saada jo aika pitkälle. Joten olemme tietenkin vilkaisemalla klo Graphics nyt yhtäkkiä. Ja nyt meidän maailma saa hieman mielenkiintoisempaa. Ja te tiedätte, ehkä joidenkin videoita verkossa, että meillä on nämä shortsit, että olet ollut katsomassa osana ongelmaa sarjaa. Ja ne on ammuttu tahallisesti, vasten valkoista taustaa. Ja jotkut niistä ovat opetus Fellows piirustus joitakin tekstiä näyttö, joka on päällysti puolella niistä. Mutta tietenkin, tämä ei ole kovin mielenkiintoinen todellisessa maailmassa. Tämä on vain luentosali kanssa iso valkokangas ja taustaa. Ja hämmästyttävä tuotanto joukkue tavallaan ja tekee kaiken kaunis jälkikäteen rajaamalla ulos tai päällekkäin mitään me teemme tai emme halua. Nyt vain motivoida tällä viikolla ja todella, missä voit mennä, lopulta kanssa tietotekniikassa. Ei juuri kun ongelma asettanut neljä. Mutta sen jälkeen toisen kurssin tai koko Opetussuunnitelma On hämmästyttävää, mitä voit tehdä näinä päivinä suhteen grafiikka erityisesti. Jotkut teistä ehkä nähnyt tämän kiertämään verkossa. Mutta ajattelin näyttää teille, vain pari minuuttia, Esimakua tietotekniikkaa ja mitä CGI, tietokonegrafiikka voi tehdä näinä päivinä tuttu laulu ja ehkä elokuva. [MUSIC - LANA DEL RAY, "Nuori ja kaunis] SPEAKER 1: Se on vain hieman hämmästyttävä, ehkä, kuinka läsnäoleva - [APPLAUSE] SPEAKER 1: Olen juuri ladannut sen. Mutta se on todella hämmästyttävää, uskoisin, aivan miten läsnäoleva ohjelmistojen ja koodin ja työkaluja, kuten tämä todella ovat. Niin, että maku suuntaan jossa voit mennä. Voi, ei enää Appliance tänään. No, se on todella traagista ajoitus koska kohta olen vain yrittänyt tehdä. Okei, joten nyt käynnistää Fusion uudelleen. Muistuta myöhemmin. Kunnossa, ja sinun pitäisi saanut sähköposti syrjään, jos ei saada huomaa niin. Okei, niin muistaa, että viime viikolla aloimme kuori takaisin tämän joka myöhemmin tunnettiin merkkijono. string muistuttaa tietotyyppi, joka on ilmoitettu CS50 kirjastossa. Ja se on osa apupyörät että nyt alkaa ottaa pois. Se oli hyödyllinen käsite varhain. Mutta nyt se tulee saada lisää kiinnostava ja voimakas itse nähdä, että alla huppu, merkkijono on vain mitä, ei me sanoimme? Joo, niin se on ns char *. Ja * siellä tarkoittaa, että on olemassa jonkinlaisen osoitteen mukana. Ja niin kun sanot char * juuri tarkoittaa muuttujaa, jonka tietotyyppi on osoitin nyt. Se, että siellä on tähti siellä vain sitä, että olet julistamisesta ns osoitin. Ja että osoitin on menossa ilmeisesti tallentaa osoitteen, ja Tietenkin merkkiä. Nyt miksi tämä järkevää? No, mikä on merkkijono alla huppu? No, jonkin aikaa olemme sanoneet että merkkijono alla huppu on vain h-e-l-l-o, esimerkiksi. Mutta olemme puhuneet tätä on lähinnä joukko. Ja Silloin rivin näyttää hieman enemmän kuin tämä, jossa kukin näistä aloittamisesta purra. Ja sitten olemme sanoneet, että siellä on jotain erityistä tänne, kenoviiva 0 tai null terminaattori. Joten kaikki tällä kertaa, täällä on ollut merkkijono. Mutta oikeasti, merkkijono on todella osoite. Ja osoitteet, kuten tulemme näkemään, ovat usein etuliite 0x sopimuksen mukaan. Mitä 0x tarkoittaa? Tietääkö kukaan? Niin se vain tarkoittaa heksadesimaali. Joten saatatte muistaa, oikeastaan ​​PST 1, uskon, yksi verryttely kysymyksiä todella kysyttiin Heksadesimaalilukuja lisäksi binary ja desimaalin. Ja motivaatiota on, että heksadesimaalimerkin sinulla on 16 numeroa käytettävissänne. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, jonka jälkeen by a, b, c, d, e, f. Ja jos lasketaan kaikki ne ylös, saat yhteensä 16. Joten tämä on vastoin desimaalin, jossa meillä on 10 numeroa, 0 yhdeksään. Se on toisin binary jos meillä vain on 0 ja 1. Mutta loppujen lopuksi voit vain ovat samat numerot, mutta hieman eri tavalla. Ja heksadesimaali on yleistä, koska sillä se kääntyy pois - ja näemme tämän myöhemmin kurssi - vaikka saamme Web-ohjelmointi yhteydessä HTML ja värikoodit heksadesimaali on mukavaa. Koska kunkin numeron, osoittautuu, edustaa neljä bittiä täydellisesti. Niin se vain eräänlainen linjassa hienosti kuten me lopulta nähdä. Joten tämä saattaa olla Ox123 tai jotain sellaista, joka merkitsee osoite 123 jonnekin sisällä minun tietokoneen muistiin. Mutta tietenkin joitakin ongelmia koska tämän taustalla täytäntöönpanoa. Ja muistaa, että otin puukottaa täytäntöön toimivat näin - vertaa viiva 0 dot c viime viikolla, että vaikka se näytti kuin se oli oikea, se ei yksinkertaisesti vastaa kaksi merkkijonoa oikein. Olen heittänyt pois tärkein, ja olen heittänyt pois kommentit vain keskitymme siihen koodi, joka on kiinnostava täällä. Ja se on punainen, koska se on buginen. Mistä syystä? No, huipulla siellä kun julistin merkkijono, mitä todella tapahtuu alla huppu? No, anna minun mennä yli seuloa täällä ja piirtää sen. Niin minä julistan jälleen string s getString. Joten aion mennä eteenpäin nyt ja piirtää s, mitä se todella on. Se tulee olemaan neliö täällä. Ja aion vaatia että se on 32 bittiä. Ainakin se yleensä on, ainakin CS50 laitetta paljon tietokoneita. Aion kutsua sitä s. Mutta nyt muistaa, että meillä nimeltään getString. Joten getString palaa, tietenkin merkkijono. Jos käyttäjä on h-e-l-l-o kirjoita string hei saa palauttaa. Ja merkkijonon, kuten juuri sanoi, päättyy jonnekin tietokoneen muistiin kenoviivaan 0 lopussa. Minä vetää tätä kuin array - tai yhtenäinen alue merkkiä - että se todella on. Ja nyt, mitä getString todella palaamassa? Mikä on getString on palaamassa kaikki tällä kertaa? No, me sanomme, vuonna viikkoa ennen, se palauttaa merkkijonon. Mutta teknisesti, mitä GetString paluuta ilmeisesti? Yleisö: osoite. SPEAKER 1: osoite. Erityisesti se palaa osoite ensimmäinen purra, mitä se on. Sain pitää käyttää yksi, kaksi, kolme koska se on kätevä. Se palauttaa osoitteen ensimmäisen merkin merkkijono. Ja me sanoi viime viikolla, että joka on riittävä. Koska emme voi aina selvittää, missä merkkijonon loppuun vain iteroimalla sen yli, ehkä, jossa on silmukka tai while-silmukka tai jotain että vain etsivät "kenoviiva 0", erityistä Sentinel luonnetta. Ja sitten me tiedämme, että jono sattuu olemaan pituus - tässä tapauksessa - viisi. Joten teknisesti mitä getString tekee on se palauttaa Ox123 tässä tapauksessa. Ja teknisesti mitä sitten tapahtuu, on että me tallentaa, sisällä s, Ox123. Lopussa päivä, vaikka tämä on uusi käsite, osoittimet, he vain muuttujia. Mutta he sattuvat tallentaa bittien kollektiivisesti osoite. Joten teknisesti kaikki ne saa tallennettu s on Ox123. Mutta me ihmiset - myös tänään eteenpäin - todella aio hoitaa tyypillisesti mitä todellinen osoite on Joidenkin kimpale muistia. Se on vain alhainen yksityiskohtaisesti olla älyllisesti kiinnostava. Joten aion kumoa tätä. Ja sen sijaan, enemmän korkean tason, sano että kun me puhumme viitteitä Aion vain tehdä enemmän käyttäjäystävällinen nuoli, joka välittää Sama ajatus ja abstraktit pois tiedot siitä, mitä todellinen taustalla osoite on. Nyt jos palaamme koodin, mikä tapahtui viime viikolla, jos meillä on merkkijono t vastaa getString? No, jos minä taas, kirjoita hei tällä kertaa aion saada toinen murikka muistia. h-e-l-l-o kenoviivan 0. Mutta koska pyysin getString toisen kerran - ja tiedän tämän katsot lähdekoodi getString - jopa vaikka se on sattumaa, että hei oli kirjoitetaan kahdesti, getString ei ole yrittävät optimoida ja olla fiksu. Se on vain menossa toiseen kimpale muisti tietokoneeseen, joka on olemaan toiseen osoitteeseen. Oletetaan mielivaltaisesti vain sanoa 456. Ja mitä sitten on se aio palata? Se tulee palauttaa 456 ja tallentaa sen t. Joten mitä todella tapahtuu, on vasen puoli on minulla on toinen kimpale muistia, 32 bittiä tyypillisesti. Ja siellä on menossa Ox456. Mutta jälleen kerran, en ole kiinnostunut näistä Erityisesti numeroita enää. Olen juuri menossa abstraktisti piirtää se nuoli. Joten tämä on nyt uusi selitys. Mutta se on täsmälleen sama ajatus, joka on on tapahtunut koko ajan. Ja niin syy sitten, että tämä ensimmäinen versio vertaansa buginen viime viikolla miksi? Kun teet, jos et vastaa yhtä t mitä sinä todella alla huppu vertaamalla? Olet verrataan osoitteet. Ja vain intuitiivisesti, selvästi, Ox123 ei tule yhtä Ox456. Nuo luvut, ne bitit ovat vain erilaisia. Ja niin johdonmukaisesti, viime viikolla se sanoi kirjoitat eri asioita, vaikka sanat olivat sanatarkasti sama. Joten me korjata. Maallikon termein, mikä oli korjata? Yleisö: Käytä toimintoa. SPEAKER 1: Käytä toimintoa. Tai tähdet ovat varmasti mukana, vaan käyttää toimintoa tekemään mitä? Yleisö: Voit verrata jouset. Kaiutin 1: Jos haluat vertailla jouset. Niin perustavanlaatuinen ongelma oli että olin vain harkitsee laatu jouset määrittelemät vertailu niiden osoitteet. Ja tietysti se on vain tyhmä nyt kerran ymmärrät mitä tapahtuu alla huppu. Todella verrata jouset, onko he yhtä siten, että ihmisen harkitsisi kaksi merkkijonoa sama meidän täytyy verrata niitä merkin merkin merkki. Nyt olisin voinut tehdä Tämä erittäin ikävän. Mutta tuttavallisemmin olemme käyttäen silmukka. Ja vain verrata s kiinnike i vastaan ​​t kiinnike i. s kiinnike i + 1 vastaan ​​t kiinnike i plus 1, ja niin edelleen sisällä jonkinlainen silmukka. Ja jos olen paikalla tahansa kaksi merkkejä eroavat, tai jos huomaan, että ooh, s on lyhyempi kuin t tai pidempi kuin t Voin heti sanoa vääriä, he eivät ole samoja. Mutta jos saan läpi s ja t ja sanoa sama, sama, sama, sama, sama, lopussa molemmat jouset, voin sanoa totta, ne ovat yhtä. No, onneksi vuotta sitten joku kirjoitti, että koodi meille. Ja he kutsuivat sitä StrComp jousikvartetille vertailla. Ja vaikka se on hieman counter intuitiivinen, StrComp palauttaa 0, jos nämä kaksi merkkijonoa, s ja t ovat samoja. Mutta se palauttaa negatiivisen arvon, jos s pitäisi tulla ennen t aakkosjärjestykseen tai positiivinen arvo, jos se olisi tullut Kun t aakkosjärjestyksessä. Joten jos joskus haluat lajitella jotain, käy ilmi, että StrComp on hyödyllistä. Koska se ei vain sanoa kyllä ​​tai ei, yhtä tai ei. Se antaa sinulle tunteen tilaus erillaisista voimin. Joten StrComp, s pilkku t on vastaa 0 tarkoittaa, että jouset ovat todella yhtä. Koska kuka kirjoitti tämän toiminnon vuotta sitten oletettavasti käytetään silmukka tai kun silmukka tai jotain integroida yli merkkiä uudelleen ja uudestaan ​​ja uudestaan. Mutta ongelma kaksi syntyi täällä. Tämä oli copy0.c. Ja kaksi punaista on koska se on puutteellinen. Ja mitä me teemme täällä? No, pyysin getString. Ja minä tallennettu paluu arvo s. Niin se on aika paljon samaa kuin Tämän yläosa kuvan. Mutta mitä tulee sen jälkeen? No, anna minun mennä eteenpäin ja päästä eroon ja koko joukko tämän. Me kelata ajassa, jossa me vain on s, joka on nyt yhdenmukainen line yksi siellä. I tarkistaa. Jos s vastaa ollessa 0. Nyt nopea Sivuhuomautuksena, kun ehkä getString palata 0? Ei ole tarpeeksi muistia. Oikea? On harvinaista, että tämä tulee tapahtumaan, varmasti on tietokone, joka on sai satoja megs tai jopa keikoilla RAM. Mutta se voisi teoriassa palata 0, varsinkin jos Käyttäjä ei ole yhteistyöhaluinen. On tapoja teeskennellä et ole syötetyn mitään ja temppu GetString palaavak 0 tehokkaasti. Joten se tulee tarkistaa, että. Koska jos joku teistä ovat alkaneet saada jo, segmentointi viat - joka on luultavasti ollut lähde Joidenkin turhautumista - ne ovat lähes aina tulos muistia liittyvästä virheestä. Jotenkin sekaisin osalta osoitin, vaikka et tiennyt oli osoitin. Joten sinulla voisi kiihdyttää segmentointi viat jo viikon käyttävällä jotain silmukka tai kun silmukka ja array menemällä liian pitkälle viime rajat joidenkin array, joka voit julistettu viikolla kaksi erityisesti. Olet ehkä tehnyt sen jopa ongelma asetettu neljä Breakout. Vaikka et luultavasti ole nähnyt kaikki tähdet jakelu koodi Breakout, käy ilmi, että nämä GRect ja GOval ja muita vastaavia asioita, ne ovat todella viitteitä alla huppu. Mutta Stanford, kuten mekin, tavallaan vuotia että yksityiskohtaisesti ainakin kirjastot varten, aivan kuten me jousikvartetille ja nieriää *. Mutta GRect ja GOval ja kaikki ne mitä olette tai tulee käyttämään tällä viikolla ovat viime kädessä muistin osoitteet. Et vain tiedä sitä. Joten se ei ole yllättävää, ehkä, että saatat kompastua joidenkin segmentointi viat. Mutta mitä mielenkiintoista täällä nyt jos sen jälkeen me tarkistaa 0 teemme string t saa s. No, anna minun julistaa t. Aion tehdä sen neliö, 32 bittiä, kutsuvat sitä t. Ja sitten aion tehdä saa s. No, mitä se tarkoittaa? No, se on vähän vaikea ajatella siitä kuva viisasta. Mutta Ajatellaanpa mitä sisällä x? Mikä on kirjaimellisesti sisälle muuttuja? Arvo Ox123. Joten kun sanon string t saa s, että vain tarkoittaa kirjaimellisesti ottaa numeron in s, joka on Ox123 ja laita se Ox123. Tai kuvallisesti, jos olen sellainen abstrakti pois, että yksityiskohtia se on vaikutus kirjaimellisesti tekee tämän hyvin. Joten nyt muistelen viime viikolla, kun jatkoimme kapitalistisen T. I teki T kiinnike 0. No, T kiinnike 0, vaikka se on osoitin, voit käsitellä sitä ikään kuin se joukko, jossa neliö kiinnike merkintätapaa. Joten missä on T kiinnike 0? No, se on h. Ja niin kun käytämme Koodirivin, kaksi ylempää, joka on, että C type.h header-tiedosto, sinne se on julistettu. Olet hyödyntää tätä H. Mutta Tietenkin, että täsmälleen sama h, joka on sisällä s, niin sanotusti. Ja nyt olet muuttanut tai aktivoidaan sekä alkuperäisen ns kopio. Koska et ole tehnyt kopio siten, että ihminen haluaisi sen olevan. Joten mikä oli korjata täällä, vuonna copy1.c viime viikolla? Toiminnot, jotta voisimme todella kopioi merkkijono. Ja pohjimmiltaan, mitä meidän tehdä, jotta kopioida merkkijonon? No, tässä vihreä versio täältä olen aio tehdä sitä kohtalaisen alhainen. On todella toimii he voisivat auttaa tässä. Mutta alkeellisinta yksi, ja useimmat tuttu, ainakin pian tuttu, on seuraava - niin yksi ensimmäisellä rivillä koodia vihreä nyt. Sain rewrote s char *. Ei ole toiminnallista ero siellä. Sain heitti CS50 kirjasto ja Soitan sitä mitä se on, char *. Nyt piste, piste, piste, koska siellä oli Joissakin virheentarkistukset se ei ole mielenkiintoista puhua uudelleen. Joten nyt t on ilmoitettu. Sekin on char *. Joten piirsin vähän neliö ruutu kuin ennen. Mutta oikealla puolella, malloc, sanoimme on muisti jakaa. Joten jakaa joitakin murikka muistia. Ja kuinka monta tavua me oikeastaan haluavat jakaa, se näyttää? No, merkkijonon pituus s. Joten jos se hei se on olemaan viisi. Me sanomme h-e-l-l-o. Joten viisi tavua. Mutta sitten plus 1, miksi 1? 0 luonnetta. Jos emme jätä tilaa tämän kaveri me vahingossa luoda tilanne jossa merkkijono on h-e-l-l-o. Ja sitten seuraavan kerran getString on soitti ja kirjoitan, esimerkiksi David, D-a-v-i-d, tietokone on menossa ajatella, että s on oikeastaan h-e-l-l-o-d-a-v-i-d, koska siellä on Ei tauko välillä nuo sanat. Joten me tarvitsemme tauon. Joten emme halua viisi. Haluamme kuusi tavua. Ja tavut sanon. Mutta se on todella aika koko char. Teknisesti char on lähes aina yhden tavun. Mutta vain tehdä meidän koodi kannettava, niin sanotusti, niin että se toimii eri tietokoneiden vaikka ne saattavat olla hieman erilainen alla huppu, aion yleisesti sanoa koko char niin, että minun koodi aina toimi. Enkä tarvitse kääntää se vain koska voin päivittää tietokoneeseen tai käytä hieman eri alustalla. Joten minulla 6 kertaa koko char, joka sattuu olemaan 1. Joten se tarkoittaa malloc voisi anna minulle kuusi tavua. Mikä on, että todella tekee? No, minäpä roll back in time here missä olemme tarina. Joten jos menen takaisin tänne, olen ilmoittanut char * nimeltään t. Olen nyt nimeltään malloc kuusi tavua. Ja nyt aion tehdä nämä kuusi tavua kuten array aiemmin. Mutta en oikeastaan ​​tiedä mitä sisälle array. Jos getopt käy ilmi, että et voi luottaa siihen, että on olemassa jokin tunnettu arvo siellä. Se olisi voitu käyttää jotain muuten, jotkut muut, jotkin muut koodiriviä, että kirjoitit. Joten me yleensä kutsumme näitä roskat arvot ja piirtää niitä, ehkä, kuten kysymysmerkkejä, vain osoittaa, että me en tiedä mitä on todella olemassa. Ja se ei ole iso juttu niin kauan kuin me ovat tarpeeksi älykkäitä korvata ne roskat arvot numeroita tai merkkiä, että me välitämme. Joten tässä tapauksessa mitä aion tehdä? No, minun rivi koodia seuraava, minulla on neljä. int i saada 0, n saa merkkijonon pituus s. Niin tuttu silmukka. I on pienempi tai yhtä suuri kuin n, joka on yleensä yli. Mutta tällä kertaa se on tahallista. I + +, ja sitten yksinkertaisesti tehdä t kiinnike i saa s. Koska kuvani näyttää tältä at Tällä hetkellä tallennetaan t on osoite, että satunnaisia ​​kimpale muisti joiden arvot ovat tuntemattomia. Mutta heti kun minä t kiinnike 0, joka tuo minut tänne. Ja mitä päätyy saada laadittu siellä? Päädymme laskemisesta h. Koska se mitä on s kiinnike 0. Ja sitten sama asia e ja l, ja l, ja o. n, miksi menen läpi suuruudeltaan n? Koska 0 luonnetta. Joten vain olla selkeä, niin, jos olen itse poistaa kaiken nämä roskat arvot ovat ja sitten itse piirtää mitä odottaa, tämä on s kiinnike 1, 2, 3, 4, ja joka on liukuva uusi merkki. Ja nyt jos jatkoimme ohi pisteen piste, piste tässä oikea versio ja aktivoidut T kiinnike 0 haluan, ja tietenkin hyödyntää juuri tätä kaveri täällä, mikä käsitteellisesti oli lopulta maalin. Niin, että kaikki osoitin on. Ja olet käyttänyt niitä viikon nyt yhteydessä jouset. Mutta alla huppu he hieman monimutkaisempi. Mutta jos ajattelee niitä tässä kuvallisia muodossa ehdotan, että he todennäköisesti ole kovin pelottava kuin ne saattaa aluksi tuntua ensi silmäyksellä, erityisesti tällaisia ​​uusia rakenteita. Kysyttävää viitteitä, jouset tai merkkiä? Niin? Yleisö: Voitko mennä takaisin to [kuultavissa]? Kaiutin 1: Toki. Yleisö: Eli miten ihmeessä teidän viimeinen line, sinulla ei ole * t linja ja * s linjaa? Eikö sinulla ole viittaus - SPEAKER 1: Ah, todella hyvä kysymys. Miksi en ole * t ja * s? Koska lyhyesti, viime viikolla, kuten meidän swap-toiminto, en sanoa, että kun sinulla osoitin keino joka menet sinne kuten teimme fyysisesti lavalla, oli todella käyttää tähti operaattori. On käynyt ilmi, että tämä neliön kiinnike merkintätapa on mitä me kutsumme syntaktinen sokeria, joka on vain seksikäs tapa sanoen se lyhennetty merkintätapa mitä olet kuvataan. Mutta se on hieman selkeämpi. Ja riski tehdä tätä näyttävät enemmän monimutkainen kuin se tarvitsee, mitä todella tapahtuu täällä on seuraava - Jos sanon * t se tarkoittaa mennä osoite tallennettu t. Joten kirjaimellisesti, jos t on varastointiin osoite, joka h aluksi, * t keinoin mennä täällä. Nyt, mitä t kiinnike 0 tarkoittaa? Täsmälleen sama asia. Se on vain hieman enemmän käyttäjän ystävällinen kirjoittaa. Mutta en ole tehnyt vielä. En voi sanoa * t saa * s. Koska mitä tekisin niin? Olisin laskemisesta h, h, h, h, h koko juttu. Oikea? Koska * t on mennä osoitteeseen t. Mutta olemme silmukan sisällä. Ja mitä arvoa olen mukaa, tietenkin jokaisen iteraation? i. Mutta on mahdollisuus täällä, eikö? Vaikka tämä tuntuu se alkaa hieman kehittyneempiä kuin neliön kiinnike merkintätapa olemme käyttäneet jo jonkin aikaa - haluan Kumoa h muutos siellä - vaikka tämä on nyt saada hieman harrastaja, perusajatus, jos * t tarkoittaa tässä ja * t on vain Siirry osoitteeseen t. Mutta mikä oli osoite t? Määrä pidämme käyttäen? Kuten Ox456, nyt tuo sen takaisin vain sen vuoksi keskustelua. No, jos haluan saada aikaa E t string, haluan vain mennä, olennaisesti, 456. Tai pikemminkin, 457. Minun täytyy vain lisätä yhden. Mutta voin tehdä sen? Koska t, vaikka pidän piirustus se nyt nuoli, se on vain numero, Ox456. Ja jos minä lisätä yksi, että vähintään yleensä, jos lisään I, että voin itse saada tarkalleen missä haluan. Jos siis itse tehdä tämän - ja tämä on mitä nyt kutsutaan osoitin aritmeettinen - Voin poistaa tämän linjan. Joka on suoraan sanoen mielestäni selkeämpi ja hieman käyttäjäystävällinen lukea. Mutta tämä ei ole yhtä oikeaa. Tämä koodiriviä nyt käyttää osoitin aritmeettinen. Se sanoo mennä Seuraavat osoite - riippumatta alussa t on, joka on t plus i, joka aluksi on 0, mikä on hienoa. Koska se tarkoittaa, että alun t plus 1, ja 2, ja 3, ja niin edelleen. Ja samalla käsitellä s. Joten syntaktista sokeria tähän. Mutta ymmärtää, mitä todella tapahtuu alla huppu, Väitän, on todella hyödyllinen ja sinänsä. Koska se tarkoittaa, nyt siellä ei ole paljon enemmän taikaa tekeillä alla huppu. Siellä ei tule olemaan paljon enemmän kerrokset voimme kuori takaisin sinulle. Tämä on c. Ja tämä on ohjelmointi. Todella hyvä kysymys. Okei, joten tämä oli buginen Ohjelma Viittasin aiemmin. swap oli virheellinen. Jos ei näytä toimivan. Muista, että aivan kuten maidon ja appelsiinimehua - jonka aloitin juominen päivän esittelyn. Joten aivan kuten appelsiinimehu ja maitoa, meillä ei tarvitse käyttää väliaikainen muuttuja, tmp, pitää väliaikaisesti, jotta voisimme sitten muuttaa sen arvoa ja päivitä b. Mutta tämä toiminto, sanoimme, tai tämän ohjelma, jossa tämä toiminto oli kirjoitettu oli väärä ja virheellinen, miksi? Kyllä? Yleisö: [kuultavissa]. SPEAKER 1: Aivan, kun soitat swap - tai yleisemmin, kun soittaa eniten tahansa toiminto - jos argumentit, jotka toimivat ovat primitiivinen, niin sanotusti, ints ja merkkiä ja nelinpelin ja kelluu, asioita ilman tähteä, olet ohimennen kopio argumentti. Joten jos x on 1 ja y on 2, on menossa on 1 ja b tulee olemaan 2. Mutta he aikovat olla erilainen paloina bittien eri paloina muisti, jotka sattuvat olemaan tallentamiseen samoja arvoja. Joten tämä koodi on super täydellinen klo vaihtamalla ja b. Se ei ole hyvä vaihtokauppa - viime viikon esimerkki - x ja y. Koska uudelleen, he väärässä soveltamisalaan. Nyt, miten voimme edetä vahvistamisesta tästä? Meidän piti tehdä toiminto näyttää hieman rumempi. Mutta jälleen kerran, mieti mitä Tämä tarkoittaa vain sitä. Ja oikeastaan ​​haluan, johdonmukaisuuden, muuttaa yhden asian, joten se on identtinen mitä teimme. Kuten mainitsin viime viikolla, se ei väliä missä se menee. Itse asiassa, tyypillisesti voisitte laittaa tähden vieressä muuttujan nimi. Mutta mielestäni se olisi hieman helpompaa harkitsemaan * vieressä tietotyyppi siten se osoitin to int tässä tapauksessa. Joten mitä minä teen täällä? Sanon älä anna minulle int seurasi toinen int, kutsuen heitä ja b. Anna minulle osoite int. Anna minulle osoite toisen int. Soita osoitteet ja b. Ja sitten käyttää * merkintää alas Alla mennä jokaiseen näistä osoitteista tarpeen mukaan joko saada tai määrittää sen arvon. Mutta on poikkeus tästä. Miksi ei ole * vieressä tmp? Miksi en tee tätä, esimerkiksi? Se tuntuu minun pitäisi vain mennä ulos ja korjata koko juttu. Niin? Yleisö: [kuultavissa]. SPEAKER 1: En ole ilmoittanut TMP jonona. Joten tämä julistaisi, tässä tapauksessa TMP olevan osoitteen int. Mutta se ei ole aivan sitä mitä haluan, varten pari syistä. Yleisö: Et halua vaihtaa niitä. SPEAKER 1: Aivan, en halua vaihtaa mitään tmp. tmp on vain Viikon yksi kamaa. Haluan vain muuttuja säilyttää joitakin numero. En edes välitä osoitteet tällä hetkellä. Tarvitsen vain 32 bittiä tai niin tallentaa int. Ja haluan laittaa ne 32 bittiä mitä ei ole, niin sanotusti, mutta mitä on, vain olla tarkempi. Koska jos on osoite, * tarkoittaa mennä sinne ja saada arvon 1. Esimerkiksi viime viikolla esimerkiksi tai b: n tapauksessa saada arvoa 2. Joten mitä todella tapahtuu? Saanen piirtää kuvan täällä, että vain erottaa toisistaan ​​osa tänään. Mutta tämä näkyy edelleen jo jonkin aikaa. Tämä Väitän, mitä tietokoneen muisti näyttää, kun käytät ohjelma, minkä tahansa ohjelman. Kun suoritat ohjelman huipulla tietokoneen RAM - niin ajattele tämän suorakulmion, todella, kuin tietokoneen RAM tai muistia, kaikki 101 miljardia tavua sitä, kaikki kaksi miljardia tavua, kaikki kaksi gigatavua se, määrästä riippumatta sinulla on, nyt piirtää sen suorakulmio. Ja väitän, että kun ajat ohjelman kuten Microsoft Word tai Chrome tai mitään sellaista, bittien Microsoft tai Google kirjoitti - tapauksissa näiden ohjelmien - ladataan tietokoneen muistiin jossa he voivat suorittaa lisää nopeasti ja syötetään CPU, joka on aivot tietokone. Ja TAM ne varastoidaan hyvin top oman ohjelman, niin sanoakseni. Toisin sanoen, jos tämä on kimpale muistin, kun tuplaklikkaa Microsoft Word, bitit tulevat pois kiintolevyn. He saavat ladataan keskusmuistiin. Ja me työntää niitä huipulla Tämän suorakulmion käsitteellisesti. No, loput muisti on käyttää eri asioita. Huipulla näet alustaa tiedot ja uninitialize tietoja. Tämä liittyy siihen, että suurin osa, jossa vakioita tai globaaleja muuttujia että on arvot. Mutta enemmän niitä toisen kerran. Sitten on kasa, joka tulemme takaisin. Mutta alareunassa on osa, joka on erityisesti germane juuri nyt. Se on ns pino. Joten aivan kuten useimmissa tahansa D hall täällä kampuksella, sinulla on ne lokerot, jotka vain pinota päällekkäin, jolloin voit laittaa ruokaa ja vaikka mitä. Pino tietokonejärjestelmään on hyvin samankaltainen. Paitsi että tarjotin, koska käytämme ruokasalissa, tietenkin, on tarkoitettu tehdä asioita tarjottimet tai kehykset - niin soitamme niistä - tietokoneen muistia käytetään pitämään muuttujia ja arvoja. Joten mitä todella menee alla huppu? No, minäpä käännä näytön täällä. Ja katsotaanpa keskittyä vain alaosa hetkeksi. Jos tämä on pohjaosa minun tietokoneen muistiin se kääntyy pois, kun soittaa toiminto tärkein - joka tapahtuu suoraan sanottuna automaattisesti minulle - Saan kimpale muistia pohjasta minun RAM niin sanotusti. Ja tämä on tärkein on paikallisia muuttujia mennä. Siellä argc ja argv ehkä mennä, ja kaikki muuttujat I julistaa sisällä tärkein. He päätyvät alareunassa minun tietokoneen RAM. Oletetaan, että tärkeimmät puhelut toiminto kuten swap, kuten se teki viime viikolla? No, me lähinnä laittaa uusi lokero, uuden rungon, päälle minun murikka muistia. Ja aion kuvata tätä kuuluvat swap-toiminto. Nyt mitä sisällä swap? No, joka perustuu viime viikon ohjelmassa ja yksi Juuri näkemämme ote, sisällä swap runkoon, tai swap n tarjotin, ovat mitä muuttujia? No, ja b. Koska ne olivat sen paikallisen argumentteja, ja kolmas, tmp. Siis todella, että voisin tehdä tätä hieman puhtaammin. Anna minun mennä eteenpäin ja kumoa etiketti. Ja haluan väittävät, että tiedätkö mitä? on todennäköisesti menossa päätyä tänne. B ehdi tänne. Ja TMP aikoo päätyä tänne. Nyt, tilaus saattaa olla hieman erilainen. Mutta käsitteellisesti tämä on ajatus. Ja vain yhdessä, tämä on mitä soitamme swap rungon tai ruokailu-sali lokero. Ja samalla käsitellä tärkeimmät. Mutta en piirtää sitä. Mutta siitähän argc ja argv ja kaikki sen paikalliset muuttujat kuten x ja y voisi olla yhtä hyvin. Joten nyt miettiä, mitä todella tapahtuu kun vuorottelu. Kun vuorottelu, täytäntöönpanosta koodia Tämän olet ohimennen, että viallisista versio, ja b ja kopiot x ja y. Joten jos en nyt kiinnittää tähän ruudulla - täytyy saada paremmin tämän - joten tarina Sanoin itselleni oli tässä buginen versio, kun vuorottelu kulkee kirjaimellisesti ja b kokonaislukuina, mitä todella tapahtuu? No, mitä todella tapahtuu, on tämä. Anna minun mennä eteenpäin ja kumoa vain selvittää tilaa täällä. Joten tämä on minun tietokoneen muistiin. Joten jos minulla on esimerkiksi - todella tehdään se tällä tavalla - jos Väitän, että tämä on x, tallentamiseen arvo 1 aivan kuten viime viikolla. Ja tämä on y, varastointi-arvo 2 aivan kuten viime viikolla. Ja tämä on tärkein, kun vuorottelu, mikä antaa itse pääsy-ja b ja TMP, aion vaatia, että tämä on, ja tämä on 1. Tämä on b. Tämä on 2. Tätä kutsutaan tmp. Ja aluksi se on jonkin verran roskaa arvo kunnes olen itse tallentaa sen, joka on 1. Sitten menen eteenpäin ja muuttaa olla mitä? B: n arvo. Ja nyt minulla on kaksi täällä. Ja sitten me sanoimme b saa tmp. Jälleen aivan kuten järki tarkistaa, kolmas koodiriviä täällä on yksinkertaisesti tämä yksi, b saa tmp. Ja niin lopuksi, mitä teen? Menen eteenpäin ja muuttaa b olla mitä tahansa arvo tmp on, joka on 1. En koske TMP uudelleen. Mutta nyt ongelma on niin pian kuin swap palaa, koska se ei ole jakamassa takaisin jotain arvoa, ei ole paluuta lausuma nimenomaisesti se. Mitä todella tapahtuu? No, lähinnä kaikki tämä muisti - OK, ilmeisesti pyyhekumi tykkää vain yhtä sormea ​​kerrallaan - katoaa. Nyt todellisuudessa se ei ole menossa minnekään. Mutta voit ajatella sitä nyt kysymysmerkkejä. Koska se ei enää käytettäisikään. Ja mitään ei tehdä näitä arvoja. Joten, jos vihreä versio tämä koodi, mitä sen sijaan ollaan johdetaan swap? Joten osoitteet. Joten osoite, x ja osoite y. Jos siis uudelleen kertoa tämän tarinan viimeinen aikaa, ja olen itse piirtää swap uudelleen, mutta viitteitä, tämä on, tämä on b, ja tämä on TMP, mikä on todella tallennetaan tämän vihreän versio minun koodi, jos olen ohimennen osoitteissa? Se tulee olemaan osoitin x. Jotta voisin piirtää nuoli. Mutta katsotaanpa käyttää samaa mielivaltainen Esimerkiksi kuten aiemmin. Sanotaan, että tämä on jotain Ox123. Ja tämä tulee olemaan Ox127 koska se on neljä tavua pois, koska se on int, joten Ox127. Ja vielä, otan joitakin vapauksia numeroiden kanssa. Ne ovat paljon pienempiä kuin mitä ne olisivat todella ja eri järjestyksessä. Mutta se miten kuva on nyt erilainen. Mutta kun käytän tätä vihreää koodia enkä int tmp saada *. * Keino tehdä seuraavat, ota puuttumaan se on ja mennä sitä, joka on 1. Ja sitä minä sitten laittaa tmp. Samaan aikaan seuraavan rivin koodia täällä * saa b, mitä se tarkoittaa? No, *, joten täältä saa * b, mikä tarkoittaa sinne. Ja se tarkoittaa laittaa arvoa siellä. Viimeinen rivi koodia sanoi yksinkertaisesti * b saa tmp. Joten b sanoo mennä sinne ja se korvataan TMP, joka tässä tapauksessa on menossa on jälleen 1. Ja siksi vihreä versio meidän koodi toimii, kun taas punainen versio ei koskaan. Se kaikki vain pohjimmiltaan kyse siitä, miten muisti on onnistunut ja missä se on todella laitettu tietokoneen RAM. Ja nyt se on yksi niistä asioista, että pino ei ole aikaisemmin käytetty. Kysymyksiä layout? On viitteitä? Tai swap? Okei, joten malloc, muistaa, teki jotain tällaista. Tämä oli erittäin yksinkertainen esimerkki. Ja tämä oli yksi, joka Binky esitteli meidät, vaikkakin varsin nopeasti, lopussa luokan. Perhana, siellä mennään taas. Joten muistaa, että tämä oli esimerkki siitä, että Binky esitteli meidät, vaikkakin jokseenkin nopeasti lopussa luokan. Ja tässä käytimme malloc todella toisen kerran. Koska ensimmäistä kertaa käytimme sitä luoda tarpeeksi RAM, käyttää riittävästi RAM tallentaa merkkijonon. Tällä kertaa Binky pidetään yksinkertaisina. Joten se tallentaa vain int, ilmeisesti. Ja se on täysin kunnossa. Se on vähän outo, suoraan sanottuna, että käyttää malloc jakaa yhden int. Mutta kohta Nickin claymation oli oikeastaan ​​vain kertoa tarinan siitä, mitä tapahtuu tai ei tapahdu, kun voit kohdella huonosti muistin. Joten tässä tapauksessa, tämä ohjelma teki muutamia asioita. Ensimmäisessä tapauksessa täällä, se ilmoittaa osoitin kutsutaan x int. Sen jälkeen julistaa osoitin kutsutaan y int. Sen jälkeen myymälää x, mitä? Joku nyt. Mikä saa säilyttää x mukaan kolmannella rivillä tätä ohjelmaa? Yleisö: [kuultavissa]. SPEAKER 1: No, ei aivan tavua, per sanoa. Tarkemmin sanottuna nyt. Mikä saa säilyttää x? Osoite, Taisin kuulla sitä. Joten mitä malloc palauttaa? malloc behaviorally kohdentaa kimpale muisti. Mutta miten se antaa sinulle pääsyn sen? Se palauttaa mitä? Osoite ensimmäinen tavu vuonna kimpale muisti. Nyt tämä on erittäin yksinkertainen. Se on vain yksi tavu, joka tarkoittaa käsitellä saamme takaisin on osoite koko juttu. Joten tallennetaan x sitten on osoite Tämän kimpale muisti. Samaan aikaan, mitä tapahtuu seuraavaksi? Joten oikeastaan, mennään eteenpäin ja vetää tätä todella nopeasti. Joten jos menemme yli näytön täällä soitamme tätä int * x ja int * y aikoo tehdä mitä minulle? Väitän, että se on juuri menossa tekemään jotain tällaista ja kutsua sitä x, ja Tämän ja kutsua sitä y. Samaan aikaan kolmannen rivin koodia on menossa jakaa koko int, joka sattuu olemaan - pahoillani, jos sanoin yksi ennen Tarkoitin yksi int - neljä tavua tyypillinen tietokone. Ainakin CS50 laitteen. Joten tämä tulee kohdentaa se, kuka tietää? Jossain täällä. Ja tämä on tallennettu jossain osoite Ox, kuka tietää? Mutta mitä menossa takaisin on, että osoite. Mutta me tehdä tätä kuvallisesti kuten juuri nuoli niin. Nyt seuraavalle riville * x saa 42. Mitä * x tarkoittaa maallikon termein? Vain mennä sinne. Mene osoitteeseen. Tai toisin sanoen, noudata nuoli ja laittaa 42 siellä. Mutta sitten tapahtui jotain kamalaa to Binky, eikö? Muista, että linja viisi täällä, * y saa 13 todellakin epäonnen luku, teki sen, mitä meille? No, * y keinoin mennä sinne. No, tämä ei ole annettu arvo vielä, eikö? Koodia ei ole y on alustetaan mitään. Olimme x alustetaan osoitteeseen. Mutta y julistettiin ylös. Mutta sitten puolipiste, ei arvoa todella laittaa se. Joten se on reilua kutsua tätä roskat arvo. Kuka tietää, mitä siellä on? Se on jäänteitä bittien käytettiin joidenkin edellisen rivin koodia minun ohjelma. Joten jos sanon mennä sinne, tämä on kuin, Minulla ei ole aavistustakaan, missä tämä nuoli on ehdi. Ja silloin normaalisti saada segmentointi vika. Jos vahingossa dereference, niin puhua, tai mene osoitteeseen, joka ei ole todella oikeutettu osoite, huonoja asioita tapahtuu. Ja se mitä tapahtui ajatella Binky. Niin muistaa, että tarina, joka Nick oli kertoo täällä oli sama idea kuin mitä Olen piirretty illuusion liidulla taululle siellä. X ja Y on ilmoitettu. Sitten jaetaan koko int ja varastoida sitä x. Sitten seuraava rivi teimme * x. Tämä oli Nickin taikasauva ja dereferencing. Että laittaa 42 muisti huomautti x. Mutta tämä on, jos asiat meni pieleen. Oikea? Yritimme dereference y. Mutta y oli joitakin vääriä arvo, eikö? Että nuoli vasenta alakulmaa kulma, ei ole todella osoittaa mitään. Se on tavallaan tekee mitä teki tässä hallituksessa. Niin pahoja asioita tapahtuu, segmentointi vika tai Binky vika tässä tapauksessa. Mutta jos me sitten korjata, että tekemällä x saa y miten tarina muuttuu? No, jos en x saa y, joka on käytännössä samaa kuin sanomalla mitä tämä on, Ox-jotain tulee olemaan sama täällä, Ox-jotain. Tai kuvallisesti me vetää nuolen. Joten tässä laudalle Binky, kanssa seuraavan rivin koodi, * y tarkoittaa sinne. Missä on? Se tarkoittaa tänne. Ja kun me päivittää sen olevan 13 se vain liittyy menossa ja kirjallisesti 13 täällä nyt. Joten ehkä ole täysin suoraviivaista ensi silmäyksellä. Mutta kertaus ja käyttää samaa ammattikieltä että Binky käytti täällä, niin kaksi ensimmäistä jakaa viitteitä, x ja y, mutta ei pointees. Ja pointees ei ole yleisesti käytetty termi. Mutta osoitin ehdottomasti on. Mutta se mitä on korostettava AT Binky n nimikkeistön. Tämä seuraava rivi, tietenkin, jakaa int pointee. Joten kimpale muisti - kuten Piirsin päälleni oikealla puolella - ja joukko x on yhtä suuri osoittamaan sitä. Tämä dereferences x tallentaa 42 muistin, että se on suunnattu. Ja sitten tämä tietysti oli huono asia. Koska y ei viittaa klo vielä mitään. Tämä korjaa sen. Joten tämä on vielä buginen ohjelma. Juuri siksi olemme puhaltaneet koodia rivi riviltä ja sanoi, no, anna sen kaatua siellä. Se on huono asia. Kertoimet ovat ohjelman juuri menossa keskeyttää kokonaan tuohon linja. Mutta jos olit poistaa kaatui linja ja korvata sen kaksi viimeistä Linjoissa annat - käyttäen osoitin tehtävän - y viitata x kohdaksi t. Ja sitten dereference y erittäin turvallinen tapa. Joten jos tämä jättää meidät? No, osoittautuu, että alla huppu vuonna CS50 kirjasto, osoittimet ovat käytetään koko. Ja me todella alkaa kuoria takaisin että kerros ennen pitkää. Mutta se muuttuu myös lauseke jotkut teistä saattavat tuntea, erityisesti mukavampaa, on todella, että on erittäin suosittu verkkosivuilla tai ylivuoto, näinä päivinä. Mutta tämä on itse asiassa hyvin tekninen merkitys. Tiedämme nyt, mitä pino on. Se on kuin pino tarjottimia sisällä ruokasalissa. Tai sisällä tietokoneen muisti its nämä kehykset , joita käytetään toimintoja. No, käy ilmi, että tämän takia hyvin yksinkertainen täytäntöönpano muistin ja kehykset ns pino, voit itse hallita tehty atk-järjestelmää melko helposti. Voit murtautua järjestelmään, jos ihmiset kuten me ole kirjoittanut meidän koodi erityisen hyvin. Jos ihmiset kuten meistä käyttävät paloina muistia tai käytä ryhmät - vielä yleisemmin - mutta joskus unohda tarkistaa rajat meidän array kuten ehkä on itse joskus, ja iteroidun liian pitkälle ohi lopussa array. Parhaassa tapauksessa ohjelma saattaa vain kaatua. Segmentointi vika, jollaisia kiusallista. Ei suuri, mutta se ei ole välttämättä erittäin huono asia. Mutta jos ohjelma on itse asiassa todellinen käyttäjien tietokoneissa, jos se on käynnissä verkkosivuilla, että todellinen satunnaisia ​​ihmisiä Internetissä lyövät, kerroit ihmiset aiheuttaa huonoja asioita koodi on yleensä ole hyvä asia, koska se merkitsee mahdollisuutta ottaa tietokoneen hallintaansa. Ja tämä on menossa katsomaan hieman arvoituksellinen. Mutta ajattelin pelästyttää sinua Viimeinen esimerkki tästä. Tässä esimerkki koodin. Ja siellä on hyvä Wikipedia artikkeli, joka kävelee Tämän yksityiskohtaisemmin. Minulla on tärkein pohjassa kutsumus foo, ohimennen argv 1. Ja se on vain niin, että voit suorita ohjelma ja siirtää mielivaltainen tulo. Ja sitten foo on julistettu ylös niin että hyväksytään merkkijono tai enemmän Juuri, char *. Sen jälkeen julistaa joukko merkkiä. Soita se puskuri, yleisemmin, koosta 12. Joten 12 merkkiä mahtuu sisälle Tämän array kutsutaan c. Ja sitten se käyttää tätä uutta toimintoa, joka on uusi, mutta ei ole vaikea ymmärtää, muisti kopioida. Se kopioi muistin baari, joka oli muuttuja aiemmin n riippumatta Käyttäjä kirjoitetaan argv 1. osaksi c. Kuinka monta tavua? Merkkijonon pituus bar. Eli toisin sanoen, jos käyttäjä on h-e-l-l-o enter, merkkijonon pituus Hello on viisi. Joten viisi näistä tavua on menossa kopioidaan array nimeltään C, joka on koko 12. Mutta mitä käyttäjä on paljon pidempi sana, joka on 13 merkkiä tai 14 merkkiä tai 100 merkkiä tai enemmän? Jos he aikovat mennä? No, runko, että tarjotin in dining-sali pino, he aikovat mennä sinne. Ja se vain menee alkaa päälle muita juttuja, joka on jo on, että pino, täynnä pino, niin sanoakseni. Joten kuvallisesti, ajattele sitä tällä tavalla. Tämä on vain värikäs versio kuva olemme piirustus. Alareunassa, sanokaamme, on tärkein. Ja päälle, mitä näet nyt on runko, värikoodatut nyt, funktio foo. Mutta mitä mielenkiintoista täällä foo on, että täällä on sen runko. Joten se on laadittu aivan kuten minä teki vaan vaaleansininen. Ja nyt tämä on c kiinnike 0 menee. Ja tämä on c kiinnike 11. aikoo päätyä. Toisin sanoen, se sattuu olla edustettuina neliö. Mutta jos vain pitää plopping tavua alas - tai merkkiä - he aikovat lopettaa up 0 mitattu kokonaan ylös 11, koska se on 0 indeksoitu. Mutta missä on 13 merkkiä ehdi? Missä 14th? Missä 50-merkin ehdi? Se tulee pitää menossa alaspäin. Sillä vaikka olemme kiinnittäneet kuva pino kasvaa, osoitteet, se kääntyy pois, mennä pieni osoitteita, pieni osoittimet, iso osoitteita. Niin se vain pitää menossa ylös ja ylös. Joten jos käyttäjä on Hei, se on hienoa. Ei vika, ei ole ongelma, kaikki on turvassa. Mutta jos käyttäjä on mitä jaamme soita kontradiktorista koodi, jota edustaa yleiseltä, hyökkäys, hyökkäys, hyökkäys, hyökkäys, mitä voi tapahtua? No, jos kaikki tulo, että käyttäjä kirjoitit ei ole vain ystävällisiä tai loukkaavaa merkkijono. Se on oikeastaan ​​merkkijono että jos koottu se, se todellisuudessa on koodi. Ehkä se koodi, joka poistaa kaikki tiedostoja kiintolevyllä tai lähettää roskapostia tai jotain. Huomaa, että mitä Tärkeintä tässä on, että jos pahis sai onni korvata punainen kimpale muisti - jota en piirtää kuvani mutta Tämän Wikipedia kuva täällä on - sen ns palautusosoite. Kun ruoka palaa, kun swap palaa, miten tietokone tietää mennä tänne tänne? Tai Tech segmentin yläpuolella, miten se tietää mennä swap koodi - 0: n ja 1: n jotka muodostavat swap - Takaisin? On ns paluuosoite tallennetaan saman pinokehyksen puolesta Sama kahvila lokeroon. Joten jos pahis on tarpeeksi fiksu laittaa hyökkäys koodi, hyökkäys koodi, hyökkäys koodia, ja saada onni - usein yrityksen ja erehdyksen kautta - ja korvata, että punainen paluuosoite, osoitteen ja huomautus hyvin alkuun. Huomaa 0835C080. Se on kirjoitettu takaperin ylös varten syistä me ehkä uudelleen. Tämä on se numero. Joten jos pahis saa onni tai on fiksu korvata punainen riistää muistia osoite koodi, joka hänellä on jotenkin ruiskutetaan tietokoneen, arvaa jonka koodia aiotaan palauttaa heti foo tehdään täytäntöönpanosta? Pahis koodi. Joten tämä hyökkäys koodi, AAA, jälleen, ehkä lähettää roskapostia, voi poistaa kaikki tiedostot kiintolevylle. Mutta sitähän todella pinon ylivuoto on, tai puskurin ylivuoto, tai puskurin ylivuoto hyökkäys. Ja se on uskomattoman, uskomattoman yhteinen Tämän päivän kirjoitettuja ohjelmia C, C + +, ja jopa joitakin muita kieliä. On pelottavaa huomata, hyvitämme päättyy vitsi. [Naurua] Nähdään keskiviikkona. Seuraavassa CS50 - Joten olen kaikki ulos levyn lamput tänään, mutta Odota, rasvaton maito, puoli puhelin kirja, appelsiinimehua että join tänään. USB-kaapeli, jakoavain. [Musiikki soi]