[Predvajanje glasbe] DAVID J. Malan: Dobro. To je CS50. In to je začetek 5 tedna. In kot ste morda opazili, nekaj materiala postaja malo bolj kompleks, malo gostejša. In to je zelo enostavno, še posebej, če ste bili v navadi že nekaj časa, da se skuša Škrabotine navzdol najbolj kaj počnemo, govoriš v razredu. Toda zavedati, da je ni mogoče ideal pedagoški pristop za učenje tovrstno gradivo, in material, bolj na splošno. In tako smo veseli, da sporočamo, da CS50 lastnega Gheng Gong je začela pripravljati kanonično set bankovcev za tečaj, upanje ki je, da ena, ti služijo le kot referenca in vir za pregled gradiva in bo nazaj skozi material, ki bi lahko imele Vam je pobegnil prvič okoli, vendar tudi zato, da lahko svoje glave bolj navzgor kot navzdol, ko ga pride čas za predavanje, tako da boste lahko vključijo bolj premišljeno, kot je v nasprotju z bolj scribbly. S tem je dejal, kaj boste našli na Spletna stran je takšni dokumenti, kot je ta. In obvestilo, v zgornjem levem kotu, tam je ne le kazalo, ampak tudi čas kode vas bo takoj skočil v ustreznem delu v video na spletu. In kaj Chang je naredila je, v bistvu, dokumentira kaj se je zgodilo v tem posebno predavanje. In mnogi od predavanj so že na spletu zdaj s tem URL. In bomo še naprej objavljati v preostalem tistih, do konca tega tedna tako da izkoristijo ta vir. Torej, brez odlašanja, smo začeli lupiti nazaj plast, ki je bila Niz za nekaj časa. In kaj smo rekli niz dejansko je prejšnji teden? Torej char zvezda. In char zvezda, dobro, kaj se je to v resnici pomeni? No, ves ta čas, če smo jih klical funkcijo, kot getString in shranjevanje tako imenovani donos Vrednost getString v variable-- se imenuje s type string-- smo pisali vrstica kode tam zgoraj. In to je samo takrat, ko vidim rokopisa veliča tukaj moram zavedaš, kako krute je to. Vendar pa predpostavimo, da je na desni strani je kljub temu smiselno upodobitev, kar je se dogaja vse to Tokrat z getString. getString, seveda, dobi niz. Toda kaj to v resnici pomeni? To pomeni, da dobi kos pomnilnik operacijskega sistema ki ga kliče funkcijo, ki se imenuje malloc. Ampak več o tem kasneje. In potem se poseli da je kos pomnilnika s črkami, ima uporabnik vnesli v, čemur sledi, seveda, null znak, ali poševnica nazaj zero na samem koncu. Medtem, na levi strani te zgodbe, ves ta čas, smo bili razglasitvi spremenljivke, kot s. In da je spremenljivka, kaj zdaj bo začel kliče kazalec. To ni škatla znotraj katere smo pripravili niz, Daven, per se, ampak smo se v tem trgu polje na levi kaj točno? Ja? OBČINSTVO: naslov kje se nahaja v pomnilniku. DAVID J. Malan: Točno tako. Naslov, kjer Daven se nahaja v pomnilniku. In ne tam, kjer vse Daven se nahaja, po sebi, ampak zlasti naslov od česa? Ja? OBČINSTVO: Prvi znak. DAVID J. Malan: Prvi znak v Daven, ki je v tem primeru, Predlagal sem samovoljno in nerealno 1, OX1, ki pomeni le šestnajstiško število 1. Ampak to je verjetno, da bo da je veliko večja številka da lahko potegnemo z 0x kot predpono, predstavlja šestnajstiški značaj. In ker nam ni treba vedeti, kje ostali liki Daven so, ker kaj preprosta konstrukcija Odločitev, ki je bila narejena pred mnogimi leti? Ja? OBČINSTVO: Leva poševnica 0. DAVID J. Malan: Ja, točno. Nagibnica 0 vam omogoča, čeprav v linearni čas za prečkanje niz, hoje od leve proti desni, z zanko ali časa zanka, ali kaj podobnega da, in ugotoviti, oh, tu je konec tega posebnega niza. Torej s samo naslov, začetek niza, lahko dostopate do celotne to, ker vse to pa, Niz je bil samo char zvezda. Torej, to je zagotovo v redu, da še naprej uporabljajo Knjižnica CS50 in ta abstrakcija, tako rekoč, vendar bomo začeli videti natanko Kaj se je dogajalo Pod tem ves čas. Torej, se morda spomniš tega primera, Tudi v zadnjem času, pa jih primerjati med 0, ki dejansko ni primerjati. Vendar pa smo začeli reševati to. Toda, kot je morda osvežitev, Morda sem koga zanima v roza slona danes tudi z Chang? Kaj pa ti pred? [Neslišno]. Pridi gor. In v tem času, kot ste prišli, dajva razmisli za trenutek, kaj ta koda je pravzaprav počne. To je razglasila dve spremenljivki up top, s in t, in kliče getString. To ni zelo uporabniku prijazen program saj vam ne povem, kaj naj naredim. Ampak kaj je samo prevzeti smo s poudarkom na sočno delu. In potem bomo to storili, če je enaka enak t, bi morala reči printf, ste vnesli isto stvar. Pozdravljeni. Kako ti je ime? Janelle: Janelle. DAVID J. Malan: Janelle, Lepo, da sva se spoznala. Torej, vaš izziv pri roko za to slona je, da nam najprej sestaviti sliko o tem, kaj je ki so zastopane v teh prvih dveh linije. Torej bi s in t je predstavljal, kako na zaslonu? In lahko samo izdela z prstom na velikem zaslonu. Tako da je obe polovici do vsaka stran te enačbe. Torej je i na levi strani, in nato getString na desni strani. In potem je t na levi strani, in potem getString na desni strani. Torej, kako lahko začnemo narisati sliko, ki predstavlja, kaj se dogaja tukaj v spominu, bi rekli? In naj vam razloži kaj delaš, kot si. Janelle: OK. No, najprej, da bi se sprašuje da bi dobili niz. In bi store-- oh, oprostite. DAVID J. Malan: OK. Dobro. In to je tisto, kar se imenuje? Oh, OK. Nadaljuj. Nisem želela motiti. Janelle: Žal mi je. Tako da bi ga vključili v naslov ne o-- prepričan. Ne morem natančno zapomnil številko, vendar menim, da smo se začne z 0. DAVID J. Malan: To je vse v redu, ker sem številke gor, tako da ni pravi odgovor. Janelle: Začenši z 0 loku. DAVID J. Malan: OK, da element 0. Seveda. Janelle: In potem, če je bil kot samo dveh letter-- DAVID J. Malan: Ok, nazaj k tebi. Janelle: Torej element 0, in nato element 1 ali element 2. DAVID J. Malan: In kateri del slika rišeš zdaj? Poziv k getString? Ali izjava o s? Janelle: Izjava S, verjamem. Oh, getString, saj bi se vnesejo v vsako [? območje. ?] DAVID J. Malan: Dobro. Točno tako. Čeprav to dejansko vrne niz, odpoklic, ko se vrnemo niz, smo lahko Indeks v ta niz z uporabo 01 in 2. Tehnično, to so verjetno posameznih naslovov zastopani, ampak to je v redu. Torej domnevam, če sem lahko samo hitro posreduje, kjer smo končali zadnji čas, če je eden od strune je bil g b e, poševnice nazaj 0, kar predstavlja Gabe je input, kako bi lahko zdaj predstavljajo s? Če je to spomin, ki je je vrnil z getString? Janelle: Bi bilo z loku zastopa? DAVID J. Malan: Z lok? No, no. Reciva, slikovno, Naj samo pojdi naprej in predlaga, da se, če je to s to je vrnjeno vrednost getString. In ste to pripravljeni kot 0, 1, 2, ki je popolnoma razumljiva, ker smo lahko indeks v nizu, kot npr. Ampak samo, da je v skladu z zadnji čas, naj gredo naprej in samovoljno predlaga, da se ta je naslov 1, to je naslov 2, To je naslov 3, in tako naprej. In tako, samo, da je super jasno, kaj se dogaja iti s kot posledica ki Prva vrstica kode, bi rekli? Janelle: Naslov 1? DAVID J. Malan: Točno tako. Tako obravnavati 0x1. In medtem, naj gredo naprej in dvojnik veliko tega, kar ste storili in dodajte svoj t tukaj. Če bi tip v Gabe enkrat, drugič, Ko ste pozvani, s getString, kje, Seveda, je Gabe šla? No, presumably-- Janelle: Tako kot tukaj? DAVID J. Malan: Ja. Janelle: Ali je tudi v enakih škatlah? DAVID J. Malan: Dovolite mi, da predlagam, da, točno, tako da v teh dodatnih poljih. Toda kaj je ključnega pomena zdaj je, da tudi čeprav sem sestaviti ta precej blizu together-- 0x1, to je 0x2-- v resnici, to sedaj lahko naslov 0x10, na primer, in 0x11 in 0x12, in tako naprej. In tako, če je temu tako, kaj se dogaja, da na koncu sem t? Janelle: 0x10? DAVID J. Malan: Točno tako. Torej 0x10. In zdaj, zadnje vprašanje. Ki ste jih do sedaj morali delati Najtežje za slona doslej. Do sedaj, če potegnem gor kodo še enkrat, ko sem naredil, v skladu tri, če je enaka enak t, kar sem v resnici primerjali, da smo tukaj pripravljeni? Janelle: Dva naslovi? DAVID J. Malan: Točno tako. Torej, jaz pravim je S enak enaka ne? Z drugimi besedami, je 1 enak enaka 10? In seveda, Očiten odgovor je zdaj, ne. In tako je ta program na koncu tiskanjem, kaj bi rekli? Janelle: Ali bi bilo, ste vnesli isto stvar? DAVID J. Malan: Torej, če y je 1 in t je 10? Janelle: Vnesli ste različne stvari. DAVID J. Malan: Točno tako. Vnesli ste različne stvari. V redu. Torej aplavz, če bi lahko, tukaj. [APLAVZ] To je bilo boleče. Vem. Lepo opravljeno. Sedaj pa poglejmo, če ne moremo draži narazen, kaj je fix. In seveda, ko smo določen to-- ki bom zdaj zastopa v green-- smo naredili nekaj izboljšav tukaj. Najprej samo kot duševno zdravje preveriti, sem najprej preveri če je enaka za nično in t enaka null. In samo zato, da bo jasno, morda kdaj s ali t, je ničen v kodi, kot je ta? Ko bi s ali t, je nična. Ja? OBČINSTVO: [neslišno]. DAVID J. Malan: Točno tako. Če niz, da uporabnik vnesli, je predolgo da se prilega v pomnilnik, ali nekatere čudna zadeva kotiček tako, getString, kot bomo videli, dobesedno Danes, v dokumentaciji, pravi, da se bo vrnil null kot posebna sentinel vrednost, ali samo nekakšen poseben simbol to pomeni, da je šlo nekaj narobe. Zato smo želeli preveriti da, saj se je izkazalo da null je zelo nevarno vrednost. Pogosto, če poskusite narediti z nekaj null vključuje function-- tako kratki kot vhod za instance-- to funkcijo Morda bo zelo crash in s tem, sneli svoj celoten program. Torej je to tretja vrstica je sedaj ravno sanity preveriti, preverjanje napak, če hočete. To je dobro navado zdaj nam, da se v vsakem trenutku smo poskusite, da uporabijo vrednost, ki mogočih so nične. Zdaj, v četrti vrstici tukaj "Če strcmp (s, t)," dobro, kaj je to nanaša? No, mi je dejal, da je to zelo jedrnato poimenovana funkcija za godalni primerjavo. In njegov namen v življenju je, da primerjajo njen prvi argument proti drugi, vendar ne glede na njihove naslove, kot smo nehote moment Pred z rdečo oznako, vendar raje primerjati ta dva strune v človeško intuitivno smer s primerjavo tem, proti temu, pred tem, pred tem, in potem ustavljanje, če in ko je eden ali oboje od mojih prstov hits poševnico 0. Torej nekdo pred leti izvajal strcmp izvajati za nas funkcionalnost da smo upali, mi pa bi dobila ga pravkar primerjavo dveh preprostih vrednot. Zdaj pa iskreno, imam risbo vseh teh različnih številk. Ampak realnost je, da sem bil kar ti gor ves čas. In zato naj samo pojdi naprej in Škrabotine ti ven da točke, da se na koncu dneva in napreduje, ne bomo zares skrbi Kaj obravnava stvari dejansko v pomnilniku. Torej, jaz ne grem v pripravi teh vrste številk, toliko več, Jaz sem samo abstraktna to stran malo bolj prijazna s samo puščicami. Z drugimi besedami, če je kazalec, dobro, kaj je to samo pripravi, dobesedno, kot kazalec, puščico od samega za nekaj drugega, in ne skrbi preveč, več o tem pretirane teh naslovov ki je, še enkrat, sem si izmislil anyway. Ampak bomo videli te naslove, Včasih, ko razhroščevanje kode. Zdaj medtem, ta program tu določa, seveda, da je problem s primerjavo teh dveh nizov. Vendar smo naleteli na drugo težavo. To je bilo iz kopije programiranje zadnji čas, , pri katerem sem bil težaven, da izkoristijo samo prvi znak v nizu. Toda kaj je simptom smo videli zadnji čas, ko Vtipkali v vrednosti, kot so Gabe z malimi črkami, za s, potem dodeljena ov v t, kot v tretji liniji tam, in potem sem se potrudil, da izkoristiti t nosilec 0? Kaj je bil učinek spreminjanje t nosilec 0 tukaj? OBČINSTVO: Spremenil s. DAVID J. Malan: Ja, Spremenila sem s, kot tudi. Kajti to, kar se je v resnici dogajalo? No, da vidim, če sem lahko očistite do te slike, kot sledi. Ce je, še enkrat, beseda g, A, B, E, poševnica nazaj, 0, in s bomo nadaljevali risbo v škatli tukaj, ampak nič več naslovov. Nehajmo izdelavo stvari. Reciva, narisati sliko poenostaviti svet. Ko Izjavljam t z godalnim t, da ustvarja ta kos pomnilnika. Square zgodi, da bo 32 bitov v večini računalnikov. V bistvu, če ste že kdaj slišali Računalnik, ki ima 32-bitni arhitekturi, res fancy, rekoč, da je samo pomeni, da se uporablja 32-bitne naslove. In kot tehnična stran, Če ste se kdaj spraševali zakaj starejši računalniki, če ste dejansko poskušala juho jih gor z veliko RAM-a, lahko le največ štirih gigabajtov pomnilnika RAM, dobro, da je zato, ker, dobesedno, vaš stari računalnik lahko le šteje tako visoka kot 4 milijarde evrov, 4 milijarde bajtov, zato, ker je bil z uporabo 32-bitne številke za naslove. Toda v vsakem primeru, v tem Na primer, zgodba je veliko enostavnejša. t je samo še en kazalec, ali res char zvezda, aka niz. In kako želim, da posodobi to sliko zdaj s to drugo vrstico kode, piko, dot, dot? Ko sem naredil niz t enak e podpičjem, kako to sliko spremenilo? Ja? OBČINSTVO: [neslišno]. DAVID J. Malan: Ja. Točno tako. Pravkar sem dal puščico iz t polje na istem naslovu, Enako prva črka v dal. Ali tehnično, če je to moški so še vedno na 0x1, to je, kot da sem imel 0x1 in 0x1 tukaj tukaj. Ampak še enkrat, koga briga o naslovih? To je samo ideja, da je zdaj pomembno. Torej, to je tisto, kar se dogaja tukaj. Torej, seveda, če nimate t konzole 0, ki je matrika zapis, od course-- in odkrito povedano, je videti kot da je matrika tukaj, zdaj pa je to čudno. Vedo, da je programski jezik, C, vam ponuja to funkcijo, pri čemer, čeprav t kazalec, ali e je kazalec, lahko še vedno uporabljate, da je seznanjen, udobno square bracket zapis, da gredo na prvi element, ali drugi element, ali kateri koli element da je ta kazalec kaže da, ker je verjetno, da je, kot v tem primeru, kaže na neko paleto. Torej, kako popraviti to? Odkrito povedano, to je, če je dobil malo prepričljivo na prvi pogled. Ampak tukaj je novo in izboljšano različico. Torej, najprej, jaz dobivam znebite knjižnici CS50, samo, da odkrijete, da je S je dejansko char zvezda, le sinonim. In t je tudi char zvezda. Toda, kaj se dogaja na desna stran od te črte kjer je t dodeljena vrednost? Kaj je malloc? Kaj je strlen? Kaj je sizeof (char)? Zakaj za vraga pa je to linija videti tako zapleteno? Kaj pa počne na visoki ravni? Kaj je to shranjevanje t? Ja? OBČINSTVO: To je dodeljevanje določeno količino pomnilnika. To je za shranjevanje, mislim, črke [neslišno]. DAVID J. Malan: Popolna. Popolna. To je dodeljevanje nekaterih Količina pomnilnika za shranjevanje, domnevno prihodnje pisma. In zlasti, malloc Zato se vrača, kaj? OBČINSTVO: Vračanje [neslišno]? DAVID J. Malan: Točno tako. Vračanje naslov spominom, , ki je fancy način rekel, vrne naslov Prvi bajt tega spomina. Dolžnost mi je, da se spomnimo koliko pomnilnika sem dejansko dodeliti ali prosil za malloc. Zdaj, koliko je to? No, čeprav je Veliko oklepajih tukaj malloc traja samo en argument. In jaz sem z navedbo strlen S, tako da dobimo mi toliko zlogov, kot so v s, toda dodate enega. Zakaj? Ja? OBČINSTVO: Nagibnica 0. DAVID J. Malan: Točno tako. Moramo narediti malo gospodinjstvo. Zato, ker tam je poševnica nazaj 0, da bomo bolje zapomnil. V nasprotnem primeru bomo ustvariti niz, ki nima nobenega posebnega terminator. Medtem, samo, da je super anal, imam sizeof (char), samo v primeru, nekdo teče MY koda ni na CS50 aparata, vendar morda drugačen računalnik Vsega skupaj, kjer znakov so eden bajt, po dogovoru, ampak dve zlogov, ali nekaj večjega od tega. To je samo, da je super, super nenaklonjen do napak. Čeprav v resnici je najverjetneje bo 1. Zdaj, medtem, grem naprej in kopiranje Niz, t bracket i je enak t kotnik s. In bom odložil na prejšnji teden je izvorno kodo, da vidim, kaj se dogaja. Toda ključ takeaway in Razlog, da sem dal kodo zdaj v zeleni, je zaradi tega zelo zadnje vrstice, t bracket 0 enaka toupper, ima učinek Izkoristiti ki niz? t in / ali y? Da je zadnja vrstica kode. Samo t, ker tisto, kar je zgodilo tokrat, če sem nekoliko razveljavite to zadnji korak, kaj se je zgodilo, ko sem poklical malloc, V bistvu sem dobil kos pomnilnika da je enake velikosti kot original, ker to je aritmetična sem. Jaz shranjevanje v t naslov navedene kos pomnilnika. Čeprav to izgleda lepo in lepa, lepo in prazno, Realnost je pa, kaj bova da kliče, smeti vrednosti tukaj. Da je kos pomnilnika morda zelo pa so bili uporabljeni pred, nekaj sekund, pred nekaj minutami. Tako da bi bilo absolutno število ali črke tam, samo po naključju. Ampak oni niso veljavni, dokler nisem Sam zapolnijo ta kos pomnilnika z dejanskimi znakov, kot sem narediti, da je za zanko tam. Vse v redu? Torej sedaj, višek Ti trije primeri da so bili na videz razdeljena zadnji čas, ta primer Swap, ta funkcija delal v smislu da je zamenjal a in b. Ampak to ni delovalo v kakšnem drugem smislu? Ja? OBČINSTVO: [neslišno]. DAVID J. Malan: Točno tako. Če bi bil, da pokličete to funkcijo iz another-- primer, od funkcije, kot glavni, če Moram spremenljivo, X in Y, kot I naredil prejšnji teden, ista številka, in sem mimo v x in y Menjaj, nato pa pokličite Swap-- to, Seveda, je pravilna različica je tisto, kar smo na tem, da vidimo-- ni delovalo. Torej, kaj je fix? No, samo, da je Jasno, pusti me naprej in-- dajte mi eno drugo tukaj in si oglejte če ti lahko pokažejo zadnji, ki bo noter-- da vidimo, če najdem to resnično fast-- OK, [neslišno]. OK, to je to. Torej prezreti ukazov sem samo tipkanje. Želim, da bi jih poiskali na last minute Primer iz zadnjega časa, ki se zdaj imenuje no Swap. Torej ni Swap je, če smo končali zadnji čas, pri čemer sem inicializiran x 1 in Y 2. Nato sem poklical Menjaj, ki poteka v 1. in 2.. In potem je ta funkcija delal v nekem smislu, vendar ni imela trajno vpliva na x in y. Torej vprašanje na dlani pa je, kako zdaj bomo dejansko rešili ta problem? Kaj je rešitev na dlani? No, v swap.c, ki je novo danes opazili nekaj razlik. X in Y sta enaka. Toda kaj je jasno razlikujejo glede linije 25? Kaj je novega tam, če se spomnite kar je bilo videti kot sekundo? OBČINSTVO: [neslišno]. DAVID J. Malan: Ja. Torej ampersands nov kos sintakse ne le v tem programu, ampak tudi na splošno v CS50. Do danes, mislim, da ne smo videli nobene primere ali res govoril o njih v katerem koli detajl, razen, morda, preemptively v oddelku, ampersand takole. No, izkazalo se je ampersand je eden zadnjih kosov nove sintakse bomo naučili. Vse to pomeni, naslov neke spremenljivke. Na kateri naslov pa x živi? Toda kaj, naslov pa y živi? Ker če Temeljni problem, preden je pa smo opravili, da sta x in y kot je izvodov, kar si resnično želite storiti je zagotoviti Menjaj s podobno zakladu zemljevid, ki vodi do mesta, kjer x in y dejansko v RAM, tako da Swap lahko sledili temu zemljevid in iti kamorkoli x ali y označuje mesto in spreminjanje dejanske vrednosti 1 in 2 tam. Torej Swap mora tudi nekoliko spremeniti. In na prvi pogled se to lahko zdi malo podobna char zvezda. In res je. Tako da je kazalec na kakšne vrste podatkov, temelji na tem izpostavil dela? Torej je int. Torej ni več int to je naslov int. In podobno, se b zdaj dogaja da je naslov int. Torej, ko sem zdaj poklical Menjaj iz Main, Ne grem, da bi zamenjali 1 in 2. Bom dal to všeč Ox-nekaj in Ox-nekaj, dveh naslovov, ki bodo vodile Swap na njihovih dejanskih mestih v spomin na mojem računalniku. Torej, zdaj, moj preostali izvajanje se mora spremeniti tad. Kaj je zdaj očitno drugačna v teh treh vrstic kode? Tam te preklete zvezde vse nad krajem, v redu? Torej, kaj se tukaj dogaja? Ja? OBČINSTVO: Očitno [neslišno]. DAVID J. Malan: Točno tako. Torej v tem context-- in to ni bilo najboljša odločitev, design, seveda, pred leti. V tem primeru, ko imate le zvezdo, in nimate podatkovni tip, kot int, takoj na levi, Namesto imate enačaj, je jasno, v zvezi s tem, ko praviš, zvezda, kar pomeni, da gre za naslov, ki je v. Sledite zemljevid zaklada, tako rekoč. In medtem, v skladu 37, to pomeni isto stvar. Pojdi na naslov a, in dal kaj tam? Vse, kar je v lokacija, ki določa, b. Z drugimi besedami, pojdite na b. Spravi te vrednosti. Pojdi na in, na enak podpisati, operator naloga, dal, da je vrednost tam. Podobno, int temp je samo int. Nič ni treba spremeniti zaradi temp. To je samo rezervna stekla iz Annenberg za malo mleka ali pomarančnega soka. Vendar mi treba povedati, pojdite na b. Pojdite na ta kraj in dal vrednost temp tam. Torej, kaj se je zgodilo potem? Ko sem dejansko poklical Menjaj ta čas, če ta prvi pladenj tukaj predstavlja Main, ta drugi pladenj predstavlja Menjaj, ko I mimo ampersand x in y ampersand od Main Menjaj, samo da bo jasno, kaj je to kup okvir za sprejemanje? Ja? OBČINSTVO: [neslišno]. DAVID J. Malan: Točno tako. Naslov x in naslov y. In lahko si misliš o teh kot poštnih naslovov. 33 Oxford Street in 35 Oxford Street, in ti želite premakniti dve stavbi da so na teh lokacijah. To je nekako smešno idejo, ampak to je vse, kar mislimo z naslovom. Kje na svetu se lahko boste našli tiste dve ints? Kje na svetu lahko storite najti tiste dve stavbi? Torej, če na koncu, po vsem tem času sem iti v današnjem izvorno kodo in pripravijo Swap in rok ./swap, končno, za Prvič, ko bomo dejansko videli, da moje vrednote imajo dejansko uspešno zamenjala. In zdaj, bomo lahko celo zaznamek o tem, recimo, GDB. Zato naj gredo v isto datoteko. Dovolite mi, da gredo naprej in zagon gdb za ./swap. In zdaj, Swap, jaz grem naprej in nastavite točko lomljenja na Majni. In zdaj bom šel naprej in zagon programa. In zdaj vidimo svojo kodo začasno ustavljeno na tej liniji. Če grem naprej in print x, kaj naj jaz vidim tukaj? To je vprašanje. Ponovim? OBČINSTVO: [neslišno]. DAVID J. Malan: Torej naključnih števil, morda. Mogoče sem imel srečo, in to je lepo in preprosto, kot 0. Toda morda je nekaj naključnih števil. V tem primeru, sem srečen. Samo se zgodi, da bo 0. Ampak to je res sreča, saj ne, dokler sem tip zraven, potem pa print x ima ta vrstica kode, vrstica 19 je, usmrčen. Medtem, če sem tip zraven še enkrat, in Zdaj natisnete y, bom videl 2. Zdaj, če sem tip zraven, da se bo malo zmedeno, ker zdaj, printf se dogaja, da se pojavi na zaslon, kot je to storila. x je 1. Naredimo to še enkrat. In zdaj, tukaj, kjer stvari postanejo zanimive. Preden kličem Menjaj ali celo korak vanj, vzemiva malo pokukati. x je spet, 1. Y je, seveda, hitro Prečistil preverite, 2, tako da ni težko tam. Toda kaj je ampersand x? Odgovor, to je nekako funky iskal. Vendar int zvezda v oklepaju je samo GDP na način rekel, da je to naslov. To ni int, da je kazalec na int ali drugače znana kot naslov. Kaj je to noro stvar? Še nikoli nismo videli kaj prav tako pred tem. Torej je to naslov v moj računalnik je Spomin, kjer x zgodi, da živijo. To je Ox-nekaj. In to je, odkrito povedano, zakaj Sem začel risati puščic, namesto številk ker je res mar da je vaša int na posebno naslov, ki je tako velik. Toda bffff0c4, to so vsi Pravzaprav šestnajstiških številk, ki so 0 do f. Torej ne bomo bivali tudi Dokler o tem, kaj te stvari so. Ampak, če sem izpisal y, Seveda, sem videl 2. Vendar ampersand y, vidim ta naslov. In obvestilo, za radovedne, kako daleč narazen sta x in y? Lahko prezreti najbolj naslova. Štiri bajte. In da je v skladu z našimi prej, trdijo, da je int, kako velik? Štiri bajte. , Tako da izgleda kot da je vse v oblogo navzgor lepo, kot si morda upam, v spomin. Torej, zdaj, kaj je samo hitro naprej na koncu te zgodbe. Pojdimo naprej in tip korak, da se potopite v funkciji Swap. Zdaj opazil, če sem tip, to je enak naslov x. Če sem tipa B, je enaka na naslov y. Torej, kaj naj vidim, če sem pravijo, pojdite na naslov, ki je? Torej tiskanje zvezda. Tako zvezda pomeni iti tja, v tem kontekstu. Ampersand pomeni, kaj je naslov. Torej zvezda sredstvo 1. In print zvezda b mi daje 2. In mi prevzame, za trenutek, da vsaj kodo, ki nadaljuje izvršiti zdaj lahko obrazloženo skozi ta način. Vendar bomo ponovno to idejo kmalu. Tako da je ta različica Swap Zdaj je pravilna in omogoča nam, da bi zamenjali to posebno vrsto podatkov. Torej, vsa vprašanja pa na Swap? Na zvezdo? Na naslov? In videli boste, z problem nastaviti 4, vrsta, ampak problem nastaviti 5, zagotovo, kako ti stvari, ki so koristne in dobili še veliko več udobno z njimi, kot rezultat. Sploh kaj? V redu. Torej malloc je, še enkrat, ta funkcija da samo razporeja spomin, spomin dodelitev. In zakaj je to koristno? No, ves ta čas, ste uporabljali malloc. Če menite, da je sedaj, kako getString dela, verjetno pa je spraševal nekoga za kos spomin, kadarkoli tipe uporabnikov niz leta, saj je prav gotovo ni vedel, kot osebje CS50, kako velik ti strune, da ljudje se dogaja, da tip lahko. Torej, prvič, začnite lupine nazaj, kako deluje CS50 knjižnica, s pomočjo nekaj primerov ki nas bo pripeljalo tja. Torej, če sem odprla gedit in odpirajo scanf 0, bomo videli naslednjo kodo. Scanf 0, na voljo na spletni strani za danes ima relativno malo vrstic kode tukaj, 14 s 20. In poglejmo, kaj dela. Izjavlja, int, imenovano x. Pravi nekaj podobnega, število prosim. In zdaj je pravi scanf% i, in x. Torej, tam je kup novih stvari tam. Ampak scanf lahko nekako mislim od kot nasprotje printf. printf seveda izpiše na zaslonu. scanf nekako skandiranje od uporabnikov Nekaj ​​tipkovnica je on ali ona tipkal. % I je tako kot printf. To pomeni, da pričakujemo uporabniku, da tip int. In zdaj, zakaj misliš, da sem lahko poteka scanf & X? Če je namen v življenju scanf je, da bi dobili nekaj od uporabnika, kaj je pomen to poteka, in x, zdaj? Ja? OBČINSTVO: [neslišno]. DAVID J. Malan: Točno tako. Karkoli, človek, vnesite, svoj vhod se bo shranjeni na tej lokaciji. To ne zadostuje, se spomni, da samo preide v x, ker smo že videli, kadar koli se boste peljali le surovo spremenljivko kot notr, do neke druge funkcije, seveda, lahko spremeni, da spremenljiv, vendar ne za stalno. Ne more imeti vpliva na Majni. To se lahko spremeni samo svojo lokalno kopijo. Ampak, če namesto tega pa ne daj mi dejansko int, vendar mi daje navodila da int, sem zdaj, da scanf, zagotovo ne morem sklepati, da obravnavati in dal nekaj tam tako imate dostop do nje, kot tudi. Torej, ko sem teči ta program, pa poglejmo. Naredite scanf 0 dot poševnica, scanf 0. In če bom zdaj vnesite številko kot 50, hvala za 50 let. Če bom sedaj vtipkajte številko, kot je negativna 1, za negativno 1. Sedaj vnesite številko kot 1,5, hm. Zakaj me je moj program prezreti? No, ker preprosto sem povedal je pričakovati, da bo le int. V redu. Torej, to je ena verzija tega. Vzemimo stvari gor zarezo in Predlagam, da to ni dobro. In tu se skriva zelo preprost primer kako lahko začnemo pisanje kode da lahko drugi ljudje izkoriščajo ali kompromise, ki jih počne slabe stvari. Torej linija 16, tako podobna v duhu, da pred, ampak ne bom ga razglasi int tokrat. Jaz sem ga razglasi zoglenel zvezdo, aka niz. Toda kaj to v resnici pomeni? Torej, če ne podate address-- in Jih bom samovoljno, buffer, ampak jaz bi poklical je to, da je simple-- in potem sem to narediti, razloži mi, če bi lahko, glede na prejšnje logika, kaj je scanf počne v vrstico 18, če prelaz% s in pufra, ki je naslov? Kaj je scanf, če se prijavite popolnoma enaka logika kot različica 0, dogaja, da poskušajo narediti tukaj, ko uporabnik vnese nekaj v? Ja? OBČINSTVO: [neslišno]. DAVID J. Malan: Točno tako. Scanf, ki jih logika prej, bo trajalo niz da človeško natipkane noter-- je sedaj niz, to ni več, verjetno, če je on ali ona cooperates-- in to se dogaja, da poskušajo dal, da Niz v spomin na kateri koli naslov buffer določa. In to je super, ker pufra je res mišljeno, da bo naslov. Ampak Trdim ta program je buggy v Zelo resen način, ker tisto, kar je vrednost buffer privzeto? Kaj sem inicializiran v? Kaj kos pomnilnika? Imam ne, kajne? Torej, čeprav sem namenila char zvezda, ki je ni več poklical s, to je namesto tega pozval, buffer-- tako dajmo pripraviti ime spremenljivke zdaj kot buffer-- če nimam imenovano getString ali malloc tukaj, da dejansko pomeni, da buffer je le nekaj smeti vrednost. Kaj to pomeni? To pomeni, da sem povedal scanf pričakovati niz od uporabnika. In veste kaj? Ne glede na to, kar se kaže da-- in rišem vprašaj, ampak v resnici gre, da bi nekaj podobnega OX1, 2, 3, kajne? To je nekaj lažne vrednosti, ki so pravkar zgodi, da bo tam od prej. Torej, povedano drugače, to je kot da buffer je le kaže, da nekaj v spomin. Nimam pojma, kaj. Torej, če sem tip v Gabe zdaj gre prizadevanje, da bi g-A-B-E / 0 tam. A kdo ve, kaj je to? In v preteklosti, koli Čas, ki smo jih skušali dotakniti spomin, ki ne pripadajo nam, kaj se je zgodilo? Ali skoraj vsak čas. Segmentacije krivda, kajne? Ta puščica, nimam pojma, kje je kazalno. to je samo nekaj naključno vrednost. In seveda, če si razlagajo naključno vrednost kot naslov, boš šel na nekaj naključno destinacija. Torej Gabe morda celo crash moj program v tem primeru tukaj. Torej, kaj lahko storimo, da je to skoraj tako slabo? Da je to tretja in Zadnji primer scanf. Ta različica je boljša v kakšnem smislu? Če ste zadovoljni s Prejšnja problem, to je bolje. Zakaj? OBČINSTVO: [neslišno]. DAVID J. Malan: Dobro. Tako da je ta primer linije 16 Bolje je, v smislu da smo izrecno dodelitvi nekaj pomnilnika. Mi ne uporabljate malloc, smo s pomočjo teden 2 Pristop pravkar razglasitvi niz. In ko smo že povedal, da je niz je le nabor znakov, tako da je to povsem legitimno. Ampak to je, seveda, kot je opazite, fiksne velikosti, 16. Tako da je ta program popolnoma varno, če sem tip v kito en znak, dvomestna strune, 15 nizov znakov. Toda takoj, ko začnem tipkati 16, 17, 18, 1000 nizi znakov, če je ta niz bo končalo? To se dogaja, da se na koncu deloma tukaj. Potem pa kdo ve kaj še je za mejami te zlasti niz? To je, kot da imam razglasila 16 škatel tukaj. Torej, namesto da potegnili vseh 16, se bomo Pretvarjaj se, da sem se sestavi 16. Ampak, če sem nato poskusite prebrati niz To je veliko več, kot 50 znakov, Jaz bom za začetek dajanje a, b, c, d, x, y, z. In to je verjetno nekateri drugi pomnilnik odsek da, še enkrat, lahko povzroči moj program zruši, ker si nisem prosil za kaj več kot le 16 bajtov. Torej, koga briga? No, tukaj je knjižnica CS50. In večina je to le kot navodilih up vrhu. Knjižnica CS50, ves ta čas, je imel to vrstico v vrstici 52. Videli smo typedef, ali boste videli typedef v pset 4, ki samo ustvarja Sinonim katerim lahko znak zvezdica več preprosto besedilu niz. Torej to je eden Nekaj ​​kolesa usposabljanje smo na skrivaj uporablja pod pokrovom. Medtem, tukaj je funkcija, getchar. Zdaj je očitno, da ni telo za to. In v resnici, če obdržim drsenje, jaz pravzaprav ne vidim nobenih izvedb teh funkcij. Kot preverjanje razumnosti, zakaj je to? OBČINSTVO: [neslišno]. DAVID J. Malan: Ja. Torej je ta datoteka glave. In header datoteke vsebujejo prototipov, plus nekatere druge stvari, kot se zdi, kot typedefs. Toda v CS50.c, ki smo jih Nikoli vam ga je dal dokončni, vendar je bil v CS50 aparata vse ta čas, globoko v svojih mapah, opazite, da je celotna kup funkcij tukaj. V resnici pa se pomaknite navzdol. Pojdimo prezreti večina od njih, za zdaj. Vendar se pomaknite navzdol do getInt in videli, kako getInt deluje. Torej, tukaj je getInt. In če si kdaj res bilo mar, kako priti int deluje, tukaj je njegova dokumentacija. In med stvarmi pravi, je to vam pove kaj se stopnje vrednosti, se lahko vrne. To je v bistvu negativen 2 milijardi pozitivnega 2 milijardi, vzemi ali pusti. In izkazalo se je, vse to čas, čeprav smo jih nikoli bi morali preveriti za to, če gre kaj narobe, Izkazalo se je, da so vsi Tokrat getInt ima oglaša posebna konstanta, ni nič, ampak int_max, ki je Konvencija le za programerja. To tukaj pomeni, posebno vrednost. Poskrbite, da preverite, ali je to, samo če gre kaj narobe. Vendar smo se nikoli ne moti s tem do danes, ker je tudi to je mišljeno, da poenostavi. Toda kako getInt se izvajajo? No, ena, je potrebno nobenih argumentov. Vemo, da je. Se vrne int. Vemo, da je. Torej, kako to deluje pod pokrovom? Torej je očitno neskončno zanke, vsaj videz enega. Opazimo, da smo s pomočjo getString. Torej, to je zanimivo. getInt poziva naša lastna funkcija, getString. In zdaj, zakaj bi se to zgodilo? Zakaj sem pa defenzivno tukaj v skladu 165? Kaj bi se lahko zgodilo v skladu 164, samo da bo jasno? To je odgovor enak kot prej. Lahko samo iz spomina. Gre kaj narobe z getString, imamo, da lahko, da zmorem. In razlog, da se ne vrne null, je da, tehnično, null kazalec. getInt mora vrniti int. Tako sem samovoljno odločila, da v bistvu, da 2 milijardi, gor ali dol, se bo biti posebno vrednost, da ne morem nikoli dejansko dobili od uporabnika. To je samo ena vrednost bom za odpadke, ki zastopa kodo napake. Torej sedaj, se stvari malo fancy. In to ni čisto isto funkcijo kot prej, vendar je zelo podobna. Tako obvestilo, izjavljam tu, v skladu 172, tako int n in char c. In potem sem uporabljati to funky linije, sscanf, kar se je izkazalo ne išče niz iz tipkovnice. Stoji obstoječi niz, ki Uporabnik že vnesli. Zato sem že pozval getString, ki pomeni, da imajo niz v spominu. sscanf je tisto, kar bi pokličete funkcijo razčlenjevanju. Videti je na vrvici sem vnesli v, po znakih, in naredi nekaj koristnega. Ta niz je shranjena v liniji. In vem, da lahko le tako, da greste nazaj gor in rekel, oh, OK, Klical sem ga, ne s tem čas, ampak linijo. In zdaj je to malo drugače. Vendar to dejansko pomeni, zaradi bomo nekoliko mahati z rokami na danes, da smo za preverjanje vidim, če uporabnik vtipka in int in morda še en znak. Če uporabnik vtipka notr, to je dogaja se shranijo v n, ker sem poteka to po naslovu, nov trik, ki smo jih videli danes. Če Vtipkali tudi v kot 123x, da x se bo končalo Pismo iz znakov c. Zdaj se je izkazalo, da je sscanf mi bo povedal, inteligentno, koliko spremenljivk je sscanf Uspešno sposobni izpolniti. Torej s to logiko, če funkcija Jaz izvajanje je getInt, vendar sem preverjanje, potencialno, za uporabnika , da so vnesli v notr sledi nekaj drugega, Kaj hočem sscanf je vrne vrednost resnično biti? Če je namen, da bi dobili samo int od uporabnika? Torej, če sscanf donosi 2, kaj to pomeni? Uporabnik vtipka nekaj podobnega, dobesedno, 123x, ki je samo nesmisel. To je prišlo do napake, in Želim, da preverite to. Torej, če uporabnik vnese to, s ta logika, kaj sscanf vrniti, bi rekel? Tako se dogaja, da se vrnete 2, saj 123 je šel noter, in x se bo končalo tukaj. Ampak jaz ne želim x vas bo napolnil. Želim sscanf le uspelo polnjenje prvi njenih spremenljivk. In da je, zakaj sem sscanf želijo vrniti 1. In če je to malo nad glavo za trenutek, da je popolnoma v redu. Zavedaj se, čeprav, da je eden od Vrednosti getInt in getString je, da delamo vraga Veliko napak preverjanje, kot je ta, da da je do danes, lahko precej tip ničesar na tipkovnici, in ga bomo ujeli. In prav gotovo, osebje, zagotovo ne bo lahko vir napake v vašem Program, ker smo pri obrambnih preverjanje za vse neumne stvari, ki jih lahko uporabnik stori, kot tipkanje niz, ko si res želela int. Torej za sedaj-- pridemo nazaj na to, preden long-- vendar ves ta čas, getString in getInt imajo bil pod pokrovom z uporabo tega Osnovna ideja naslovov pomnilnika. Torej, zdaj, naredimo stvari malo bolj uporabniku prijazen. Kot se morda spomniš, od Binky zadnji enkrat bom vprašal, če se bo moja miška tako sodelovati-- smo imeli to kodo, ki odkrito povedano, je precej nesmiselno. Ta koda doseže nič koristna, vendar pa je bil primer da profesor Parlante uporablja za predstavljajo kaj se je dogajalo v program, ki vključuje spomin. Torej, kaj je to Prepričati Zgodba super kratko. Ti prvi dve vrstici, v Angleški, pa kaj bi rekli? Samo v razumno človeško, toda nekoliko tehnični pogoji, bo zabodel. OBČINSTVO: [neslišno]. DAVID J. Malan: OK, ti ustanovitvi naslove za vaše x in y spremenljivk. Ne povsem, saj sta x in y ne spremenljivke v tradicionalnem smislu. sta x in y naslovi ali bo shranil naslov. Torej, poskusimo še enkrat. Ni slab začetek, čeprav. Ja? OBČINSTVO: [neslišno]. DAVID J. Malan: Dobro. Mislim, da je malo čistejši. Razglasitvi dveh kazalcev, dve celi števili. In smo jim kliče x in y. Ali pa, če smo bili, da pripravi To so slike, še enkrat, opozarjajo, preprosto, da vse delamo s tem prvo vrstico je risba polje, kot je ta, z nekaj smeti vrednost v tem, in kliče x, in nato drugo polje, kot je ta, z nekaj smeti vrednostjo v njem, ga kliče y. Mi smo razglasila dva kazalci, ki na koncu bo shranil naslov int. Tako, da je vse tam. Torej, ko Binky je to storil, glina samo pogledal takole. In Nick nekako zaokrožila puščice, kot da oni ne kaže nikamor še zlasti, ker oni so samo smetarska vrednosti. Oni niso izrecno inicializiran kjerkoli v posebej. Zdaj naslednja vrstica koda, odpoklic, to je bilo. Tako da v razumno uporabniku prijazen, vendar nekoliko tehnična angleščina, kaj je ta linija koda počne? Ja? OBČINSTVO: [neslišno]. DAVID J. Malan: Popolna. To je dodelitev kos spomin, da je velikost notr. In to je pol odgovor. Odgovoril si pravico polovica izražanja. Kaj se dogaja na levi strani enačaja? Ja? OBČINSTVO: in daje je v spremenljivko x? DAVID J. Malan: in daje je na spremenljivko x. Torej, da Rekapitulacija, desna stran razporeja dovolj pomnilnika za shranjevanje int. Vendar malloc posebej vrne naslov te kos pomnilnika, ki youve le spremembe dobi shranjena v x. Torej, kaj Nick storil zadnjič z Binky je je vlekel ta kazalec ven, glina, točko sedaj na beli kos pomnilnika da je enaka velikosti notr. In res, to je pomenilo, da predstavljajo štiri bajte. Sedaj, naslednja vrstica kode je to storil, zvezda x dobi 42. Torej 42 je enostavna za desna stran, smisel življenja. Leva stran, zvezda x pomeni kaj? Tudi to bi lahko gone--, da je v redu. OK. OBČINSTVO: V bistvu, pojdite na [neslišno] DAVID J. Malan: Dobro. OBČINSTVO: [neslišno]. DAVID J. Malan: Točno tako. Leva stran pomeni, pojdite na x. x je naslov. To je kot 33 Oxford Street ali OX1. In zvezda x pomeni, da gre za obravnavati in dal kaj tam? 42. Torej res, da je točno to tisto, kar Nick storil. Začel je s stranske, v bistvu, duševno kaže s prstom x, po puščica na belem okvirčku na desni strani side, in dajanje številko 42 tam. Ampak potem se stvari malo nevarno, kajne? Binky je na tem, da izgubi glavo. Star y enaka 13, smolo, kaj pomeni? Torej zvezdic y pomeni iti na naslov v y. Toda kaj je naslov v y? V redu, to je smeti vrednost, kajne? Sem jo narisal kot vprašajem. Nick jo narisal kot zvita puščico. In takoj, ko boste poskušali storiti zvezdicami y, rekoč tja, vendar ni zakonita naslov, to je nekaj lažne lokacije, Program bo crash. In Binky glava se dogaja za letenje off tukaj, kot je to storila. Torej, na koncu, s tem programom je samo ravno ven napako. To je bil program, buggy. In bi ga bilo treba popraviti. In edini način, res, da se določi bi bilo, na primer, ta vrstica, ki jih sploh ni dobil, da, ker Program strmoglavilo prezgodaj. Ampak, če smo bili, da popraviti to, kaj Učinek ne počne y enake x imate? No, v bistvu navaja y na ne glede na vrednost x je obrnjena. Torej, v Nickovi zgodbi, ali Binky zgodba, tako x in y so obrnjena bel kos pomnilnika, tako, da na koncu, ko te Ne zvezda y enaka 13 spet, končaš dajanje 13 v primerno lokacijo. Torej, vse te linije so popolnoma legitimna, razen ta, ko se je zgodilo pred vami y dejansko dodeli neko vrednost. Zdaj na srečo, vam ni morali razmišljati skozi vse tovrstnih vprašanj na svoje. Dovolite mi, da gredo naprej in odprite do terminala okno tukaj in odpirajo, za trenutek, super kratek program, ki Prav tako je nekako nesmiselno. To je grdo. To se ne doseže nič uporabnega. Ampak to ne dokaže vprašanja pomnilnika, tako da je lahko pogled. Main, super enostavna. To očitno kliče funkcijo, f, in nato vrne 0. To je nekako težko pokvari tega. Torej Main je precej dobro, tako daleč. Torej f je problematično. In ravno ni dal veliko napor v to poimenovanje sem, da bo poudarek na kodo. f ima dve vrstici. In poglejmo, kaj se zdaj dogaja. Torej, na eni strani tu-- in dovolite mi, da to v skladu s prejšnjo Primer-- na eni strani, leva je to, kar v angleščini? To je-- OBČINSTVO: Ustvarjanje kazalec. DAVID J. Malan: Ustvarjanje kazalec za notr in kliče je x. Torej, to je ustvariti eno od teh polj Držim risanje na zaslonu na dotik. In zdaj, na desni strani stran, malloc, seveda, se dodelijo kos pomnilnika. In samo zato, da bo jasno, kako pomnilnika je to očitno dodelitvijo, če vas le nekakšen math tukaj? Torej, to je 40 bajtov. In vem, da samo zato, ker vem, int na CS50 aparata, vsaj je štiri bajte. Torej 10-krat 4 je 40. Torej, to je shranjevanje x, naslov prvega od 40 ints da so bili dodeljeni prostor nazaj, nazaj, nazaj, na hrbtni strani. In to je tisto, kar je ključnega pomena zaradi funkcije malloc. To ne bo malo pomnilnika tu, malo tu, malo tukaj. To vam daje en kos pomnilnika, contiguously, od poslovnih sistem. Kaj je zdaj to, x bracket 10 enaka 0? Samovoljno vrstica kode. To se ne doseže nič uporabnega. Zanimivo pa je, saj x nosilec 10--? Ja? OBČINSTVO: [neslišno]? DAVID J. Malan: x bracket 10 ni nujno, da je nična. Podrobnosti null šele prihaja v poštev z vrvicami, na koncu niza. Ampak dobra misel. Kako velika je ta matrika, čeprav čeprav sem namenila 40 bajtov? To je od 0 do devetih, kajne? To je 10 ints, skupaj. 40 bajtov, ampak 10 ints, indeksirane 0 s 0. Torej, kaj je to x nosilec 10? To je pravzaprav nekaj neznano vrednost smeti. To je spomin, ki ne pripadajo meni. Ne bi dotikal Številka 41, 42, 43, 44 bajt. Jaz sem nekoliko pretirana. In res, če sem teči ta Program, bi bilo zelo dobro sesuje. Ampak včasih, bomo imeli srečo. In tako, samo da dokaže to-- in odkrito, nikoli ne veš, pred vami Ne tem-- pa vodijo to. To dejansko ni crash. Ampak, če sem to spremenili, za primer, da bi izgledal kot 1000, da bi se to res namerno, pa poglejmo če lahko dobim crash tokrat. OK, da ne crash. Kako približno 100.000? Naj ga remake, in zdaj ga zaženite. OK. Fuj. V redu. Torej, očitno, še enkrat, ti segmenti pomnilnika, tako rekoč so razmeroma velika, tako da bomo lahko priti spet in spet srečen. Ampak na koncu, ko boste dobili smešno in res daleč ven na zaslonu, se dotaknete spomin, da res, res ne pripada tebi. Vendar odkrito povedano, to vrst hroščev se dogaja da je težje in težje ugotoviti sami. Toda na srečo, kot programerji, imamo orodja, ki nam omogočajo, da to stori za nas. Torej to je, morda, ena od najgrša programov, še grši kot izhod GDB je. Ampak to je vedno črto ali dva, ki so zelo koristni. Valgrind je program, ki pomaga niste debug program, per se, toda našli povezano s pomnilniške Težave, posebej. To bo samodejno zagnala svojo kodo za ti in poglej za vsaj dve stvari. One, si naredil nekaj naključna, kot spomin na dotik da ne pripada tebi? To vam bo pomagal najti primere. In drugič, da vam bo pomagal boste našli nekaj, kar se imenuje pomnilniške puščanje, ki jih imamo popolnoma prezrt, naivno, za nekaj časa in blaženo. Ampak se je izkazalo, vse ta čas, kadar je to ste jih imenuje getString v toliko naših programov, ste asking poslovanja Sistem za spomin, vendar imate spomin od kdaj ga daje nazaj, delaš unalloc, ali free, kot je pozval. Ne, ker nikoli nismo vas prosimo, da to storijo. Ampak vse to čas, programi pišete v C so pušča spomin, prosi poslovanja Sistem za bolj pomnilnik za godala in drugih malenkosti, ampak nikoli ne odnesete nazaj. In zdaj je to malo iz poenostavljanje, ampak, če ste kdaj zagnati vaš Mac ali računalnik že nekaj časa, otvoritev Veliko programov, morda zapiranje programov, in čeprav si Računalnik ni strmoglavilo, to je že tako veliko počasnejši, kot da je to res z veliko pomnilnika ali sredstev, čeprav če nisi niti pritiskom na tipkovnico, da bi bilo-- vendar ne zmeraj-- bi je, da so programi delate imajo sami spomin razpoka. In vodijo prosi OS za več in več pomnilnika, vendar pozabljamo na to, dejansko ne uporabljajo, vendar Zato ob spomin stran iz drugih programov, ki bi to želeli. , Tako da je skupna razlaga. Zdaj tukaj je, kjer je Valgrind izhod je popolnoma odvratne do tistih manj in bolj udobno podobni. Ampak zanimivo stvar je tukaj gor. To mi je povedal neveljavno pisati o Velikost štiri zgodi v tem programu, zlasti na liniji 21 memory.c. Če grem na linijo 21, hm, je res je neveljaven write velikosti štiri. Zakaj velikost štiri? No, to number-- in lahko anything-- je int. Torej, to je štiri bajte. Torej bom dal štiri bajte če ne pripadajo. To je tisto, Valgrind pravzaprav mi povedal. Poleg tega bo tudi to povej mi, kot bomo videli, kot zaženete to v prihodnjem pset, če in ko ste ušli spomin, ki ga sicer Imam, ker sem poklical malloc, vendar imam dejansko ne imenuje, v tem primeru, brez, katerih bomo sčasoma videli je nasprotje funkcije malloc. Torej, zdaj, mislim, končno zgled. Torej, to je malo več Skrivnosten, vendar je morda Največji razlog, da bodite previdni s spominom, in razlog, da mnogi programi in / ali spletnih strežnikov, tudi na ta dan, prevzemal slabih fantov nekje na internetu, ki so nekako pošiljanje lažnih paketov s strežnikom poskuša ogroziti svoje račune, ali pa svoje podatke, ali pa samo običajno prevzame stroj. Prekoračitev medpomnilnika, kot ime pove, sredstva prepolno ne int, ampak varovalo. In buffer je samo fancy način bi rekel, da je kup pomnilnika. In res, sem poklical niz pred buffer, namesto s. Ker če je buffer, kot v smislu, YouTube, ali kadarkoli gledate video, ste morda videli besedo buffering, pika, pika, pika. To je zelo nadležno. In to samo pomeni, da vaš video predvajalnik poskuša prenesti veliko bajtov, veliko bajtov iz videa na internetu. Ampak to je počasna, tako da poskuša prenesti kup njih zapolniti pufer, vsebnik, tako da imate dovolj bajte, da lahko potem vam pokažem video, brez premori ves čas. Ampak se je izkazalo, da lahko ima varovalo za tako velik. Vendar poskusite dati toliko podatkov je, in zelo slabe stvari se lahko zgodi. Torej za primer si oglejmo ta zadnji teaser za primer. To je še en program, da, na prvi pogled, ne naredi ničesar super uporabne. Ima glavno funkcijo ki zahteva, da je funkcija, f. In da je funkcija f, tu ima char niz, ki se imenuje c, velikosti 12. In potem je z uporabo tega Nova funkcija imenuje strncpy. Izkazalo se je, da je s to preprosto, preprosta vrstica kode, le dve vrstici, smo naredili svoj celoten program, in zato je moj celoten računalnik, in moj uporabniški račun, in moje trdo voziti potencialno ranljiva za vsakogar kdo ve, in je dovolj dober, da delujejo ta program z določeno ukazno vrstico argument. Z drugimi besedami, če je ta slab človek postavlja znotraj argvargv [1], ki jih vnesete na tipkovnici zelo posebej oblikovana niz, ne abc, 123, toda v bistvu binarnih simbolov izvršljiv koda, program, ki je on ali ona je zapisal, s tem preprostim programom, ki je Predstavnik tisoče programov , ki so prav tako ranljivi, si trditi, on ali ona lahko dokončno izbrišete vse datoteke na mojem trdem disku, dobite utripa poziv, tako da je on ali ona lahko vpisovati ukaze na svoje, email vse datoteke zase. Vse, kar lahko storim, je ali ona lahko storite s to kodo. Ne bomo povsem rešila to še. In v resnici gre za vključuje malo sliko kot je ta, ki bomo kmalu razumeti vse bolje. Ampak za danes, pa se konča kaj je, upajmo, nekoliko bolj Razumljivo XKCD šala, dokler ne bomo spet naslednjič. V redu. Se vidimo v sredo. [Predvajanje glasbe] SPEAKER: In zdaj, globoko misli, ki jih Daven Farnham. Spomin je kot skok v kup zlatimi listi na nedeljsko popoldne. Veter piha, premetavala vaš lase-- oh, pogrešam dnevi when-- [Smeh]