[Predvajanja glasbe] DAVID J. Malan: Prav to je CS50 in to je začetek petih teden. Torej danes, pod vašim sedežnih blazin, ne boste našli ničesar. Predvsem pa bi morali najti to, majhen znak naše presoje za vse delo, ki ga dajo v igri petnajsterice. Preprosto odstranite majhen krog na dno, da začnete igrati za Preostali del razreda. Tako opozarjajo, da ali vedo, da je problem iz štiri, ki je šla ven ta vikend, vključuje pisanje drugo igro. Ampak tokrat gre za uporabo Dejansko grafični uporabniški vmesnik, ne tekstovni vmesnik, kot Igra petnajsterice je bil. In igra, ki je pred vami, če ste še videli to naslednji, Izgleda malo nekaj takega. Jaz grem v mojo terminal Okno tukaj v GDB. In jaz grem naprej in zagon Rešitev osebje, ki lahko dostopate po zagonu posodobitev 50 kot ponavadi. Ampak jaz ga bom dal v malo skrivnost način, malo Pirh, tako imenovani način Bog, ki ga dajanje Boga v argv1. In moram upoštevati svoje lastne usmeritve, da teče v moji Problem nastavite imenik. Torej, zdaj boste videli popolno različico v igri Breakout. V bistvu je to način no-roke. Torej je pravzaprav - navdušili, čeprav boste morda - precej nepomembno za izvajanje načina Boga v Zlom, za razliko od igre petnajsterice ki bi lahko bili nekateri od vas rešiti za izdajo hacker. V Breakout zadostuje v Boga Način za preprosto storite kaj, intuitivno z veslom? Samo da bo enaka ne glede na vodoravni položaj je žogo. In tako dolgo, kot ste to naredili v lockstep z žogo premika to igro se bo nikoli, nikoli, nikoli zamudili žogo in boste zmagali vsakič. Toda v hacker izdaje tega tedna tam je več kot le način Boga. Obstaja več drugih funkcij. Med njimi laserji. Tako da če si res dobil nestrpni ste Lahko začnete sestrelil opeke in še nekaj drugih. In za tiste, ki bi radi umerjanje standarda v primerjavi Hacker izdaja, vidim, da ta teden je heker izdaja namenoma je malo več izvedljivo, recimo, od Boga Način je bil z igro petnajsterice. Torej, če iščete odsek in iščete nekaj dodatne zabave lastnosti ni potop v če interesov. Zdaj bolj praktično, naj omenim ven eno stvar, kot dobro. GDB, kar nekateri od vas morda še dotakne osebno, kar je v redu. Zdaj pa je res čas, da se privadite to in udobno s tem orodjem ker bo vaše življenje veliko lažje, resnično. Na predavanju Rob o GDB par tedni, odpoklic da GDB je razhroščevalnik. To je orodje, ki vam omogoča, da vodijo svoje Program pa vodijo korak za korakom, skladno po liniji, tako da lahko suniti okrog, tako da vidite stvari se dogaja, da , ki jo lahko natisnete Vrednosti spremenljivk. Na kratko, da vam toliko več moč kot printDef ne. Zdaj pa res, vmesnik je precej skrivnostno. Črno-beli tekstovni vmesnik za večino del. Ukazi so nekoliko težko da se spomnimo na prvi. Toda čeprav bi lahko ti pol traja uro, uro, naj to vnaprej vložek časa v to, verjemite mi. Zagotovo do konca semester bo prihranilo vam red velikosti več Čas od tega. Torej, v začetku tedna potop palcev In v smislu Breakout, veš, da si To lahko storite tako dolgo, kot ste Koda za distribucijo ali svoje kode v teku v vašem Pst4 imenik. Vem, da lahko zaženete gdb. / Zlom. To se dogaja, da odprejo okno, kot je ta. Dovolite mi, da sam daje več z okna terminala. In kaj potem jaz grem naprej in ne, to ni samo teči. Bom najprej nastaviti break točko Odpoklic, ki vam omogoča, da ustavite izvedba v določenem mestu. Samo, da stvari enostavno grem vdreti na liniji ena samo z vnosom številka ena. Dovolite mi, da dejansko ponovno odpre to okno ker je pridobivanje malo majhen tam. Torej, kaj bom zdaj storil tukaj če sem odprl svoj terminal okno. Pridi, greva. Torej, zdaj, če grem nazaj v nabiralnik, Pst4 in vodijo gdb. / zlom vstopiti, opazili Bom prekinil eden nastaviti odmor točko na liniji ena. In zdaj bom šel naprej in tip teči. In ko sem naredil, opazil ničesar Zdi se, da se zgodi. Ni pop up. Ni grafični uporabniški vmesnik še ni. Ampak to je razumljivo, saj sem dobesedno na liniji ena v mojem programu. In opazil, da sem hitro posredovati, posebej sedaj 62, ker so vse stvari na vrhu te datoteke je stvari, kot so komentarji in konstant in nezanimiv stvari za zdaj. Torej, zdaj sem znotraj main, zdi se, v skladu 62. In to je samo porazdelitev koda, odpoklic. Če odprem ki ga bo, podobno, v mojem drop box imenik v Pst4, v breakout.c. In če sem se pomaknite navzdol in dol in dol, in mi gredo naprej in ga vklopite moje vrstice številke. Kaj bom videl, če bom pomaknite navzdol linija 62, ravno črto, ki smo prekinjeno naprej. Torej, ta vrstica tukaj, 62, je kjer smo na tem, da bo. Torej, zdaj v GDB, če grem naprej in vnesite zdaj naslednji, vpišite se dogaja, da izvršitev to vrstico. In voila, imamo tako imenovane g okno. Če seznanjeni s tem, kaj GWindow je, ne skrbi. Spec vam bo predstavil z njim, kot je tudi število obiskov videov vgrajeni v spec. Ampak zdaj pa bo ta malo bolj zanimivo. Dovolite mi, da se premaknete okno čez na strani malo. Naj oknu malo Večji da bom lahko več videti. In zdaj mi gredo naprej in storiti še enkrat. In tam so moji opeke. Če bom naslednji znova vnesite zdaj vidim žogo. In če sem ob znova vnesite zdaj vidim veslo. In na srečo je to gedit ni Res sodelovanju z mi pokazala, vse, kar si želim. Zdaj pa če naredim naslednji spet, Naslednji enkrat, jaz sem samo razglasitvi nekaterih spremenljivk. In sem lahko natisnete eno od teh fantov ven. Print opeke, odtisi življenje. In zdaj, če bom še naprej delati Naslednji, opazil, da se bom znotraj te zanke. Ampak koda se dogaja, da izvrši točno tako, kot pričakujem. Torej, ko sem udaril to funkcijo, počakajte za klik, da se bo to to dobesedno. Tako sem zdelo, da so izgubili nadzor preko programa. GDB niso mi dali drugo vprašanje. Ampak ne skrbi. Pojdite na mojo igro, kliknite nekje. In voila, zdaj pa nadaljuje z linijo 86. Torej, še enkrat, to je neprecenljivo, končno, za težave debugging. Ker lahko dobesedno korak skozi kodo, tiskanje stvari in še veliko, veliko več. Vendar za zdaj, ti samo orodja naj bi dobil precej daleč. Tako da smo, seveda, ob pogled ob Grafika zdaj, vse naenkrat. In sedaj naš svet postane malo bolj zanimivo. In veš, morda, od nekaterih videi na spletu, ki smo jih Kratke hlače, ki ste gledal kot del problemskih sklopov. In sem jih ustrelili, namenoma, pred belo ozadje. In nekateri izmed njih so poučevanje Fantje risanje nekaj besedila na Zaslon, ki je prevlekel na strani njih. Seveda pa to ni tako zanimivo, v resničnem svetu. To je samo predavalnica z velik bel zaslon in ozadje. In naša neverjetno produkcijska ekipa vrste od naredi vse, kar je videti lepa po dejstvu, ki ga izvajajo obrezovanje ali prekrivanje ničesar storimo ali ne želite. Zdaj pa samo motivirati tem tednu res, kjer lahko greste, na koncu, z računalništva. Ne samo po problem nastaviti štiri. Toda po drugi tečaja ali celotnega Kurikulum je to neverjetno, kaj lahko storiti v teh dneh v smislu Grafika še posebej. Nekateri izmed vas ste to lahko videli teče po spletu. Mislila sem, da ti pokažem, za samo nekaj minut, pogled na to, kaj računalniška tehnologija in tisto, CGI, računalniška grafika lahko storite v teh dneh z znano pesmijo in morda film. [GLASBA - LANA DEL RAY, "Mlada in lepa] SPEAKER 1: To je samo malo neverjetno, morda, kako vseprisotna - [APLAVZ] SPEAKER 1: Pravkar sem jo prenesli. Ampak to je res neverjetno, mislim, samo kako vseprisotna programske opreme in številka in orodja, kot je to v resnici. Tako da je okus smeri , v katerem lahko greš. Oh, ne več danes Appliance. No, to je pravzaprav tragični čas Glede na točko sem poskušal narediti. Vse je v redu, tako da je začela Fusion znova. Spomni me kasneje. Vse je v redu, in ti naj bi dobil e-pošto, ne upoštevajo, če si dobil Opazili tako. Vse je v redu, tako opozarjajo, da je prejšnji teden smo začeli lupine nazaj to pozneje znan kot niz. Niz opozarja, podatkovni tip, ki je prijavljeni v knjižnici CS50. In to je del koles usposabljanja da bo zdaj začela na vzlet. Bilo je uporaben pojem že na začetku. Zdaj pa se dogaja, da bi dobili več zanimivo in bolj močan, da bi dejansko videli, da je pod pokrovom motorja, Niz je samo tisto, sva rekla? Ja, to je tako imenovani char *. In tam * označuje, da je nekakšen naslov vpletene. In tako, ko rečeš char * vam pomeni le spremenljivka, katerega podatkovni tip je Kazalec zdaj. Dejstvo, da je zvezda tam pomeni le, da ste o razglasitvi tako imenovani kazalec. In da kazalec se bo očitno shrani naslov, na Tečaj, char. Zdaj zakaj je to smiselno? No, kaj je niz pod pokrovom? No, nekaj časa smo bili pravi da je niz pod pokrovom Samo h-e-l-l-o, na primer. Ampak smo se pogovarjali o tem, kot pa v bistvu matrika. In bi matrika, potem poglej malo več kot je ta, vsak od teh ob nastopu ugriz. In potem smo rekli, da obstaja nekaj posebnega nazaj, Nagibnica 0 ali null terminator. Torej vsem tem času to tukaj je niz. Ampak res, niz dejansko naslov. In naslovi, kot bomo videli, so pogosto s predpono 0x po dogovoru. Kaj 0x pomenita? Ali kdo ve? Torej to pomeni le šestnajstiški. Tako da boste morda spomni, pravzaprav iz Pst 1. Verjamem, eden izmed toplo-up Vprašanja dejansko spraševali šestnajstiški zapis poleg binarno in desetiško. In motivacija tukaj je, da z šestnajstiškem imate 16 številke na razpolago. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, čemur z a, b, c, d, e, f. In če šteješ vse tiste gor, boste dobili skupaj 16 let. Torej, to je v nasprotju z decimalno, kjer imamo 10 cifer, 0 do devetih. To je v nasprotju z binarno kjer imamo samo 0 in 1. Toda ob koncu dneva si lahko samo predstavljajo enake številke, vendar nekoliko drugače. In šestnajstiški je pogosta, saj so Izkazalo se je - in bomo to videli kasneje v teku - tudi ko smo dobili na spletni programov v okviru HTML in barvne oznake, šestnajstiški je lepo. Ker vsako številko, se izkaže, predstavlja štiri bite odlično. Tako da nekako linije lepo gor saj bomo sčasoma videli. Torej je to lahko Ox123 ali kaj takega, ki označuje naslov 123 nekje znotraj mojega spomin računalnika. Seveda pa nastopijo težave zaradi tega osnovnega izvajanje. In spomnim, da sem se zabodel izvajanje funkcije, kot je ta - primerjajo dash 0 dot c prejšnji teden, da čeprav je bilo videti, kot da je Dobro, to preprosto ni primerjala dveh nizov pravilno. Sem zavrgli Glavni in sem vrgli stran pripombe le, da se osredotoči na na kodo, ki je v interesu tukaj. In to je v rdeči, ker je buggy. Zakaj? No, na vrhu pa, ko sem razglasila string, kaj se je v resnici dogajalo pod pokrovom? No, naj gredo čez, da zaslon tukaj in pripraviti to. Zato sem razglasila, še enkrat, String s GetString. Tako da sem šel naprej in zdaj pripravi s za kaj je v resnici. To se dogaja, da je kvadratni tukaj. In bom trdijo da je to 32 bitov. Vsaj ponavadi je, vsaj na CS50 Naprava v veliko računalnikov. Bom pa je poklical. Toda zdaj opozarjajo, da smo imenovano GetString. Torej GetString vrne, Seveda niz. Če uporabnik v h-e-l-l-o vnesti Niz dobi zdravo vrne. In to string, kot smo pravkar rekel, konča nekje v spominu računalnika z backslash 0 na koncu. Pritegnil bom to kot array - ali sosednje blok znakov - da je v resnici. In zdaj, kaj se GetString pravzaprav vrača? Kaj je GetString bilo vračanje Vse v tem času? No, recimo, v tednih pred, vrne niz. Ampak bolj tehnično, kaj GetString vrnitev očitno? PUBLIKA: naslov. SPEAKER 1: naslov. Posebej vrne naslov prvi ugriz, karkoli že je. Kar naprej z uporabo enega, dva, tri ker je priročno. Vrne naslov prva znak v nizu. In mi je prejšnji teden dejal, da je da zadostuje. Ker smo vedno lahko ugotoviti, kje konca niza le z ponavljanjem nad njim, morda z za zanka ali while zanko ali kaj podobnega da, samo iščejo "backslash 0", Posebna sentinel znak. In potem vemo, da niz zgodi, da se na dolžini - v tem primeru - pet. Torej, tehnično, kaj počne GetString se vrne Ox123 v tem primeru. In tehnično kaj se potem zgodi, je da hranimo, notranjost s, Ox123. Ob koncu dneva, čeprav ta je nov koncept, kazalci, oni le spremenljivke. Ampak se zgodi, da shranite bite, ki skupaj predstavljajo naslov. Torej tehnično vse, kar dobi shranjeni v ih je Ox123. Vendar smo kot ljudje - vključno danes dalje - res ne bo mar, običajno, kaj je dejanski naslov neke kos pomnilnika. To je samo na nizki ravni podrobnosti za intelektualnem zanimivo. Torej bom to izbiro. In namesto, bolj visoka, samo reci da ko govorimo o kazalci Jaz bom samo pripravi več uporabniku prijazen puščica, ki izraža Isto idejo in povzetki proč podatke o tem, kaj dejansko osnovni naslov. Zdaj, če gremo nazaj v kodi, kaj se je zgodilo prejšnji teden, če imamo niz t enako GetString? No, če sem ponovno vtipkajte zdravo Tokrat bom dobil en kos pomnilnika. h-e-l-l-o nagibnica 0. Ampak zato, ker sem poklical GetString drugič - in vem, da je to, če si ogledamo Izvorna koda za GetString - tudi čeprav je naključje, da je zdravo vnesli dvakrat, GetString ni bomo poskušali optimizirati in biti pameten. To je le, da bo dobil še en kos pomnilnik računalnika, ki je bo na drug naslov. Oglejmo samovoljno pravkar rekel 456. In potem kaj se gre, da se vrnete? To se dogaja, da se vrnete 456 in ga shranite v t. Torej, kaj se v resnici dogaja, na Na levi strani je imam še en kos pomnilnika, 32 bitov običajno. In tam je šel Ox456. Ampak še enkrat, me ne zanima ti posebne številke več. Grem na abstraktno jo pripravijo kot puščica. Torej, to je zdaj nova razlaga. Ampak to je enako natančno idejo, da je je dogajalo ves ta čas. Tako razloga, da prvi različica primerjanje bil vozičkom Prejšnji teden je, zakaj? Ko boste to storili, če je enaka enaka Ne, kaj ste resnično pod kapuco primerjavo? Ste primerjali naslove. In samo intuitivno, jasno, Ox123 ne bo enako Ox456. Te številke, tiste nastavke so samo različni. In tako dosledno, prejšnji teden pa je dejal vnesete različne stvari, tudi če besede so bile dobesedno enako. Zato smo to popraviti. V smislu navadnega je, kaj je fix? PUBLIKA: Uporabite funkcijo. SPEAKER 1: Uporabite funkcijo. Ali so zvezd zagotovo vključeni, ampak uporabiti funkcijo za kaj? PUBLIKA: Za primerjavo nizov. SPEAKER 1: Za primerjavo nizov. Torej temeljni problem tukaj je da sem samo razmišlja Kakovost strune, ki jih določi Primerjava njihove naslove. In seveda, da je samo neumen zdaj enkrat boste razumeli, kaj se dogaja Pod pokrovom. Resnično primerjati nize, da vidim, če oni so enaka na način, da ljudi razmišlja dveh nizov enaka jim moramo primerjati znak za znak za znakom. Zdaj bi lahko jaz naredil To zelo tediously. Ampak familiarly, smo uporabljajo za zanke. In ravno primerjati nosilcem S sem proti t nosilec i. S podstavki i plus 1 proti t nosilec i + 1, in tako naprej, znotraj nekakšna zanka. In če opazim nobene dva znaka, da razlikujejo, ali če se zavedam, da oh, i je krajši od t ali več kot t Jaz lahko takoj reči false, oni niso enaki. Ampak, če sem priti skozi s in t in reči isti, isti, isti, isti, isti, konec obe strune, lahko rečem, Res je, da so enaki. Pred No, na srečo, let nekdo napisal kodo za nas. In so ga imenovali StrComp za niz primerjavo. In čeprav je malo števec intuitivno, StrComp vrne 0, če je tisti, dveh nizov, s in t so enake. Ampak to vrne negativno vrednost, če je naj pridejo pred t abecedi ali Pozitivna vrednost, če bi moralo priti po t po abecedi. Torej, če si kdaj želeli rešiti nekaj, Izkazalo se je, da je StrComp koristno. Ker ne samo, da da ali ne, enaka ali ne. To vam daje občutek naročanje podobno kot v slovarju mogočnosti. Torej StrComp, s vejica t enaka enaka 0, pomeni, da strune so resnično enaki. Ker to funkcijo kdo je napisal pred leti domnevno uporabljajo za zanke ali pa zanke ali kaj podobnega vključiti več znakov znova in znova in znova. Ampak problem je nastal dve tukaj. To je bila copy0.c. In dve v rdeči barvi je ker je napačna. In kaj počnemo tukaj? No, najprej sem poklical GetString. In jaz shranjeno vrednost pri vračanju v s. Tako da je precej enak kot ta zgornji del slike. Toda, kaj pride potem? No, naj gredo naprej in se znebite za cel kup tega. Mi bomo nazaj v čas, kjer smo pravkar imajo s, ki je sedaj v skladu z prva vrstica tam gor. Preveril sem. Če je enaka enaka 0.. Zdaj pa hitro side note, ko Morda GetString vrne 0? Ni dovolj pomnilnika. Kajne? To je redko, da se bo to zgodilo, zagotovo na računalniku, ki je dobil na stotine MB ali celo nastopov RAM-a. Ampak to bi v teoriji vrnete 0, še posebej, če Uporabnik ne sodeluje. Obstaja način, da se pretvarjamo, kot da niso vnesene karkoli in trik GetString v vračanje 0 učinkovito. Tako se dogaja, da preverite to. Ker če je kdo izmed vas je začel razumem, že, segmentacijske napake - , ki je verjetno bil vir neke frustracije - to so skoraj vedno posledica spomina povezanih napak. Nekako si zamočil v zvezi z kazalec, tudi če ne zavedaš je bil kazalec. Torej, ste morda povzroča segmentacijo napake so že teden eno uporabo nekaj podobnega kot za zanke ali časa zanke in niz, ki ga šla predaleč mimo meja neke matrike, ki ste prijavljeni v dva tedna v posebej. Morda ste to storili tudi v problemu nastavite štiri z Breakout. Čeprav ste verjetno ni videl vse zvezde v kodo distribucije za Zlom, se je izkazalo, da tisti, GRect in GOval in druge takšne stvari, to so pravzaprav kazalci Pod pokrovom. Ampak Stanford, tako kot nas, neke vrste kož Podatek, da je vsaj za knjižnice namene, podobno kot mi za niz in char *. Ampak GRect in GOval in vse tiste, Stvari, ki jih fantje so ali bodo lahko uporabljali Ta teden so v končni fazi pomnilniških naslovov. Enostavno ne vem. Tako ni presenetljivo, potem, morda, da bi lahko spotakne nekaj segmentacija napake. Ampak kaj je zanimivo, tukaj zdaj, če se po preverjanju za 0 počnemo Niz t dobi s. No, naj razglasi t. Jaz grem, da ga pripravijo kot kvadrat, 32 bitov, pa kliči. In potem bom naredil dobi s. No, kaj to pomeni? No, to je malo težko razmišljati o tem predstavljam pametno. Ampak kaj je razmišljati o kaj je notri od x? Kaj je dobesedno znotraj te spremenljivke? Ox123 vrednost. Torej, ko rečem niz t dobi s, da samo dobesedno pomeni, da je število vs, kar je Ox123 in ga Ox123 dal. Ali slikovno, če sem nekako abstraktno od tega podrobneje ima Učinek dobesedno delaš tudi to. Torej, zdaj, pomislite na zadnji teden, ko smo nadaljevali s kapitalistično T. I si T nosilec 0. No, T bracket 0, čeprav je kazalec, jo lahko kot če zdravljenje je matrika, s kvadrat Nosilec zapis. Torej, če je T nosilec 0? No, to je h. In tako, ko smo uporabi to vrstico kode, dve zgornji del, ki je v tem c type.h glava datoteke, ki je, če to je razglašena. Ste izkoristiti ta H. Ampak Tečaj, ki je enako natančen h, ki je Notranjost s, tako rekoč. In tako zdaj ste spremenili ali začetnico tako izvirno in tako imenovane kopija. Ker niste naredili kopijo v način, da bi človek rad, da bo. Torej, kaj je fix tukaj V copy1.c zadnjem tednu? Funkcije, tako da smo lahko dejansko kopirati niz. In bistveno, kaj moramo storiti, da bi kopirali niz? No, v tej zeleni različici, tukaj sem dogaja, da je precej nizko raven storiti. Obstaja dejansko deluje jim lahko pomaga s tem. Toda najbolj osnovni eno in najbolj znana ena, vsaj, bo kmalu da nas poznajo, je naslednja: - tako ena v prvi vrstici kode v zeleno zdaj. Pravkar sem predelal S kot char *. Ni funkcionalna Razlika tam. Pravkar sem vrgel proč CS50 knjižnico in Jaz sem ga kliče, kaj je, char *. Sedaj pika, dot, pika, ker ni bilo nekateri preverjanje napak, da ni zanimivo, da spet govoriti. Torej, zdaj je t prijavljeni. Tudi ta je char *. Tako sem narisal malo kvadrat na zaslon kot prej. Toda na desni strani, malloc, rečeno je spomin dodeliti. Tako razporedilo kake kos pomnilnika. In koliko bajtov ali imamo dejansko želite dodeliti, ne zdi? No, dolžina niz s. Torej, če je to zdravo, da je bo pet. Bomo rekli, h-e-l-l-o. Torej pet zlogov. Ampak potem plus 1, zakaj 1? 0 značaj. Če nam ne puščajo prostora za tega fanta smo Morda po naključju ustvarili razmere kjer niz h-e-l-l-o. In potem naslednjič GetString je imenuje in tip I, na primer, David, D-a-v-i-d, računalnik se bo mislim, da se je dejansko h-e-l-l-o-d-a-v-i-d, ker tam Ne prelom med temi besedami. Zato moramo ta odmor. Zato ne želimo pet. Želimo šest zlogov. In bajti rečem. Ampak to je velikost res čas char. Tehnično lastnost je skoraj Vedno sam bajt. Ampak samo, da bi naša koda prenosni, tako rekoč, tako da deluje na različnih računalnikih, tudi če bi se lahko nekoliko drugačno pod napa, bom generično pomeni velikost lastnost, tako da moja koda deluje vedno. In nimam, da ga prevedem samo ker sem nadgraditi svoj računalnik ali uporabite nekateri drugačna platforma. Torej imam 6-krat na velikost char, kar se zgodi, da je 1. Torej to pomeni malloc bi Dajte mi šest zlogov. Kaj je to dejansko počne? No, naj roll nazaj v čas tukaj , kjer smo v zgodbi. Torej, če grem nazaj, sem razglasila char * imenovano t. Sem se zdaj imenuje malloc za šest bajtov. In zdaj bom pripravi teh šestih zlogov, tako kot niz prej. Ampak jaz pravzaprav ne vem, kaj je znotraj tega polja. Če dodeliti pomnilnika se izkaže, da ne moreš zaupati, da obstaja nekaj znana vrednost tam. To bi lahko bila uporabljena z nečim drugega, nekatere druge funkcije, nekatere druge vrstica kode, ki jo je napisal. Tako da bomo na splošno imenujemo te smeti vrednote in jih neodločeno, morda, kot je vpraĹĄajev, samo kaže, da smo Ne vem, kaj se je dejansko tam. In to ni nič takega, tako dolgo, kot smo dovolj pameten, da prepiše tiste Smetarska vrednosti s številkami ali znakov, da nam je mar. Torej v tem primeru, kaj bom naredil? No, moj linija koda Naslednji, imam štiri. int dobim 0, n dobi Niz dolžina s. Torej poznate za zanko. I je manjša ali enaka n ki je običajno nad. Toda tokrat je to namerno. Jaz + +, potem pa sem preprosto storite t nosilec i dobi s. Ker je moja slika izgleda takole na ta trenutek, shranjena t = naslov tega naključnega kos pomnilnika katerih vrednosti so znani. Ampak takoj, ko sem naredil t nosilec 0, da me postavi tukaj. In kaj se konča tam dobili pripraviti? Smo na koncu dajanje h. Ker to je tisto, kar je pri nosilcem S 0. In potem isto stvar za e in l, l, o. n, zakaj sem šel skozi enako n? Zaradi 0 značaja. Torej, samo da bo jasno, potem pa, če sem dejansko izbrisati vse, kar ti smeti Vrednosti so nato dejansko pripravijo v kaj pričakovali, to je nosilec 1, 2, 3, 4, ter da je vlečni Novi znak. In sedaj, če bomo nadaljevali mimo piko, pika, pika na tem pravilno različico in kapitalizirane t kotnik 0 Jaz bi, v Tečaj se kapitalizacijo samo to tukaj tip, ki je konceptualno, je navsezadnje cilj. Tako da je je vse kazalec. In ste jih jemljete več tednov da v okviru nizov. Ampak pod pokrovom oni malo bolj zapletena. Ampak, če mislite, da o njih v tem slikovno obliko predlagam, da si Verjetno ni vse tako grozno, kot so morda sprva zdi na prvi pogled, še posebej s tako novo sintakso. Vsa vprašanja glede kazalcev, strune, ali nabora znakov? Ja? OBČINSTVO: lahko vrnete na [neslišno]? SPEAKER 1: Seveda. PUBLIKA: Torej, kako priti v vaš zelo zadnja linija, ne boste imeli * t linijo in * je na vrsti? Nimate sklicevanja na - SPEAKER 1: Ah, res dobro vprašanje. Zakaj ne dobim * t in A * S? Ker je kratko, prejšnji teden, tako kot v našem funkcijo swap, nisem rekel, da ko imaš kazalec sredstvi, ki jih kar greš tja, kot smo fizično na odru, je bilo dejansko uporabite operator zvezdica. Izkaže se, da je to kvadratni oklepaj Zapis je tisto, kar imenujemo skladenjska sladkor, ki je samo seksi način pojasni, je to stenografski zapis za točno to kar opisujete. Ampak to je malo bolj intuitivno. In na tveganja, da bi to lahko zdi bolj zapleteno, kot je treba, kaj se v resnici dogaja je naslednja: - Če rečem * t to pomeni, da gre za naslov shranjena v t. Torej dobesedno, če je t je shranjevanje naslov te h Sprva * t pomeni iti tukaj. Zdaj, kaj t kotnik 0 pomeni? Enako natančna stvar. To je samo malo bolj uporabniku prijazen pisati. Ampak jaz še nisem storil. Ne morem reči * t dobi * s. Ker kaj bi se potem delaš? Želel je dajanje h, h, h, h, h skozi celotno stvar. Kajne? Ker * t je šel na naslov v t. Vendar smo znotraj zanke. In kakšno vrednost sem povečevanje, Seveda, na vsaki ponovitvi? i. Ampak tam je priložnost tukaj, kajne? Čeprav se ta počuti, kot je pridobivanje Malo bolj prefinjene od kvadratnih nosilec zapisa smo nekaj časa uporabljali - Naj mi odvezal h spremembo tam - čeprav je to zdaj že malo Ljubitelj, osnovna ideja, če * t pomeni tukaj in * t je samo pojdite na naslov v t. Ampak kaj je naslov v t? Število hranimo uporabljate? Tako kot Ox456, pripeljimo da nazaj samo zaradi razprave. No, če želim priti na e leta t niz, samo želim iti, v bistvu, 456. Oziroma, 457. Moram dodati eno. Vendar pa lahko naredim to, kajne? Ker t, čeprav sem voditi risanje zdaj kot puščica, to je samo Številka, Ox456. In če dodam nekaj na to, ali več na splošno, če dodam I do, da sem lahko dejansko dobili točno tam, kjer želim. Torej, če Pravzaprav to počnem - in to je tisto, kar danes imenujemo kazalec aritmetično - Jaz lahko odstranite to linijo. Ki je, odkrito povedano, mislim, da jasno in malo bolj prijazen za branje. Vendar pa to ne manj pravilna. Ta vrstica kode sedaj uporablja kazalec aritmetično. To je rekel, pojdite na po naslov - ne glede na začetek t je, ki je t plus i, ki se sprva 0, kar je super. Ker to pomeni začetek t plus 1, plus 2 plus 3, in tako naprej. In isto se ukvarjajo s s. Tako skladenjska sladkor za to. Ampak razumevanje, kaj se v resnici dogaja Pod pokrovom motorja, bi lahko dejali, dejansko uporabna in sama po sebi. Ker to pomeni, zdaj pa je ni veliko bolj čarobno dogaja Pod pokrovom. Tam se ne bo veliko več plasti, da bomo lahko Odlepite za vas. To je c. In to je programiranje. Res dobro vprašanje. Vse je v redu, tako da je bilo to, da vozičkom Program sem imel v mislih prej. swap je bil pomanjkljiv. Če pa se zdi, da deluje. Spomnimo se, da tako kot z mlekom in pomarančni sok - ki sem ga začel pitje današnjo predstavitev. Torej, tako kot s pomarančnim sokom in mleko, nismo morali uporabiti začasna spremenljivka, tmp, da imajo začasno, tako da bomo lahko potem spremeniti svojo vrednost in nato posodobite b. Ampak to funkcijo, smo rekli, ali je to program, v katerem je ta funkcija napisano je bilo narobe in pomanjkljiv, zakaj? Ja? PUBLIKA: [neslišno]. SPEAKER 1: Točno, ko pokličete swap - ali bolj na splošno, ko pokličite najbolj nobene funkcije - če so argumenti za to funkcijo, so primitivni, tako rekoč, ints in nabora znakov in dvojnih in boje, stvari brez zvezde, ste minljivi, v kopiji argument. Torej, če je x 1, in y je 2, bo za 1 in b se bo 2. Ampak oni bodo različni kosi bitov, različne kose pomnilnika, ki se zgodi, da se shranjevanje enaki vrednosti. Tako da je ta koda je super odlična V zamenjavo a in b. To ni dobro zamenjavo - na primer prejšnji teden - x in y. Ker še enkrat, oni v napačnem področju. Zdaj, kako bomo šli o določitvi to? Smo morali narediti funkcijo poglej malo grši. Ampak še enkrat, razmisli, kaj To samo pomeni. In pravzaprav, kaj mi je, za doslednost, spremenite eno stvar, tako da je enak kar smo pravkar storil. Kot sem že omenil prejšnji teden, pa ne važno, kam gre. Dejstvo je, ponavadi ti bi dal zvezdice poleg spremenljivko. Ampak mislim, da bi bilo malo lažje upoštevati * poleg Tip podatkov, kot jo smislu je kazalec za notr v tem primeru. Torej, kaj počnem tukaj? Pravim, da ne mi int sledila druga notr, njih in b kliče. Daj mi naslov notr. Daj mi naslov drugega notr. Pokličite tisti naslovi in ​​b. Nato pa z uporabo * zapis navzdol spodaj, pojdite na vsakega od teh naslovov , kot je potrebno, da se bodisi ali pa nastavite njegove vrednosti. Toda obstaja izjema. Zakaj ne imel * poleg tmp? Zakaj ne naredi tega, na primer? Zdi se, kot bi morala sem iti vse ven in popraviti celotno stvar. Ja? PUBLIKA: [neslišno]. SPEAKER 1: Nisem prijavljeni NTU kot niz. Torej bi to ugotovi, v tem primeru tmp biti naslov notr. Ampak to ni ravno to, kar hočem, za nekaj razlogov. PUBLIKA: Vi ne želite, da jih swap. SPEAKER 1: Točno tako, ne želim, da bi zamenjali karkoli z tmp. tmp je le teden ena stvar. Vse kar hočem je spremenljivka za shranjevanje nekaj več. Jaz sploh ne briga naslovov v tem trenutku. Potrebujem samo 32 bitov ali tako za shranjevanje int. In hočem, da v teh 32 bitov kar ni v tako rekoč, vendar kaj je, samo da bi se bolj natančno. Ker če je naslov * pomeni pojdi tja in dobite vrednost 1. Na primer, na primer prejšnji teden ali v primeru B je, dobil vrednost 2. Torej, kaj se v resnici dogaja? Naj ti narišem tukaj, da se bo samo draži narazen del danes. Vendar bo še vedno prikazana za kar nekaj časa. To Trdim, je tisto, kar računalniku spomin zgleda, ko zaženete Program, kateri koli program. Ko zaženete program na sam vrh od računalnika RAM - tako mislim Ta pravokotnik, resnično, kot vaš računalnika RAM ali spomin, vse 101 milijarda bajtov njim, vsi dve milijardi zlogov, vse dva gigabajta njej, ne glede na količino, kar imate, je, kaj je to, kot pravokotnik pripravi. In trdim, da ko zaženete program kot so Microsoft Word ali Chrome ali kaj podobnega, bitov, da Microsoft ali Google napisal - v primerih, navedenih programov - se naloži v pomnilnik računalnika kjer se lahko izvede več hitro in krmijo v CPU, ki je možgane v računalniku. In v TAM oni so shranjeni v zelo vrh svojega programa, tako rekoč. Z drugimi besedami, če je to kos spomin, ko boste dvakrat kliknite na Microsoft Word, bitov pridejo na trdem disku. So se naložijo v RAM. In jih bomo zabil v sam vrh tega pravokotnika konceptualno. No, preostanek svojega spomina je uporabijo za različne stvari. Na samem vrhu vidite inicializacijo Podatki in ustavljanja podatke. To mora storiti, za večino del, s konstante ali globalne spremenljivke da imajo vrednosti. Ampak bolj na tiste, drugič. Potem imate kup, ki je bomo prišli nazaj. Toda na dnu je del, ki je zlasti Germane zdaj. To je tako imenovani dimnik. Torej, tako kot v večini vseh D dvorani tukaj kampus, imate te pladnje, da Samo zložene druga nad drugo, na kateri lahko dajo hrane in drugih malenkosti. Opremo v računalniškem sistemu je zelo podoben. Razen ker pladenj, kot jih uporabljamo v jedilnica seveda pomeni za opravljanje stvari pladnje ali okvirji - saj jih bomo imenovali - v računalnik je pomnilnik se uporablja za vodenje spremenljivke in vrednot. Torej, kaj v resnici gre naprej pod pokrovom? No, naj obrnila na zaslon tukaj. In naj se osredotoči le na Spodnji del za trenutek. Če je to spodnji del mojega računalnika spomin se je izkazalo, ko sem pokličite funkcijo main - ki se zgodi, odkrito povedano, samodejno zame - Dobim kos pomnilnika na Spodnji del mojega RAM, tako govoriti. In to je, če je glavni lokalne spremenljivke iti. Tam, kjer argc in argv morda iti in vse spremenljivke I razglasi znotraj glavnega. Končajo na dnu mojega računalnika RAM. Zdaj pa recimo, da so glavne klice funkcijo kot zamenjavo, kot je to storila prejšnji teden? No, v bistvu dal nov pladenj, Novi okvir, na svoj kos pomnilnika. In jaz bom opisati to kot spada v funkciji zamenjavi. Zdaj, kaj je notri za zamenjavo? No, temelji na programu prejšnji teden in Tisti, ki smo pravkar videli odlomek iz, znotraj okvirja swap je, ali je zamenjava pladenj, so tisto, kar spremenljivke? No, in b. Zato, ker jih njeni lokalni argumenti, plus tretja NTU. Torej, res sem lahko pripravi to malo bolj čisto. Dovolite mi, da gredo naprej in razveljaviti nalepko. In mi zatrjujejo, da veste, kaj? Verjetno bo na koncu tukaj. B se bo končalo tukaj. In tmp se bo končalo tukaj. Zdaj, morda naročanje je malo drugačen. Vendar konceptualno to zamisel. In samo skupaj, to je tisto, bomo poklical okvir swap je, ali jedilnica, dvorana pladenj. In isto se ukvarjajo z glavno. Ampak ne bom, da izvlečete. Ampak to je, če argc in argv in vse krajevno spremenljivk, kot so x in y lahko tudi. Torej, zdaj razmisliti, kaj se v resnici dogaja Ko kličete zamenjave. Ko pokličete zamenjave, izvajanje kode, kot so To, da ste potujejo v verzija buggy, in b kot kopije x in y. Torej, če mi sedaj pripraviti to na zaslonu - spraviti boljši pri tem - Tako zgodbo sem povedal, da sam je bil v tem buggy različici, ko smo pokličite swap poteka v dobesedno in b kot cela števila, kaj se v resnici dogaja? No, kaj se v resnici dogaja, je to. Dovolite mi, da gredo naprej in razveljaviti le razčistiti nekaj prostora tukaj. Torej je ta spomin mojega računalnika. Torej, če imam na primer - dejansko pa to storite na ta način - če trdim, da je to x, shranjevanje vrednost 1, tako kot prejšnji teden. In to je y, shranjevanje vrednosti 2. tako kot prejšnji teden. In to je glavni, ko kličem zamenjave, s čimer sam dostop do in b in tmp, bom trdijo, da to, kar je 1. To je b. To je 2. To se imenuje tmp. In na začetku, ima nekaj smeti vrednost dokler nisem dejansko shrani v njej, ki je 1. Potem sem šel naprej in spremenite za kaj? Vrednost B-jev. In tako zdaj imam dva tukaj. In potem smo rekli b dobi tmp. Spet, tako kot preverjanje sanity, tretji vrstica kode tu je preprosto to ena, b dobi tmp. In tako na koncu, kaj naj storim? Grem naprej in spremeniti b, da karkoli vrednost NTU je, kar je 1. Ne dotikajte tmp. Toda zdaj, problem je, kakor hitro zamenjavo vrne, ker ne predaja nazaj neko vrednost, ni vrnitev Izjava nedvoumno izraža v njem. Kaj se dejansko dogaja? No, v bistvu vse to spomin - OK, očitno radirka všeč samo en prst naenkrat - samo izgine. Zdaj v resnici to ni grem nikamor. Lahko pa pomislim Zdaj so vprašaji. Ker ne gre več dejansko v uporabi. In ne bo nič storjeno s temi vrednotami. Tako v primeru zelene različico ta koda, kar je namesto počutje prešla v zamenjavo? Tako obravnava. Torej naslov x in naslov y. Torej, če bomo ponovno povem to zgodbo še zadnjič čas, in dejansko sem spet sestaviti zamenjave, vendar z kazalcev, kar je v tem da b, in kar je NTU, kar je dejansko shrani v te zelene različica mojo kodo, kjer sem mimo v naslovih? To se dogaja, da se kazalec na x. Tako sem lahko nariše puščico. Vendar naj uporabi isto samovoljno Primer kot prej. Recimo, da je to nekaj podobnega Ox123. In to se bo Ox127 ker to je štiri bajte stran, ker je to int, tako Ox127. In spet bom vzel nekaj svoboščin s številkami. Oni so veliko manjši, kot bi jih dejansko in v drugačnem vrstnem redu. Ampak to je, kako slika Zdaj je drugače. Toda, ko sem uporabo te zelene kodo in jaz int tmp dobil *. * Sredstvo narediti naslednje, da obravnavati, da je v in iti k njej, ki je 1. In to je tisto, kar sem potem dal v tmp. Medtem, v naslednji vrstici kode Tukaj, * postane B, kaj to pomeni? No, *, tako da gredo tu dobi * b, kar pomeni, da gredo tja. Kar pomeni, da je dal vrednost tam. Končno, zadnja vrstica kode preprosto rekel * b dobi tmp. Torej b pravi tja in ga prepisati z NTU, ki v tem primeru bo da je, še enkrat, 1. In zato zelena različica naša koda deluje, ker je rdeča različica nikoli ni. To vse je le izvira, kako Pomnilnik je uspelo in kje je dejansko postavi v vašem računalnika RAM. In za zdaj, to je ena od stvari, da je sklad se uporablja za. Vprašanja o postavitvi? Na namig? Ali zamenjave? Vse je v redu, tako da malloc, odpoklic, storil kaj takega. To je zelo preprost primer. In to je bil tisti, ki Binky nam je predstavil, čeprav dokaj hitro, na koncu razreda. Prekleto, pa smo spet tam. Tako opozarjajo, da je to primer, ki Binky nam predstavili, čeprav nekoliko hitro konec razreda. In tukaj smo res malloc za drugič. Ker smo prvič uporabili, ustvariti dovolj RAM-a, dodeliti dovolj pomnilnika za shranjevanje niz. Tokrat Binky biti enostavno. Tako da je za shranjevanje samo int, očitno. In da je povsem v redu. To je malo čudno, odkrito povedano, da uporabiti malloc dodeliti eno int. Ampak točka Nickov claymation je res samo povedati zgodbo o čem zgodi ali ne zgodi, ko vam zlorabljati spomin. Torej, v tem primeru ta program naredil nekaj stvari. V prvem primeru tukaj, razglasi kazalec se imenuje x na notr. Nato razglasi kazalec imenovano y notr. Nato shrani v x, kaj? Nekdo drug zdaj. Kar je shranjena v x po Tretja vrstica tega programa? PUBLIKA: [neslišno]. SPEAKER 1: No, ne čisto zlogov, na reči. Bodite bolj natančni zdaj. Kaj gets shranjeni v X? Naslov, mislim, da sem ga slišal. Torej, kaj malloc vrne? malloc vedenjsko razporeja kos pomnilnika. Ampak kako se vam dostop do njega? Se vrne kaj? Naslov prvega bajta v bloku pomnilnika. Zdaj, to je zelo preprosta. To je samo en bajt, kar pomeni, obravnavali smo dobili nazaj, je naslov celotno stvar. Torej shranjena v X nato je naslov navedene kos pomnilnika. Medtem, kaj se zgodi potem? Torej dejansko, gremo naprej in pripravi tega se resnično hitro. Torej, če bomo šli čez na zaslonu tukaj in igramo tole int * x in y int * se bo kaj storil za mene? Trdim, da bo le to kaj takega in to x poklicati, in ta in y pokličite. Medtem, tretja vrstica kode je gre za dodelitev velikosti notr, ki se zgodi, da - se opravičujem, če sem rekel, eden preden sem mislil eno int - štiri bajte na tipičnem računalniku. Vsaj z CS50 aparata. Torej, to se bo dodelila to, kdo ve? Nekje tukaj. In to je shranjena pri nekaterih naslov Ox, kdo ve? Ampak, kaj se dogaja, da se vrne je ta naslov. Ampak bomo to pripraviti slikovno saj samo arrow tako. Zdaj v naslednjo vrstico * x dobi 42. Kaj * x pomeni v smislu navadnega je? Samo pojdi tja. Pojdi na ta naslov. Ali z drugimi besedami, sledite puščica in dal 42 tam. Ampak potem se je zgodilo nekaj slabega za Binky, kajne? Spomnimo se, da pete tukaj, * y dobi 13, res nesrečno število, naredil kaj za nas? No, * y pomeni iti tja. No, to ni dobil še vrednost, kajne? Koda nima y pa inicializirana ničesar. Mi je pa x inicializiran na naslov. Vendar je bil y prijaviti do vrha. Ampak potem podpičje, nobena vrednost dejansko jih v njej. Torej je pošteno, da to imenujemo smeti vrednost. Kdo ve, kaj je tam? To so ostanki bitov, ki so bile uporabljene z neko prejšnjo vrstico kode v moj program. Torej, če rečem, tja, to je kot, Nimam pojma, kje je puščica bo na koncu. In to je, ko po navadi dobili napako segmentacije. Če ste pomotoma posebnih datotek, tako da govori, ali na naslov, ki je ni dejansko legitimno naslov dogajajo slabe stvari. In to je točno tisto, kar se je zgodilo za Binky mislim. Tako opozarjajo, da je zgodba, ki je bil Nick govoril sem bila ista ideja, saj česa Sem sestavljen z iluzijo krede na tabli tam. X in Y sta prijavljeni. Potem smo dodeljen velikost int in shranjena v x. Potem naslednji vrstici sva * x. To je bil Nick čarobno palico od Dereferenciranje. To naj 42 v pomnilniku poudaril x. Ampak to je, če stvari šlo hudo narobe. Kajne? Poskušali smo dereference y. Ampak y imel nekaj lažne vrednosti, kajne? To puščica v spodnjem levem kotiček, ni dejansko kaže na nič. To je nekako to, kar sem pa tu na forumu. Tako slabe stvari dogajajo, segmentacija napaka ali napaka Binky, v tem primeru. Ampak, če bomo nato določiti, da s tem x y dobi kako spremembo zgodbo? Torej, če naredim x dobi Y, ki je in ista kot pravim karkoli že to je, Ox-nekaj se bo enaka tukaj Ox-nekaj. Ali slikovno bomo potegniti puščico. Torej, tukaj na tabli z Binky, z naslednjo vrstico koda * y pomeni iti tja. Kje je tu? To pomeni, da sem. In ko smo posodobiti, da bo 13 to samo pomeni tekoč in pisanje 13 tukaj. Torej, morda ne povsem enostavno na prvi pogled. Ampak da Rekapitulacija in uporabiti isto žargonu da Binky je uporabljal tukaj, tako da Prvi dve razdeli napotke, x in y, vendar ne pointees. In pointees ne običajno uporablja izraz. Ampak kazalec absolutno je. Ampak to je tisto, kar se je izpostavil na v Binky v nomenklaturi. Ta druga skupina, seveda razporeja int pointee. Torej kos pomnilnika - kot sem narisal kot na desna stran obstaja - in set x enak kaže na to. Ta dereferences x za shranjevanje 42 v pomnilnika, ki ga je gledala. In potem je to, seveda, je slaba stvar. Ker y ni obrnjena na kaj še. Ta določa ga. Torej, to je še vedno buggy programa. Samo zato, ker smo piha skozi koda po vrsticah in rekel, oh no, pustite, da crash tam. To je slaba stvar. Stave so Program bo le abort skupaj na tej liniji. Ampak, če ste bili, da odstranite strmoglavilo Line in ga nadomestiti z zadnjih dveh smernicami, ki jih dodelite - uporabo kazalca nalogo - y izpostaviti x kot točka t. In potem si dereference y v zelo varen način. Torej, če nam to pusti? No, izkaže, da je pod pokrovom v knjižnici CS50, kazalci so uporablja v celotnem besedilu. In bomo dejansko začeli z lupino nazaj, da plast pred dolgo. Ampak se je izkazalo tudi, da je izraz nekatere od vas morda pozna, zlasti tistih bolj udobno, je pravzaprav, da od zelo priljubljena Spletna stran, ali prekoračitev, v teh dneh. Ampak to dejansko ima zelo tehnični pomen. Zdaj vemo, kaj stack. To je kot kup pladnjev notranjost jedilnici. Ali znotraj računalniku Pomnilnik njenih teh okvirjev ki se uporablja funkcij. No, izkazalo se je, da zaradi tega zelo preprosta izvedba spomin in okvirji za tako imenovani kup, lahko dejansko prevzeti nadzor v računalniškem sistemu dokaj enostavno. Lahko vdreti v sistem, če ljudje kot da nas ni napisal svojo kodo Zlasti dobro. Če ljudje, kot nas uporablja koščkih spominskih ali uporaba nizi - Še bolj pogosto - ampak včasih pozabite, da preverite Meje našega niza, kot si morda imajo sami včasih, in poudarili, Tako daleč mimo koncu polja. V najboljšem primeru je vaš program lahko samo crash. Segmentacije krivda, nekako v zadrego. Ni veliko, vendar pa to ni nujno zelo slaba stvar. Toda, če je vaš program dejansko na pravi računalnikih uporabnikov, če je tekmovanje v teku na spletni strani, da so dejanski naključnih ljudi na internetu so hitting, dajanje v najem ljudje povzročajo slabe stvari o vašem koda na splošno ni dobro, saj to pomeni priložnost, da se nadzor nad računalnikom. In to se dogaja, da si malo skrivnosten. Mislila sem, da sem te prestrašil s Ta zadnji primer tukaj. Tukaj je primer kode. In tam je dobra Wikipedia Članek, ki hodi skozi to bolj podrobno. Imam glavni na spodnji kliče foo, ki poteka v argv od 1. In to samo zato, da lahko zagon programa in mimo samovoljno vhod. In potem se foo prijaviti do vrh kot sprejemanje niz ali več Natančneje, char *. Nato izjavlja niz znakov. Je buffer, bolj splošno, pokličite velikosti 12. Torej lahko 12 znakov prilagaja notranjosti te matrike se imenuje c. In potem se uporablja to novo funkcijo, ki je nov, vendar ni težko razumeti, spomin kopijo. To kopira spomin iz bara, ki je bil spremenljivka peto n, ne glede Vtipkali v argv 1 v c. Koliko zlogov? Dolžina niza v baru. Torej, z drugimi besedami, če uporabnik vnese v h-e-l-l-o enter, dolžina niza z zdravo je pet. Torej, pet od teh bajtov bo dobil kopirati v matriko imenovano c, ki z velikostjo 12. Toda kaj, uporabnik vnese v veliko dlje Beseda, ki je 13 znakov ali 14 znakov ali 100 znakov ali več? Kam gredo iti? No, to je okvir, da pladenj v jedilnico, hodnik dimnika, oni šli tja. In to je šele tekoč, da začnete prepisovanje druge stvari, ki je že na tem kupu, prepolno sklad, tako rekoč. Torej, slikovno, mislim, da na ta način. To je samo barvita različica slika smo bili risanje. Na dnu, recimo, je glavni. In na vrhu, kaj ste videli zdaj je okvir, barvno kodirane sedaj na funkcijo imenovano foo. Ampak kaj je zanimivo tukaj o foo je, da to je njegova okvir. Torej je sestavljen tako kot I storil, ampak v svetlo modri barvi. In zdaj to je, če c konzola 0 gre. In to je, če c nosilec 11 se bo končalo. Z drugimi besedami, se zgodi, da zastopani kot kvadrat. Ampak, če si obdržati plopping bajte dol - ali ožge - gredo do konca gor na lokaciji 0 vso pot navzgor do 11, ker je 0 indeksirajo. Kje pa je 13. znak bo na koncu? Kje je 14? Kje je 50. znak bo na koncu? To se dogaja, da gredo dol. Ker, čeprav smo pripravljeni Slika z dimnika odraščanja, naslove, se je izkazalo, gredo od majhne naslovi, mala kazalci, do velikih naslovov. Tako da samo ohranja gredo gor in gor. Torej, če uporabnik vnese v Pozdravljeni, to je super. Ne napako, ni problem, varno vsakogar. Ampak, če uporabnik vnese v kaj bomo pokličite kontradiktornost kodo, ki jo zastopa generično kot, napad, napad, napad, napad, kaj se lahko zgodi? Torej, če vse vložka, ki uporabniku vnesli ni samo nekaj prijaznih ali žaljivo niz znakov. To je pravzaprav zaporedje znakov da, če ga pripravijo, dejansko je koda. Morda je oznaka, ki izbriše vse datotek na trdem disku ali pošilja spam ali nekaj takega. Obvestilo, da tisto, kar je ključnega pomena v tem, da če je slab fant dobil dovolj srečni, da prepisati rdeči kos pomnilnika - ki jih nisem pripraviti na mojo sliko, ampak To Wikipedia slika tukaj je - njegova tako imenovana Povratni naslov. Ko se vrne hrana, ko swap vrne, kako računalnik vedo, da gredo iz do tu do tu dol? Ali v tech segmentu do zgoraj, kako tako ne vedo, da gredo od zamenjave koda - 0 in 1 je da sestavite swap - Nazaj na glavno? Tam je tako imenovani povratni naslov shranjeni v isti dimnik okvir, na Enako kavarno pladenj. Torej, če je slab fant je dovolj pameten, da dal napad kodo, napad kodo, napad kodo, in dobili srečo - pogosto s pomočjo poskusov in napak - na prepisala tisto rdečo povratni naslov, z naslovom in obvestilo vrhu. Obvestilo 0835C080. To je napisano nazaj gor top za Razlogi bomo morda ponovno. To je ta številka. Torej, če je slab človek dobi dovolj srečni ali je dovolj pameten, da prepišete rdeča strip spomina z naslovom koda, da on ali ona ima nekako vbrizga v računalnik, mislim, katerih Koda se bo vrnil na takoj foo poteka izvršitve? Koda slab fant je. Torej to kodo napada, AAA, še enkrat, morda pošiljanje neželene elektronske pošte, lahko izbrišete vse datoteke na trdem disku. Ampak to je tisto, kar resnično prekoračitev je ali pufer prekoračitev ali Overflow napad. In to je neverjetno, neverjetno pogosti na ta dan s programi napisani v C, C + + in celo nekateri drugi jeziki. Na tej strašno opombo, da bomo konec s šalo. [SMEH] Se vidimo v sredo. Na naslednjem CS50 - Tako da sem vse od diskov svetilk danes pa počakajte, brez maščob mleka, pol telefon knjiga, pomarančni sok da sem danes pil. USB kabel, ključ. [Predvajanja glasbe]