[Muusika mängib] DAVID J. Malan: Olgu see CS50 ja see on algus nädalal viis. Nii et täna alla oma istmepadjad, te ei leia midagi. Kuid eelkõige, siis tuleb leida need, väike märgiks meie tunnustust kõik tööd, et paned Mängu viieteistkümne. Lihtsalt eemalda väike ring alt alustada mängimist ülejäänud klassile. Nii tuletavad meelde, või tead, et probleem määrata neli, mis läks sel nädalavahetusel, hõlmab kirjalikult teise mängu. Aga seekord see hõlmab kasutades tegeliku graafilise kasutajaliidese, ei tekstiline liides nagu Mäng viieteistkümne oli. Ja mäng, mis meid ees ootab sind, kui olete seni näinud järgmisena tundub natuke midagi sellist. Ma lähen minema mu terminal aken siin GDB. Ja ma lähen edasi minna ja käivitada personal lahendus, mida saab kasutada pärast töötab uuendus 50, nagu tavaliselt. Aga ma lähen panna see veidi saladus režiimis veidi lihavõttemuna niinimetatud Jumala režiimi poolt pannes Jumala argv1. Ja ma pean järgima oma suunas, töötab see minu oma probleem määratud kataloog. Nüüd näed täisversioon on mäng Breakout. Tegelikult ei ole see-käed režiimis. Nii et see on tegelikult - wowed kuigi võite olla - üsna triviaalne rakendada Jumala režiimi Breakout erinevalt Game viieteistkümne, mis mõned teist võib-olla tegeleda jaoks häkker väljaanne. In Breakout piisab Jumalasse mode lihtsalt seda, mida, intuitiivselt koos mõla? Lihtsalt see on võrdne, olenemata horisontaalasendis on mänguajast. Ja nii kaua, kui te seda teha lockstep palli liigub see mäng kunagi, kunagi, kunagi ei pane palli ja sa võidad iga kord. Aga sel nädalal häkker väljaanne seal on rohkem kui lihtsalt Jumal režiimis. Seal on mitmeid teisi funktsioone. Neist laserid. Nii et kui sa tõesti kärsitu te saab alustada shooting kehtestatakse tellised ja mõned teised. Ja neile, kes tahaks kalibreerida standard versus häkker väljaanne, ma näen, et sel nädalal Häkker väljaanne tahtlikult on natuke rohkem sooritatav, ütleme, kui Jumal režiim oli mäng Viisteist. Nii et kui te otsite venitada ja otsite mõningaid täiendavaid lõbus tunnused ei sukelduda kui huvi. Nüüd enam praktiliselt, lubage mul juhtida välja üks asi samuti. GDB, mis mõned teist ei pruugi olla veel puudutanud isiklikult, mis on hea. Aga nüüd on tõesti aega harjuda sellele ja mugav selle tööriistaga sest see teeb teie elu palju lihtsam, tõesti. Per Rob loeng GDB paar nädalat tagasi, meenutavad et GDB on silur. See on vahend, mis võimaldab teil näidata oma programmi, kuid kasutada seda samm-sammult, line realt, nii et saate tuhnima, nii et sa näed asju juhtub nii, et saad välja printida väärtused muutujatele. Lühidalt, see annab sulle nii palju energiat kui printDef teeb. Nüüd küll liides on üsna kauge. Must-valge teksti liides enamasti. Käsud on mõnevõrra raske meelde jäävad. Aga kuigi see võib teid pool tund, tund, panna, et kohe algul investeeringu aega arvesse seda, usu mind. Kindlasti poolt semestri lõpuks ta päästab sa suurusjärgus rohkem aega kui. Nii varakult nädal sukelduda sisse Ja nii Breakout, tean, et sa seda teha nii kaua, kui teil on jaotus kood või oma koodi käimas oma PST4 kataloog. Tea, et sa võid joosta gdb. / Breakout. See saab avada aken niimoodi. Annan ennast rohkem ning terminali aknas. Ja siis ma lähen edasi minna ja teha, see ei ole lihtsalt käivitada. Ma lähen kõigepealt kehtestada murdepunkt Meenuta, mis võimaldab teil pausi täitmist konkreetses kohas. Lihtsalt, et hoida asjad lihtsad Ma lähen murda real üks lihtsalt kirjutades number üks. Lubage mul tegelikult uuesti avada see aken sest see muutub natuke väike seal. Niisiis, mida ma nüüd teen siin kui ma avada oma terminali akna. Tule, seal läheme. Nüüd, kui ma lähen tagasi dropbox, PST4 ja joosta gdb. / Breakout sisestada teate Ma lähen murdma seada murdepunkt real üks. Ja nüüd ma lähen ees ja tüüp joosta. Ja kui ma seda teen, märkate midagi tundub juhtuda. Ei ole pop üles. Ei ole graafiline kasutajaliides veel. Aga see on mõistetav, sest ma olen sõna otseses mõttes real üks minu programmi. Ja teate, et ma olen kiire edastamise eriti nüüd, et 62, sest kõik stuff ülaosas see fail on asjad kommentaarid ja konstandid ja ebahuvitav stuff nüüd. Nüüd ma olen sees peamine, tundub, real 62. Ja see on vaid jaotus kood, tagasivõtmist. Kui ma avada see üles minnes samamoodi minu rippmenüüst kasti kataloog sisse PST4, arvesse breakout.c. Ja kui ma kerige alla ja alla, ja andke minna ja lülitage minu rida numbreid. Mida ma näen, kui ma kerige liin 62, on täpselt see joon, mis oleme peatatud poolt. Nii et see rida siin, 62, on kus me parasjagu olema. Nüüd on GDB, kui ma minna ja kirjuta nüüd järgmine, sisesta see läheb täitma, et liin. Ja voila, meil niinimetatud g akna. Kui võõras mida GWindow on, ärge muretsege. Spec tutvustab teile seda, kui samuti mitmed ülevaadet videod varjatud spec. Aga nüüd teeme seda veidi põnevamaks. Lubage mul liikuda see aken üle kõrvale natuke. Las ma teen akna veidi suurem nii et ma ei näe enam. Ja nüüd lubage mul minna ja teha järgmisena uuesti. Ja seal on mu tellised. Kui ma tüüp järgmine kord nüüd näen palli. Ja kui ma kirjuta järgmine kord nüüd näen mõla. Ja õnneks see gedit ei ole tõesti koostööd, näidates mulle kõik, mida ma tahan. Aga nüüd, kui ma järgmine kord, Järgmine kord, ma olen lihtsalt kinnitati, et mõned muutujad. Ja ma ei saa trükkida ükskõik need kutid välja. Prindi tellised, prints elu. Ja nüüd, kui ma jätkuvalt tegema Järgmiseks märkate, et ma tulen sees, et loop. Aga kood läheb täita täpselt nii, nagu ma oodata. Nii et kui ma tabanud seda funktsiooni, oodake jaoks Vajuta, et see saab teha Ta sõna otseses mõttes, et. Nii et ma tundus, et on kaotanud kontrolli programmi üle. GDB ei anna mulle veel kiire. Aga ärge muretsege. Mine minu mäng, kliki kusagil. Ja voila, nüüd suundub line 86. Nii et taas, see on hindamatu lõppkokkuvõttes silumiseks probleeme. Kuna saate sõna otseses mõttes samm teel oma koodi, print asjad ja palju, palju, palju muud. Aga nüüd, need vahendid üksi peaks sulle päris palju. Nii et me oleme loomulikult võttes pilk kell Graphics nüüd, äkki. Ja nüüd meie maailm muutub vähe põnevamaks. Ja sa tead, võib-olla mõnest videod veebis, et meil on need lühikesed püksid, mida olen jälginud osana probleem komplekti. Ja nad on tulistati sihilikult, valgel taustal. Ja mõned neist on õpetamise Fellows joonistus mõned teksti ekraan, mis on dubleerivad küljel neid. Aga muidugi, see ei ole kõik, et huvitav reaalses maailmas. See on lihtsalt saalis koos suur valge ekraan ja taustaks. Ja meie hämmastav tootmise meeskond sorteeri ning teeb kõik ilus pärast tegelikult koristuse läbi või kattes midagi me teeme või ei taha. Nüüd lihtsalt motiveerida sel nädalal ja tõesti, kus võid minna, lõpuks, koos arvutiteadus. Mitte ainult pärast probleemi, neli. Aga pärast teise kursuse või kogu Õppekava see on hämmastav, mida saate teha nendel päevadel poolest graafika eriti. Mõned võite näinud seda voolab ümber online. Aga ma mõtlesin, et ma näitan sulle, vaid paar minutit, pilguheit mida infotehnoloogia ja mida CGI, arvutigraafika saab teha nendel päevadel tuttava laulu ja võib-olla filmis. [MUSIC - LANA DEL RAY, "Noor ja ilus] SPEAKER 1: See on lihtsalt natuke hämmastav, ehk kuidas kõikjal - [APLAUS] SPEAKER 1: Ma lihtsalt alla laadinud. Aga see on tõesti hämmastav, ma arvan, just kuidas kõikjal tarkvara ja kood ning vahendeid, nagu see tegelikult on. Nii et maitse suunas kus saab minna. Oh, ei rohkem Appliance täna. Noh, see on tegelikult traagiline ajastus antud hetkel ma lihtsalt püüdnud teha. Olgu, lähme käivitada Fusion uuesti. Tuleta mulle hiljem meelde. Olgu, ja sa oleks saanud emaili kõrvale kui sa ei saada teate sellist. Olgu, meelde tuletada, et eelmisel nädalal hakkasime Tõmmake see hiljem tuntud kui string. string meenutab andmetüüp, mis on deklareeritud CS50 raamatukogu. Ja see osa koolitusest veljed mis hakkab nüüd startida. See oli kasulik mõiste varakult. Aga nüüd see läheb aina rohkem huvitav ja võimsam tegelikult näha, et all kapuuts, string on just see, kas me ütlesime? Jah, nii see on nn char *. Ja * seal tähendab, et seal on mingi aadress kaasatud. Ja kui te ütlete, char * sa tähenda ainult muutuja, mille andmetüüp on pointer nüüd. Asjaolu, et seal on täht seal tähendab lihtsalt, et teil on, mis kuulutab niinimetatud pointer. Ja et osuti läheb ilmselt salvestada aadressi, on Loomulikult char. Nüüd miks seda mõtet? Noh, mis on string all kapuuts? Noh, juba mõnda aega oleme rääkinud et string all kapuuts lihtsalt h-e-l-l-o, näiteks. Aga oleme rääkinud seda on sisuliselt massiivi. Ja array siis vaadata veidi rohkem nagu see, kus iga asumist hammustada. Ja siis me oleme öelnud, et seal on midagi erilist siia tagasi, Kenoviiva 0 või null terminaator. Nii et kõik see aeg, see siin on string. Aga tõesti, string tegelikult aadress. Ja aadressid, nagu me näeme, on sageli prefiksiga 0x kokkuleppeliselt. Mis 0x tähistamiseks? Kas keegi teab? Nii et see tähendab lihtsalt, kuueteistkümnendsüsteemis. Nii võite meenutada, tegelikult PST 1, ma usun, üks soojenduseks küsimused tegelikult küsiti heksadesimaalilukuja lisaks binaarsed ja kohaga. Ja motivatsioon on see, et koos kuueteistkümnendsüsteemis olete 16 numbrit teie käsutuses. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, millele järgneb poolt, b, c, d, e, f. Ja kui loete kõik need üles, sa saad kokku 16. Nii et see on erinevalt kohaga, kus meil on 10 numbrit, 0 kuni üheksa. See on erinevalt binaarne kus meil on lihtsalt 0 ja 1 vahel. Aga lõpus päeval saad lihtsalt esindavad samu numbreid, kuid mõnevõrra erinevalt. Ja kuueteistkümnendsüsteemis on levinud, sest nagu selgub - ja me näeme seda hiljem muidugi - isegi kui me veebi programmeerimine kontekstis HTML ja värvikoodidega, kuueteistkümnendsüsteemis on kena. Sest iga numbri, selgub, esindab neli bitti suurepäraselt. Nii see lihtsalt selline read kenasti kui me lõpuks näha. Nii et see võib olla Ox123 või midagi sellist, mis tähistab aadress 123 Sisimas minu arvuti mällu. Aga muidugi, mõned probleemid sest selle aluseks olevad rakendamist. Ja meenutada, et võtsin torkehaav at rakendatakse funktsiooni niimoodi - võrrelda kriips 0 dot c eelmisel nädalal, et kuigi see nägi välja nagu see oli õige, see lihtsalt ei saa võrrelda kaks stringi õigesti. Olen visata peamine, ja ma olen visanud ära kommentaarid lihtsalt keskenduda kood, mis on huvi siin. Ja see on punane, sest see on lollakas. Mis põhjusel? Noh, ülaosas seal kui ma kuulutatud string, mis tegelikult toimub all kapuuts? Noh, lase mul minna üle sõeluda siin ja juhtida seda. Nii et ma kuulutatud jällegi string s getString. Ma lähen edasi minna nüüd ja juhtida s, mida see tegelikult on. See saab olema ruut siin. Ja ma väita, et see on 32 bitti. Vähemalt see tavaliselt on, vähemalt CS50 Seadme palju arvuteid. Ma kutsun seda s. Aga nüüd meelde tuletada, et me nimetatakse getString. Nii getString naaseb, muidugi string. Kui kasutaja liigid h-e-l-l-o sisestada string Tema saab tagastada. Ja see string, kui me just ütles, lõpeb kuskil arvuti mällu längkriipsuga 0 lõpus. Ma joonistan selle nagu massiivi - või külgnevas ploki tähtedega - et see tegelikult on. Ja nüüd, mis on getString tegelikult tagasi? Mis on getString on tagasi kõik see aeg? Noh, ütleme, et nädala jooksul enne, ta tagastab stringi. Aga tehniliselt, mida teeb GetString tagasi ilmselt? Publik: aadress. SPEAKER 1: aadress. Täpsemalt siis tagastab aadress Kõige esimene hammustus, mis see on. Ma muudkui kasutades üks, kaks, kolm sest see on mugav. Ta naaseb aadressi esimene märgi string. Ja me ütles eelmisel nädalal, et mis on piisav. Kuna meil on alati võimalik aru saada, kus stringi lõppu lihtsalt iterating üle, võib-olla koos jaoks loop või samas loop või midagi sellist et lihtsalt otsin "Kenoviiva 0", eriline valvur iseloomu. Ja siis me teame, et string juhtub olema pikkus - sel juhul - viis. Nii tehniliselt mida getString ei on ta naaseb Ox123 käesolevas asjas. Ja tehniliselt mis siis juhtub, on et me salvestada, sees s, Ox123. Lõpus päeval, kuigi see on uus mõiste, viiteid, et nad on lihtsalt muutujad. Aga need juhtuvad salvestada bitti, mis kollektiivselt esindama aadress. Nii tehniliselt kõik need saab salvestatud s on Ox123. Aga me inimestel - sealhulgas täna edasi - tõesti ei kavatse hooli, tavaliselt, milline tegelik aadress on mõne tüki mälu. See on lihtsalt madal üksikasjalikult olema intellektuaalselt huvitav. Nii et ma lähen tagasi võtta seda. Ja selle asemel, rohkem kõrge tase, lihtsalt öelda, et kui me räägime viiteid Ma lihtsalt teha rohkem kasutajasõbralik nool, mis annab edasi Sama idee ja teesid ära andmed, mida tegelikult aluseks aadress. Nüüd kui me läheme tagasi kood, mida juhtus eelmisel nädalal, kui meil on string t võrdub getString? Noh, kui ma jälle kirjuta tere seekord ma lähen teise tüki mälu. h-e-l-l-o Kenoviiva 0. Aga kuna ma helistasin getString teine ​​kord - ja ma tean, et see vaatlemisel lähtekoodi getString - isegi kuigi see on kokkusattumus, et Tema oli kirjutada kaks korda, getString ei ole läheb püüdma optimeerida ja olla tark. See on lihtsalt hakka teise tüki mälu arvuti, mis on saab olema teine ​​aadress. Olgem omavoliliselt öelda 456. Ja siis see läheb tagasi? See läheb tagasi 456 ja hoidke seda t. Mis siis tegelikult toimub, on Vasakul pool on mul teine ​​patakas mälu, 32 bitti tavaliselt. Ja seal on minemas Ox456. Aga jälle, ma ei ole huvitatud nende eriti numbreid enam. Ma lihtsalt abstraktselt joonistada nagu nool. Nii et see on nüüd uus selgitus. Aga see on täpselt sama mõte, mis on juhtunud kogu selle aja. Ja nii põhjus siis, et see esimene versioon võrdlusrežiim oli lollakas viimane nädal on miks? Kui te seda teete, kui s võrdub võrdub t mida sa tõeliselt all kapuuts võrrelda? Sa võrdled aadresse. Ja just intuitiivselt selge, Ox123 ei kavatse võrdne Ox456. Need numbrid, need bitti on lihtsalt erinevad. Ja nii järjepidevalt, eelmisel nädalal ta ütles kirjutad erinevaid asju, isegi kui sõnad olid sõna-sõnalt sama. Nii et me määrata see. In üldarusaadavat mõttes, mis oli määrata? Publik: Kasutage funktsiooni. SPEAKER 1: kasutage funktsiooni. Või tähed on kindlasti kaasatud kuid kasutada funktsioon teha mida? Publik: Et võrrelda stringe. SPEAKER 1: Kui soovite võrrelda stringe. Seega põhiprobleem oli siin et ma just arvestades kvaliteeti stringid kindlaks võrreldes nende aadressid. Ja ilmselt see on lihtsalt loll nüüd kord saate aru, mis toimub all kapuuts. Et tõeliselt võrrelda stringe, kas nad võrdsed nii, et inimeste kaaluks kaks stringid on võrdsed meil on vaja võrrelda neid tegelane tegelane iseloomu. Nüüd ma oleks võinud teha see väga igavalt. Aga lähedalt, et me oleme kasutades jaoks silmus. Ja lihtsalt võrrelda s sulg i vastu t sulg i. s sulg i pluss 1 vastu t sulg i pluss 1, ja nii edasi, sees mingi loop. Ja kui ma kohapeal kõik kaks märki, mis erinevad või kui ma mõistan, et ooh, s lühem kui t või enam kui t Võin kohe öelda vale, nad ei ole sama. Aga kui ma saan läbi s ja t ning öelda sama, sama, samasugune, sama, sama, lõpuks kumbagi, ma ei saa öelda, Tõsi, nad on võrdsed. Noh, õnneks aastat tagasi keegi kirjutas, et kood meile. Ja nad kutsusid seda StrComp keelpilliorkestrile võrrelda. Ja kuigi see on natuke counter intuitiivne, StrComp 0, kui need kaks stringid, s ja t on samad. Aga ta naaseb negatiivne väärtus, kui s peaks tulema enne t tähestikuliselt või positiivne väärtus, kui see peaks tulema pärast t tähestikulises järjekorras. Nii et kui sa kunagi tahad sortida midagi, selgub, et StrComp on kasulik. Sest see ei ole lihtsalt öelda, jah või ei, võrdsed või mitte. See annab teile tunde tellimine meeldib sõnastik väest. Nii StrComp, s koma t võrdub võrdub 0 tähendab, et stringid on tõesti võrdne. Sest kes iganes kirjutas selle funktsiooni aastat tagasi ilmselt kasutada silmus või samas loop või midagi sellist integreerida üle tähemärki uuesti ja uuesti ja uuesti. Kuid probleem tekkis, siin. See oli copy0.c. Ja kaks punast on kuna see on vigane. Ja mida me siin teeme? Noh, esiteks ma helistasin getString. Ja ma hoida tagasi väärtuse s. Nii et on päris palju sama kui see top osa pildist. Aga mis saab pärast seda? Noh, lubage mul minna ja vabaneda on terve hunnik seda. Me kerida ajas, kus me lihtsalt on s, mis on nüüd kooskõlas line üks seal. Ma saan vaadata. Kui s võrdub võrdub 0. Nüüd kiire pool tähele, kui võib getString tagasi 0? Seal ei ole piisavalt mälu. Õigus? See on haruldane, et see juhtub, kindlasti on arvuti, mis on sai sadu megs või isegi kontserti RAM. Aga see võib teoreetiliselt tagasi 0, eriti kui kasutaja ei tee koostööd. On viise, kuidas teeselda nagu sa ei ole ümbritsevat midagi ja trikk GetString sisse tagasi 0 tõhusalt. Nii see läheb, et kontrollida seda. Sest kui keegi teist on hakanud saada, juba killustatust rikked - oli ilmselt allikas mõned pettumust - need on peaaegu alati tingitud mälu seotud viga. Kuidagi sa sassis seoses pointer, isegi kui sa ei saa aru, oli osuti. Nii et sa oleks võinud esile killustatust rikked juba nädal üks kasutades midagi silmus või kui loop ja massiivi läheb liiga kaugele Viimase piire mõned massiivi sa kuulutatud nädal kaks eriti. Te olete teinud seda isegi probleem seatud neli koos Breakout. Kuigi sa ilmselt ei ole näinud ühtegi tähte jaotus kood Breakout, selgub, et need GRect ja GOval ja muud sellised asjad, need on tegelikult osuti all kapuuts. Aga Stanford, nagu meie, justkui varjab et detail vähemalt raamatukogud eesmärkidel, palju nagu meie keelpilliorkestrile ja char *. Aga GRect ja GOval ja kõik need See, mida te olete või kasutad Sel nädalal on lõpuks mälu aadresse. Sa lihtsalt ei tea seda. Seega ei ole üllatav, siis võib-olla et sa võiksid komistada mõned killustatust viga. Aga mis on huvitav siin nüüd, kui pärast me kontrollida 0 teeme string t saab s. Noh, las ma kuulutada t. Ma joonistan selle nii kandiline, 32 bitti, nimetame seda t. Ja siis ma lähen tegema, saab s. Noh, mida see tähendab? Noh, see on natuke raske mõelda umbes see pilt tark. Aga mõtleme mis seal sees on x? Mis on sõna otseses mõttes sees muutuja? Väärtus Ox123. Nii et kui ma ütlen string t saab s, et lihtsalt sõnalt tähendab võtta number s, mis on Ox123 ja pane see Ox123. Või piltlikult, kui ma mingi abstraktne eemale detail see on mõju sõna otseses mõttes teed see samuti. Nüüd, arvan, et tagasi eelmisel nädalal, kui lähtusime kapitalistlikust T. I tegin T sulg 0. Noh, T sulg 0, kuigi see on pointer, saate seda ravida küll see on massiiv, nelinurkse sulg märke. Nii et kui on T sulg 0? Noh, see on h. Ja nii, kui me kasutame, et rida koodi, kaks ülemist, mis on, et c type.h header fail, see on kui see on deklareeritud. Sa ära see H. Kuid Muidugi, see on sama täpne h, mis on sees s, nii rääkida. Ja nüüd, kui olete muutnud või kapitaliseeritud nii originaal ja niinimetatud koopia. Sest sa ei saa teha koopia nii, et inimene tahaks seda. Mis siis oli fix siin aastal copy1.c eelmisel nädalal? Funktsioonid, et me saaksime tegelikult kopeerida string. Ja põhimõtteliselt, mida me vajame teha selleks, et kopeerida string? Noh, see roheline versioon siin ma olen teen seda üsna madalal tasemel. Seal on tegelikult funktsioonid nad võiksid aidata. Kuid kõige elementaarsem üks, ja kõige tuttav, vähemalt, varsti meile tuttavad, on järgmine - nii et üks on esimene rida koodi roheline nüüd. Ma lihtsalt kirjutasin s kui char *. Ei ole funktsionaalne vahe seal. Ma just viskasin ära CS50 raamatukogu ja Ma kutsun seda, mis see on, char *. Nüüd dot, dot, dot, sest seal oli mõned vigade kontrolli, et see pole huvitav rääkida uuesti. Nüüd t deklareeritakse. See on ka char *. Nii et ma joonistasin natuke ruudu ekraan nagu enne. Aga paremal servas, malloc, me öelda, on mälu eraldada. Nii eraldada mingi tüki mälu. Ja kui palju baite me tegelikult tahan jagada, see tundub? Noh, string pikkusega s. Nii et kui see on Tema see on saab olema viis. Me ütleme h-e-l-l-o. Nii viis baiti. Aga siis pluss 1, miks 1? 0 iseloomu. Kui me ei jätaks seda meest me võib kogemata tekitada olukorra, kui string on h-e-l-l-o. Ja siis järgmine kord getString on kutsutud ja ma kirjutada, näiteks, David, D-a-v-i-d, arvuti läheb arvan, et s on tegelikult h-e-l-l-o-d-a-v-i-d, sest seal on ei murda vahel need sõnad. Seega on meil vaja, et murda. Nii et me ei taha, et viis. Tahame kuus baiti. Ja bytes ma ütlen. Aga see on tõesti aeg suurus char. Tehniliselt char on peaaegu alati ühe baidi. Aga et meie kood kaasaskantav, nii rääkida, nii et see töötab erinevates arvutites kuigi need võivad olla mõnevõrra erinev all kapuuts, ma lähen üldiselt öelda suurus char nii et minu kood alati tööd. Ja ma ei pea kompileeri see lihtsalt sest ma saan uuendada oma arvuti või kasutada mõned erinevad platvormi. Nii et ma sain 6 korda suurem char, mis juhtub olema 1. Nii et see tähendab malloc võiks anna mulle kuus baiti. Mis on see, et tegelikult teeb? Noh, las ma rulli tagasi ajas siin et kui meil on lugu. Nii et kui ma lähen tagasi siin, ma kuulutatud char * nimetatakse t. Olen nüüdsest malloc kuus baiti. Ja nüüd ma lähen juhtida neid kuus bytes nagu massiivi varem. Aga ma tegelikult ei tea, mis on sees see massiiv. Kui teil mälu eraldada selgub, et sa ei saa usaldada, et seal on mõned teadaolev väärtus on. Ta oleks võinud kasutada midagi veel mõned muud ülesanded, mõned muud rida koodi, mis sa kirjutasid. Nii me tavaliselt nimetame neid prügi väärtused ja juhtida neid, võib-olla, kui küsimärke, vaid viitab sellele, et me ei tea, mis see tegelikult on. Ja see ei ole suur asi, nii kaua, kui me on piisavalt targad, et kirjutada need prügi väärtused numbrite või tähemärki, et me hoolime. Nii et kui see, mida ma teen? Noh, minu rida koodi Järgmine, mul on neli. int i saada 0, n saab string pikkusega s. Nii tuttav jaoks silmus. Mul on väiksem või võrdne n, mis tavaliselt on suurem. Kuid seekord on see tahtlik. I + +, ja siis ma lihtsalt teha t sulg i saab s. Sest minu pilt näeb välja selline kell Sel hetkel, salvestada t aadress, et juhuslik tüki mälu kelle väärtused on teada. Aga niipea, kui ma t sulg 0, mis paneb mind siia. Ja mis jõuab üha tõmmatud on? Me lõpetame laskmise h. Sest see, mis seal s sulg 0. Ja siis sama asi e, ja l, ning l ja o. n, miks ma minema läbi võrdne n? Kuna 0 iseloomu. Nii lihtsalt, et oleks selge, siis, kui ma tegelikult kustutada olenemata nende prügi väärtused ja siis tegelikult juhtida ma ootan, et see on s sulg 1, 2, 3, 4, pluss see on trailing uus tegelane. Ja nüüd kui me jätkame mööda dot, dot, dot selle õige versioon ja kapitaliseeritud t sulg 0 Tahaksin kohta Loomulikult tuleb ära ainult selle kutt, mis kontseptuaalselt oli lõpuks sihile. Nii et kõik on kursor. Ja olete kasutanud neid mitu nädalat nüüd kontekstis stringe. Aga all kapuuts nad veidi keerulisem. Aga kui sa arvad neid selles pildilise vormi teen ettepaneku, et nad on Tõenäoliselt ei ole kõik nii hirmutav kui nad Esialgu võib tunduda esmapilgul eriti selliste uute süntaks. Kõik küsimused on suunanäitajaks, stringid, või sümbolit? Jah? Publik: Kas sa lähed tagasi et [kuuldamatu]? SPEAKER 1: Muidugi. Publik: Niisiis, kuidas tulla oma väga viimane line, sa ei pea * t line ja * s rida? Kas sul pole viidet - SPEAKER 1: Ah, tõesti hea küsimus. Miks ma ei ole * t ja a * s? Sest lühidalt, eelmisel nädalal, nagu meie swap funktsiooni, ma ütlen, et kui sul pointer vahendid, mis sa sinna minna, kui me tegime füüsiliselt laval, oli tegelikult kasutage tärni operaator. Selgub, et see ruut-sulg märke on see, mida me kutsume süntaktiline suhkur, mis on lihtsalt seksikas viis öeldes, et see on stenografist märke täpselt, mida sa kirjeldad alla. Aga see on natuke rohkem intuitiivne. Ja oht muuta see tunduda keerulisem kui see peaks olema, Mis tegelikult toimub siin on järgmine - Kui ma ütlen * t see tähendab, minna aadress salvestatakse t. Nii sõna otseses mõttes, kui t on hoidmiseks aadress, et h Algselt * t vahenditega minna siin. Nüüd, mida see t sulg 0 tähendab? Sama täpne asi. See on lihtsalt natuke rohkem kasutaja sõbralik kirjutada. Aga ma pole seda veel teinud. Ma ei saa lihtsalt öelda * t läheb * s. Sest mida ma tegema siis? Ma oleksin hakanud h, h, h, h, h kogu asi. Õigus? Sest * t on minna aadressile t. Aga me oleme sees loop. Ja mis raha ma incrementing, Loomulikult on iga iteratsiooni? i. Aga seal on võimalus siin, eks? Isegi kui see tundub nagu see muutub veidi keerukamate kui ruudu-sulg märke Me kasutasime mõnda aega - andke mulle undo minu h muutus seal - kuigi see on nüüd muutub vähe Kasvataja, põhiidee, kui * t tähendab siin ja * t on lihtsalt minge aadressile t. Aga mis oli aadressi t? Number hoiame kasutades? Nagu Ox456, toome selle tagasi lihtsalt huvides arutelu. Noh, kui ma tahan saada on e sisse t string, ma tahan minna, sisuliselt 456. Või õigemini, 457. Ma lihtsalt vaja lisada üks. Aga ma ei saa seda teha, eks? Kuna t, kuigi ma hoida joonistus see nüüd nagu nool, see on lihtsalt number, Ox456. Ja kui lisada üks selle või rohkem üldiselt, kui ma lisan ma selle saan tegelikult saada täpselt, kus ma tahan. Nii et kui ma tegelikult seda teha - ja see on see, mida nüüd nimetatakse pointer aritmeetika - Ma ei eemalda seda joont. Mis on ausalt öeldes ma arvan, selgem ja natuke rohkem kasutajasõbralikumaks lugeda. Aga see ei ole vähem õige. See koodirida nüüd kasutab pointer aritmeetika. Ta ütleb minna aadressil - olenemata algust t on, mis on t pluss i, mis algselt on 0, mis on suurepärane. Sest see tähendab, et alguses t pluss 1 pluss 2 pluss 3, ja nii edasi. Ja sama tegelema s. Nii süntaktiline suhkru eest. Aga mõista, mis tegelikult toimub all kapuuts, ma väidan, on tegelikult kasulik ja iseenesest. Sest see tähendab, nüüd seal ei ole palju magic toimub all kapuuts. Seal ei kavatse olla palju rohkem kihti, et saame Tõmmake teile. See on c. Ja see on programmeerimine. Tõesti hea küsimus. Olgu, see oli see, et lollakas programm, millele ma viitasin varem. swap oli vigane. Kui ei tundu töö. Tuletame meelde, et just nagu koos piima ja apelsinimahl - mis ma alustasin joomine tänane meeleavaldus. Nii lihtsalt nagu apelsinimahl ja piim, me ei pea kasutama ajutise muutuja, tmp, korraldada ajutiselt, nii et me võiksime siis selle väärtuse muutmiseks ja seejärel ajakohastada b. Kuid see funktsioon, me ütlesime, või selle programmi, milles see funktsioon oli kirjutatud oli vale ja vigane, siis miks? Jah? Publik: [kuuldamatu]. SPEAKER 1: Täpselt, kui helistate swap - või üldisemalt kui helistada kõige tahes funktsioon - Kui argumente, et funktsioon on primitiivne, niiöelda ints ja tähed ja kahekohalised ja ujukite, asjad ilma tähed, mida läbides koopia argument. Nii et kui x oli 1 ja y oli 2, läheb olema 1 ja b saab olema 2. Aga nad ei kavatse olla erinev tükkideks bittide erinevaid tükke mälu, mis juhtub olema ladustamiseks identsed väärtused. Nii et see kood on super täiuslik kell vahetada ja b. See ei ole hea vahetada - eelmisel nädalal näiteks - x ja y. Kuna uuesti, nad vales ulatus. Nüüd, kuidas me edasi minna, millega määratakse kindlaks seda? Pidime tegema funktsioon vaadata veidi koledam. Aga jälle, kaaluma, milliseid tähendab see lihtsalt seda. Ja tegelikult, las ma, järjepidevuse, muuta ühe asja nii, et see on identne mida me tegime. Nagu mainisin eelmisel nädalal, see ei oluline, kus see läheb. Tegelikult, tavaliselt te paneks star kõrval muutuja nimi. Aga ma arvan, et see oleks veidi lihtsam kaaluda * kõrval andmetüüp nii see pointer et int käesolevas asjas. Nii et mida ma siin teen? Ma ütlen ei anna mulle int järgneb teine ​​int, kutsudes neid ja b. Anna mulle aadress int. Anna mulle aadress teise int. Helista neile, aadressid ja b. Ja siis kasutades * märke maha alla, minge kõik need aadressid kui on vaja kas saan või määrata selle väärtus. Aga on siin erandiks. Miks ma ei ole * kõrval tmp? Miks ma ei tohi seda teha, näiteks? Tundub nagu ma peaks lihtsalt minema välja ja parandada kogu asi. Jah? Publik: [kuuldamatu]. SPEAKER 1: Ma ei ole kuulutatud tmp kui string. Nii et see oleks tunnistada, et käesolevas asjas, tmp olema aadress int. Aga see ei ole päris see, mida ma tahan, jaoks paar põhjust. Publik: Sa ei taha, et vahetada neid. SPEAKER 1: Täpselt, ma ei taha, et vahetada midagi tmp. tmp on lihtsalt nädal üks värk. Kõik, mida ma tahan on muutuja salvestada mõned number. Ma isegi ei hooli aadressid praegusel hetkel. Ma vajan 32 bitti või nii et hoidke int. Ja ma tahan, et panna need 32 bitti mis iganes ei ole, nii et rääkida, kuid mis on, lihtsalt olla täpsem. Sest kui on aadress, * tähendab minna ja saada väärtus 1. Näiteks eelmisel nädalal näiteks või b juhtum, saada väärtus 2. Mis siis tegelikult toimub? Las ma joonistan pildi siia, mis ainult tease peale osa täna. Aga see ilmuvad jätkuvalt juba mõnda aega. See, ma väita, on see, mida arvuti mälu välja näeb, kui sa jooksed programm, mis tahes programmi. Kui te käivitate programmi ülaservas arvuti RAM - seega mõtle see ristkülik, nii tõesti kui teie arvuti RAM või mälu, kõik 101 miljard baiti see kõik kaks miljardit baiti, kõik kaks gigabaiti see, olenemata kogusest teil on, Joonistame seda ristkülikut. Ja ma väita, et kui sa jooksed programm nagu Microsoft Word või Chrome või midagi sellist, bitti, mis Microsoft või Google kirjutas - juhtudel nendest programmidest - laetakse arvuti mälu kus neid on võimalik täita rohkem kiiresti ja söödetakse CPU, mis on arvuti aju. Ja TAM nad ladustada väga peal oma programmi, nii rääkida. Teisisõnu, kui see on tüki mälu, kui te topeltklõps Microsoft Word, bits tulema välja kõvaketas. Nad saavad laaditud RAM. Ja me pista neid ülaservas Selle ristküliku kontseptuaalselt. Noh, ülejäänud oma mälu kasutatakse erinevaid asju. Tipus näed initsialiseerida andmed ja lähtestamise andmed. See on, mida teha, on suures osas, kus konstandid või globaalsed muutujad et on väärtusi. Aga rohkem on neid veel kord. Siis on hunnik, mis me tuleme tagasi. Aga allosas on osa, mis on eriti Sobiv kohe. See on nn stack. Nii nagu ka kõige tahes D saal siin campus, teil on neid plaate, mis lihtsalt korstna peal üksteist, mil võite panna toit ja tühi-tähi. Korstnat arvutisüsteemi on väga sarnane. Välja arvatud et salve, kui me kasutame söögisaal, muidugi, on mõeldud teha asju kandikud või raamid - kui me kutsume neid - in arvuti mälu hoidmiseks kasutatud muutujad ja väärtused. Mis siis tegelikult läheb edasi all kapuuts? Noh, las ma flip üle et ekraan siin. Ja olgem keskenduda just alumine osa hetkeks. Kui see on alumise osa minu arvuti mällu selgub, kui ma helistada funktsioon main - mis juhtub, ausalt, automaatselt minu jaoks - Ma saan tüki mälu alt mu RAM nii rääkida. Ja see on koht, kus peamine on kohalikud muutujad minema. See on koht, kus argc ja argv võibolla minna ja kõik muutujad I kuulutada sees peamine. Nad lõpuks allosas minu arvuti RAM. Nüüd oletame, et peamised kõned funktsiooni nagu swap, nagu ta tegi eelmisel nädalal? Noh, me põhiliselt panna uus plaat, uus raam, peale minu tüki mälu. Ja ma kirjeldada seda kui kuuluvate swap funktsiooni. Nüüd sellest, mis seal sees on swap? Noh, mis põhinevad eelmise nädala programm ja üks me just nägin väljavõte, sees swap raami, või Swapi salve, on see, mis muutujad? Noh, ja b. Kuna need olid tema kohalike argumendid, pluss kolmandik tmp. Nii et tõesti, ma võin selle joonistada veidi puhtamalt. Lubage mul minna ja undo etiketti. Ja las ma väita, et sa tead, mida? ilmselt läheb lõpuks siin. B läheb lõpuks siin. Ja tmp lõppeb siin. Nüüd tellimine võib olla veidi erinev. Aga põhimõtteliselt on see idee. Ja just kollektiivselt on see, mida me kutsume swap raami või Toitlustus-hall salve. Ja sama tegelema peamine. Aga ma ei tõmmata seda. Aga see on, kus argc ja argv ja iga tema kohalikud muutujad nagu x ja y võib olla samuti. Nüüd kaaluma, mis tegelikult toimub Helistades swap. Kui helistate swap, täidesaatva kood nagu see, et sa möödaminnes, et lollakas versioon, ja b kui koopiaid x ja y. Nii et kui ma nüüd seda joonistada ekraanil - sain saada paremini see - Nii et lugu ma ütlen, et mina oli see lollakas versioon, kui me helistada swap kulgeb sõnalt ja b nagu täisarvud, mis tegelikult toimub? Noh, mis tegelikult juhtub, on see. Lubage mul minna ja undo lihtsalt koristama natuke ruumi. Nii et see on minu arvuti mällu. Nii et kui mul on näiteks - tegelikult teeme seda niimoodi - kui ma väita, et see on x, hoidmine väärtus 1 nagu eelmisel nädalal. Ja see on y, hoidmine väärtust 2 Nii nagu eelmisel nädalal. Ja see on peamine, kui ma kutsun swap, andes ise juurdepääsu ja b ja tmp, ma väita, et see on ja see on 1. See on b. See on 2. Seda nimetatakse tmp. Ja esialgu, see on mingi prügi väärtus kuni ma tegelikult salvestada see, mis on 1. Siis minna ja muuta et mida? B väärtust. Ja nüüd on mul kaks siin. Ja siis me ütlesime b saab tmp. Jällegi, nagu meelerahu kontrollima kolmas koodirida siin on lihtsalt see üks, b saab tmp. Ja nii lõpuks, mida ma pean tegema? Ma minna ja muuta b olla mis iganes väärtus tmp on, mis on 1. Ma ei puutu tmp uuesti. Aga nüüd, probleem on kiiresti swap tulu, sest see ei ole üleandmine tagasi mõned väärtus, ei ole tagasi avalduses selgesõnaliselt seda. Mis tegelikult toimub? Noh, põhiliselt see kõik mälu - OK, ilmselt kustutuskumm meeldib ainult ühe sõrmega korraga - kaob. Nüüd tegelikult see ei ole lähe kuhugi. Aga sa ei mõtle seda nüüd küsimärgid. Sest see ei ole enam tegelikult kasutatakse. Ja midagi ei tehta nende väärtused. Seega juhul, kui roheline versioon seda koodi, mis selle asemel on olla läks swap? Nii käsitleb. Nii aadress x ja aadress y. Nii et kui me uuesti öelda selle loo viimane aeg, ja ma tegelikult teha swap jälle kuid suunanäitajaks, see on, seda on b ja see on tmp, mis on tegelikult salvestatud käesolevas rohelises versioon minu kood, kui ma panen aadressides? See saab olema kursor x. Nii et ma võiks teha nool. Kuid olgem kasutada sama meelevaldne Näiteks kui enne. Ütleme, et see on midagi Ox123. Ja see saab olema Ox127 sest see on neli baiti ära, sest see on int, nii Ox127. Ja veel, ma võtan mõned vabadused numbrid. Nad on palju väiksemad kui nad oleksid tegelikult ja erinevas järjekorras. Aga see, kuidas pilt on nüüd teistsugune. Aga kui ma seda roheline kood ja ma int tmp saada *. * Abil teha järgmist võtma tegeleda, et see sisse ja minna seda, mis on 1. Ja see, mida ma siis panna tmp. Vahepeal järgmise koodirida siin, * saab b, mida see tähendab? Noh, *, et minna siin saab * b, mis tähendab minna. Ja see tähendab, et panna raha sinna. Lõpuks viimane rida koodi lihtsalt ütles * b saab tmp. Niisiis b ütleb minna ja asendada selle tmp, mis sel juhul läheb olema jällegi 1. Ja see on põhjus, miks roheline versioon Meie kood töötab, samas kui punane versioon ei ole kunagi teinud. See kõik lihtsalt taandub kuidas mälu haldab ja kus see on tegelikult panna oma arvuti RAM. Ja nüüd, see on üks neist asjadest, et stack on kasutatud. Küsimused paigutus? On viiteid? Või swap? Olgu, malloc, mäletate, tegin midagi sellist. See oli super lihtne näide. Ja see oli üks, mis Binky tutvustas meile küll üsna kiiresti, lõpus klassi. Kurat, seal jälle pihta. Nii meelde, et see oli näiteks, et Binky tutvustas meile, ehkki mõnevõrra kiiremini lõpus klassi. Ja siin me kasutada malloc tõesti teist korda. Sest kui me esimest korda seda kasutanud luua piisavalt RAM, eraldama piisavalt RAM salvestada string. Seekord Binky hoida see lihtne. Nii et see on salvestada ainult int, ilmselt. Ja see on täiesti korras. See on natuke imelik, öeldes, et kasutada malloc eraldada üks int. Aga koht Nicki claymation oli tõesti ainult öelda lugu mis juhtub või ei juhtu, kui sa valesti kohelda mälu. Nii et kui see programm tegin mõned asjad. Esimesel juhul, kuulutab pointer nimega x int. Seejärel teatab pointer kutsutakse y int. Seejärel kauplust x, siis mida? Keegi teine ​​nüüd. Mis saab salvestatud x järgi Kolmandas reas on see programm? Publik: [kuuldamatu]. SPEAKER 1: Noh, mitte päris bytes kohta öelda. Täpsemalt nüüd. Mis saab salvestatud x? Aadress, ma arvan, et ma kuulsin seda. Mis siis malloc tagasi? malloc käitumuslikult eraldab tüki mälu. Aga kuidas see annab teile juurdepääsu on? Ta naaseb mida? Aadress esimene bait aastal tüki mälu. Nüüd on see super lihtne. See on lihtsalt üks bait, mis tähendab, käsitleda me saada tagasi on aadress kogu asi. Nii hoitakse x on siis aadress selle tüki mälu. Vahepeal mis järgmisena juhtub? Nii tegelikult, lähme edasi ja joonistada välja reaalne kiire. Nii et kui me läheme üle ekraani siin ja me mängime seda läbi int * x ja int * y läheb seda, mida minu jaoks? Väidan, et see on lihtsalt kavatse teha midagi sellist ja kutsuvad seda x ja seda ja kutsume seda y. Vahepeal kolmas rida koodi on läheb eraldada suurus int, mis juhtub olema - vabandan, kui ma ütlesin üks enne ma mõtlesin üks int - neli baiti tüüpiline arvuti. Vähemalt CS50 aparaat. Nii see läheb eraldada see, kes teab? Kusagil siin. Ja see on salvestatud mõned aadress Ox, kes teab? Aga mis toimub, et saada tagasi on see, et aadress. Aga me teha seda piltlikult kui lihtsalt nool niimoodi. Nüüd järgmine rida * x saab 42. Mis * x tähendab üldarusaadavat mõttes? Just sinna minna. Mine sellele aadressile. Ehk teisisõnu, järgige nool ja pane 42 seal. Aga siis midagi halba juhtunud et Binky, eks? Tuletame meelde, et line viis siin, * y muutub 13, tõepoolest õnnetu number, tegin seda, mida meie jaoks? Noh, * y vahenditega minna. Noh, see ei ole antud väärtus veel, eks? Kood ei ole y on vormindatud midagi. Olime x Alglaaditakse et aadress. Aga y kuulutati up top. Aga siis semikoolon, mingit väärtust tegelikult panna see. Nii et see on õiglane, et nimetame seda prügi väärtus. Kes teab, mis seal on? See on jäänuseid bitti, mida kasutati mõned eelmine rida koodi minu programmi. Nii et kui ma ütlen minna, see on nagu, Mul pole aimugi, kus see nool läheb lõpuks. Ja see, kui sa tavaliselt saada killustatust süü. Kui te kogemata endid, nii et rääkida või minge aadressile see pole tegelikult õigustatud aadress, halbu asju juhtuda. Ja see on täpselt see, mis juhtus mõelda Binky. Nii meenutavad, et lugu, mis Nick oli räägib siin oli sama idee, mida Olen tõmmata illusiooni kriit pardal olemas. X ja Y on deklareeritud. Siis jaotatakse suuruse int ja hoidnud seda x. Siis järgmine rida tegime * x. See oli Nick võlukepiga ning viite mahavõtmine. See pani 42 mällu märkis x. Aga see on koht, kus asjad läks kohutavalt valesti. Õigus? Oleme püüdnud endid y. Aga y olid mõned võlts raha, eks? See noolega vasakpoolne nurgas, ei ole tegelikult osutab midagi. See on omamoodi seda, mida ma tegin siin laual. Nii halbu asju juhtuda, segmenteerimine süü või Binky süü, et käesolevas asjas. Aga kui me seejärel määrata, et seda tehes x muutub y kuidas lugu muutus? Noh, kui ma x muutub y, see on tõhusalt sama öelda mis iganes see on, Ox-midagi saab olema sama siin, Ox-midagi. Või piltlikult me ​​juhtida noolt. Nii et siin laual Binky, ning järgmine rida kood, * y tähendab minna. Kus on seal? See tähendab, et üle siin. Ja kui me uuendada, et see on 13 see lihtsalt tähendab enamat ja kirjalikult 13 siin. Nii et ehk ei ole täielikult lihtne esimesel pilgul. Aga veel kord ja kasutada sama kõnepruuki et Binky kasutas siin, nii Esimese kahe eraldada suunanäitajaks, x ja y, kuid ei pointees. Ja pointees ei ole üldiselt kasutatav termin. Aga pointer absoluutselt on. Aga see on see, mis kuramuse märkis kell on Binky on nomenklatuur. See järgmise rea, muidugi, eraldab int pointee. Nii tüki mälu - nagu ma joonistasin üle edasi paremal seal - ja komplekt x võrdub mõtet. See dereferences x salvestada 42 mälu, et see osutavad. Ja siis see on muidugi oli halb. Kuna y ei juhtides juures veel midagi. See fikseerib ta. Nii et see on ikka lollakas programmi. Tulime puhub läbi koodi rida realt ja ütles, oh well, lase tal krahhi seal. See on halb asi. Koefitsiendid on programmi lihtsalt läheb katkestada kokku sel line. Aga kui sa olid eemaldada avariijärgne rida ja asendada see kahe viimase read on sulle anda - kasutades pointer loovutamine - y käsk x on punkt t. Ja siis endid y väga ohutult. Nii et kui see jäta meid? Noh, selgub, et selle all kapuuts aastal CS50 raamatukogu osuti on kasutatakse kogu. Ja me tegelikult hakata koor tagasi, et kiht enne pikk. Aga selgub ka, mõiste, mis Mõned võite olla tuttav, eriti mugavamaks, on tegelikult see, et väga populaarne kodulehel või virna ületäitumise, nendel päevadel. Aga see on tegelikult väga tehniline tähendus. Me teame nüüd, mida pinu. See on nagu virna plaate sees söögisaal. Või sees arvuti mälu its nende raamid mis kasutavad funktsioonid. Noh, selgub, et selle tõttu väga lihtne rakendamine mälu ja raamid nn korstnat, saab tegelikult võtta kontrolli arvutisüsteemi, üsna kergesti. Võite sissemurdmist süsteemi kui inimesed nagu meil ei ole kirjutanud meie kood eriti hästi. Kui inimestele meeldib meile kasutada tükkideks mälu või kasutada massiivid - veelgi sagedamini - kuid mõnikord unustage vaadata piirid meie massiivi kui võiks on ennast mõnikord, mida arutati liiga kaugele minevikku lõpus massiivi. Parimal juhul oma programmi võib lihtsalt krahhi. Segmenteerimine süü, kind piinlik. Ole suur, kuid see ei ole tingimata väga halb. Aga kui teie programm on tegelikult reaalne kasutajate arvutites, kui see töötab kodulehel, et tegelikult juhuslikult inimesi Internetis on pihta, lastes inimesed esile halba oma koodi üldiselt ei ole hea asi, sest tähendab see võimalust teha kontrolli arvuti. Ja see läheb otsima veidi segasena. Aga ma mõtlesin, et ma hirmutada teid see viimane näide. Siin on näide koodi. Ja seal on hea Wikipedia artikkel, mis jalutab läbi seda üksikasjalikumalt. Mul on peamine põhjale calling suva, mis kulgeb argv 1. Ja see on lihtsalt nii, et saate käivitage programm ja sooritama suvalise sisendi. Ja siis suva on kuulutatud üleval kui vastu string, või rohkem täpselt, char *. Seejärel teatab array tähemärki. Kõne see puhver üldisemalt suurus 12. Seega 12 tähemärki mahub sees selle massiivi nimega c. Ja siis ta kasutab seda uut funktsiooni, , mis on uus, kuid ei ole raske aru, mälu koopia. See kopeerib mälu baar, mis oli muutuja varem n, olenemata kasutaja tipitud argv 1 c alla. Mitu baiti? String pikkusega riba. Nii teisisõnu, kui kasutaja liigid h-e-l-l-o enter, stringi pikkus Hello on viis. Nii viis nende bytes ei hakka kopeeritakse massiivi nimega c, mis on suurus 12. Aga milline kasutaja liigid palju kauem Sõna, mis on 13 märki või 14 märgid või 100 tähemärki või rohkem? Kuhu nad lähevad minema? Noh, et raam, et salve söögisaalis-hall korstnat nad ei kavatse sinna minna. Ja see on ainult kavatse alustada kirjutades muid asju, mis on juba selle korstna täis stack nii rääkida. Nii piltlikult, mõtle seda nii. See on lihtsalt värviline versioon Pildil oleme juhtinud. Allosas, oletame, on peamine. Ja peal, mida te näete nüüd on raami värv kodeeritud Nüüd, funktsioon nimega foo. Aga mis on huvitav siin umbes suva, et siin on oma raami. Nii, et see välja nagu ma tegin vaid helesinine. Ja nüüd on see, kus c sulg 0 läheb. Ja see on koht, kus c sulg 11 läheb lõpuks. Teisisõnu, see juhtub olla esindatud ruut. Aga kui sa muudkui plopping baiti maha - või sümbolit - nad ei kavatse lõpetada üles asukoha 0 kogu tee üles 11 sest see on 0 indekseeritud. Aga kus on 13 märk läheb lõpuks? Kus on 14.? Kus on 50. iseloomu läheb lõpuks? See saab hoida allakäik. Sest kuigi me oleme tõmmatud pilt stack kasvab, aadressid, selgub, lähevad väike aadresse väike suunanäitajaks, et suur aadresse. Nii see lihtsalt hoiab läheb üles ja üles. Nii et kui kasutaja liigid Tere, see on tore. No viga, pole probleemi, kõik on ohutu. Aga kui kasutaja liigid, mida me tulen helistada võistleva kood esindajad üldnimetusega, rünnak, rünnak, rünnak, rünnak, mis võib juhtuda? Noh, kui kõik sisend, et kasutaja kirjutada ei ole lihtsalt mingi sõbralik või solvava tähekombinatsiooni. See on tegelikult märgijada et kui koostatakse see, see tegelikult on kood. Võibolla on see kood, mis kustutab kõik faili kõvakettale või saadab rämpsposti või midagi sellist. Pange tähele, et see, mis on võti on selles, et kui paha poiss sai õnn kirjutatakse punase tüki mälu - mida ma ei joonistanud minu pilt, vaid see Wikipedia pilt on siin - selle nn saatja aadress. Kui toit naaseb, kui swap naaseb, kuidas arvuti teame minna siin on siin all? Või tech segment kuni eespool kuidas see tead minna swap kood - 0-ja 1 aasta et kirjutada swap - Tagasi? Seal on nn saatja aadress salvestatakse sama freimi kohta samas kohvikus salve. Nii et kui paha poiss on nii tark, et pane rünnaku kood, rünnak kood, rünnak kood ja saada õnn - sageli katse-eksituse teel - et kirjutada, et punane saatja aadress, koos aadress ja teave väga top. Teade 0835C080. See on kirjutatud tagurpidi up top põhjustel me võib-olla uuesti. See on see number. Nii et kui paha poiss muutub õnn või on piisavalt targad, et kirjutada punane riba mälu aadress kood, mis tal kuidagi pritsitakse arvuti vist kelle kood läheb tagastatakse niipea kui foo tehakse täidesaatva? Paha koodi. Nii et see rünnak kood, AAA jällegi võib saata rämpsposti, võib kustutada kõik failid kõvakettal. Aga see on see, mida tõeliselt stack overflow on või puhvri ületäitumise, või buffer overflow rünnak. Ja see on uskumatult, uskumatult levinud see päev, kus programmid on kirjutatud C, C + +, ja isegi mõned muus keeles. Selle hirmutav tähele, me lõpeb nali. [Naer] Näeme kolmapäeval. Järgmise CS50 - Nii et ma olen kõik välja disk lambid täna vaid oota, rasvavaba piima, pool telefoni raamat, apelsinimahl et ma jõin täna. USB kaabel, mutrivõti. [Muusika mängib]