[Glazba svira] David J. Malan: Dobro je to CS50 i to je početak tjedna pet. Tako danas, ispod vaših jastuka sjedala, nećete pronaći ništa. No prije, trebali naći ove, Malo znak zahvalnosti za sve o radu koji ste stavili u igri petnaestorice. Jednostavno uklonite mali krug na Dno početi igrati za Ostatak klase. Dakle podsjetiti da, ili znate taj problem postavili četiri, što iziđe ovaj vikend, uključuje pisanje još jednu igru. No, ovaj put se radi o korištenju Stvarni grafičko korisničko sučelje, a ne tekstualno sučelje kao što je Igra od petnaest je. A igra koja se nalazi ispred vas, Ako još niste vidjeli ovaj sljedeći, izgleda malo nešto ovako. Ja ću ići u moj terminala Prozor ovdje u GDB. I ja ću ići naprijed i pokrenuti Osoblje rješenje, kojima možete pristupiti nakon pokretanja ažuriranja 50, kao i obično. Ali ću ga staviti u malo Tajna mode, malo uskršnje jaje, tzv. Bog mode, prema stavljanjem Boga u argv1. I moram slijediti svoje vlastite smjernice, prikazuju ga u moj vlastiti Problem postavljena imenik. Tako sada možete vidjeti kompletnu verziju u igri za bijeg. U stvari, to je ne-ruke mode. Dakle, to je zapravo - zapanjeni iako bi moglo biti - prilično trivijalna za provedbu Boga način u Bijeg, za razliku od petnaestorice igre, što neki od vas možda su se osvrnuli za hakerske izdanju. U bijeg dovoljno u Boga Način jednostavno za napraviti što, intuitivno s lopaticama? Baš bi to bilo jednako horizontalni položaj je u loptu. I tako dugo dok ste to učinili u lockstep s lopta se kreće ova igra će Nikada, nikada, nikada propustiti loptu a vi ćete pobijediti svaki put. No, u ovotjednom izdanju hakerske tu je više nego samo Bog modu. Postoji niz drugih mogućnosti. Među njima, laseri. Tako da ako ste stvarno dobili ste nestrpljivi Možete početi obaranje cigle i nekoliko drugih. A za one koji bi željeli kalibriranje standarda u odnosu na hakerske izdanje, ja mogu vidjeti da je ovaj tjedan Haker izdanje je namjerno Malo više izvodljiv, kažu, od Boga Način je s igra od petnaest. Dakle, ako ste u potrazi za rastezanje i ste u potrazi za nekim dodatnim zabave značajke ne roniti u, ako interesa. Sada više praktički, neka mi naglasiti iz jedne stvari kao dobro. GDB, što neki od vas ne može imati još dotakla osobno, što je u redu. No, sada je stvarno vrijeme da se navikne za to i ugodno s ovim alatom jer to će učiniti svoje živote puno lakše, doista. Po Rob je predavanje o GDB par tjedana, prisjetimo GDB da je za ispravljanje. To je alat koji vam omogućuje da pokrenete svoj Program ali pokrenuti ga korak po korak, sukladno po redak, tako da možete džaku okolo, , tako da možete vidjeti stvari koje se dešavaju, pa koje možete isprintati Vrijednosti varijabli. Ukratko, to vam daje još mnogo toga Snaga od printDef radi. Sada, doduše, sučelje je prilično kompliciranih. Crno-bijeli tekstualna sučelja za najveći dio. Naredbe su nešto teška sjetiti na prvom mjestu. No, iako bi to moglo potrajati te pola sat, sat, staviti da unaprijed ulaganje vremena u nju, vjeruj mi. Dakako po semestru kraja ona će vas spasiti da red veličine više Vrijeme od toga. Dakle, početkom tjedna ronjenja u. I u smislu bijeg, znam da ste Možete to učiniti tako dugo dok imate Raspodjela broj ili svoj broj u tijeku u vašem Pst4 imeniku. Znajte da možete pokrenuti gdb. / Prebacivanje. To će otvoriti prozor kao što je ovaj. Dopustite mi osobno dati više od prozor terminala. I što onda ću ići naprijed i ne, to nije samo ga pokrenuti. Ja ću prvi postaviti break Podsjetimo, koji vam omogućuje da pauzirati izvršenje na određenom mjestu. Dovoljno je držati jednostavne stvari idem razbiti na liniji jedan samo upisivanjem broj jedan. Dopustite mi zapravo ponovno otvoriti ovaj prozor jer to je sve Malo malo tamo. Dakle, ono što sam sada ću učiniti ovdje je ako sam otvoriti moj prozor terminala. Hajde, idemo tamo. Pa sad, ako se vratim u dropbox, Pst4 i pokrenuti gdb. / Bijeg ući, primijetit Ja ću razbiti jedan za postavljanje pauza točka na liniji jedan. A sada ću ići putovanja naprijed i pokrenuti. I kad sam to učiniti, primijetit ništa Čini se dogoditi. Nema pop-up. Nema grafički Korisničko sučelje još. Ali to je razumljivo jer sam doslovno na liniji jedan u mom programu. I primijetiti da sam brzo proslijeđena, posebno danas do 62, jer sve stvari na vrhu ove datoteke je stvari kao što su komentari i konstanti i nezanimljivo stvari za sada. Sada sam unutar glavnih, čini se, na liniji 62. A to je samo distribucija broj, opoziv. Ako sam otvoriti ovaj gore odlaskom, na sličan način, u moj direktorij drop box u Pst4, u breakout.c. A ako sam se pomaknite prema dolje i dolje i dolje, i neka mi ići naprijed i uključite moje brojeve linija. Ono što ćete vidjeti, ako sam se pomaknite prema dolje do linije 62, upravo linija koja smo zastali na. Tako ovaj redak ovdje, 62, je gdje smo o tome da bude. Tako sada u GDB, ako idem naprijed i upišite Sada sljedeći, unesite to će izvršiti tu liniju. I voila, imamo takozvana g prozor. Ako nisu upoznati s tim što GWindow je, ne brini. Spec. će vas uvesti u njega, kao te brojnim prohod videa ugrađen u spec.. No, sada ćemo to učiniti Malo više zanimljiv. Dopustite mi da se presele ovaj prozor tijekom na stranu malo. Dopustite mi napraviti prozor malo veća tako da ja mogu vidjeti više. I sad neka mi ići naprijed i učiniti ponovno. A tu su i moji opeke. Ako sam upisati sljedeći opet sad vidim loptu. I ako upišete iduće opet Sada vidim veslo. I srećom, to nije gedit Stvarno surađuje by me pokazujući sve što želim. Ali sada, ako sam učiniti opet, Sljedeći opet, ja sam samo proglašenje neke varijable. I ja mogu ispisati bilo jedno od ovih dečki iz. Ispis opeke, otisci života. A sada, ako sam i dalje raditi Sljedeći, primijetiti da ću se unutar tog kruga. No, broj će se izvršiti točno onako kako očekujem. Dakle, kad sam udario ovu funkciju, čekajte za Klik, to će učiniti doslovno to. Tako sam se činilo da su izgubili kontrolu preko programa. GDB nije mi daje jedan redak. No, ne brinite. Idi na mojoj igri, kliknite negdje. I voila, sada se nastavlja liniju 86. Pa opet, to je neprocjenjivo, u konačnici, za ispravljanje pogrešaka problema. Budući da doslovno možete korak kroz vaš broj, ispis i još mnogo stvari, mnogo, mnogo toga. Ali za sada, te alate sami Ukoliko ste dobili prilično daleko. Tako smo, naravno, uzimajući pogled na Grafika sada, sve je odjednom. I sada naš svijet dobiva malo zanimljivije. I znaš, možda, iz neke od video online da imamo tih hlačice koje ste gledajući kao dio problema setovima. I sam upucan, namjerno, na bijeloj pozadini. A neki od njih imaju nastavu Fellows crtanje neki tekst o Zaslon koji je obložio na strani od njih. Ali, naravno, to nije sve što je Zanimljivo u stvarnom svijetu. Ovo je samo predavaonici s Veliki bijeli zaslon i pozadina. I naša nevjerojatna produkcijski tim sortiranje mjesta čini sve izgledati lijepo nakon što je činjenica izrezivanjem iz Preklapanjem ili ništa činimo ili ne žele. Sada samo motivirati i ovaj tjedan Stvarno, gdje možete otići, u konačnici, u računalnoj znanosti. Ne samo nakon problema postavljena četiri. No, nakon što je drugi tečaj ili cijelog Nastavni plan i program Nevjerojatno je što možete napraviti ovih dana u smislu grafike posebno. Neki od vas možda su vidjeli ovo teče oko online. Ali sam mislio da ću vam pokazati, za samo nekoliko minuta, svjetlucanje što računalne tehnologije i što CGI, računalne grafike može učiniti ovih dana s poznatom pjesmom a možda film. [MUSIC - LANA DEL RAY, "Mlad i lijep] ZVUČNI 1: To je samo malo Nevjerojatno, možda, koliko sveprisutna - [PLJESAK] ZVUČNI 1: Upravo sam ga skinuti. Ali to je stvarno nevjerojatno, mislim, samo Kako sveprisutna softver i broj i alate kao što to stvarno jesu. Dakle, to je okus smjeru u kojem možete ići. Oh, ne više Appliance danas. Pa, to je zapravo tragično vremena s obzirom na točku Samo sam pokušao napraviti. U redu, tako da ćemo pokrenuti Fusion opet. Podsjeti me kasnije. U redu, i trebali su dobili e kao na stranu ako je netko Primijetit kao što je to. U redu, tako da podsjećaju da je prošli tjedan smo počeli guliti natrag ovaj kasnije poznat kao string. string podsjeća na vrstu podataka koji je proglasio u CS50 knjižnici. I to je dio treninga kotača koji će sada početi da skinu. To je koristan koncept rano. No, sada će dobiti više Zanimljivo i snažnije zapravo vidjeti da se ispod haube, string je samo ono, nije mi rekao? Da, tako da je tzv char *. A * postoji označava da postoji nekakva adresu uključeni. I tako, kada kažeš char * samo znači varijabla čija je tip podataka Pokazivač sada. Činjenica da je star postoji samo znači da ste progla takozvane pointer. I to pokazivač će se očito pohraniti adresu, od Tečaj, char. Sad zašto se ovo smisla? Pa, ono što je string ispod haube? Pa, neko vrijeme smo bili rekavši da string ispod haube je Jednostavno h-e-l-l-o, na primjer. No, mi smo razgovarali o tome što da, u biti, polja. I onda bi niz izgleda malo više poput ovoga, a svaki od tih uzimam zalogaj. A onda smo je rekao da postoji nešto posebno ovdje, backslash 0 ili null terminator. Dakle, sve ovo vrijeme, ovo ovdje je string. Ali stvarno, struna zapravo adresa. I adrese, kao što ćemo vidjeti, često su prefiksom s 0x po konvenciji. Što 0x označavaju? Zna li netko? Dakle, to samo znači heksadecimalni. Pa možda podsjetiti, zapravo, iz PST 1, vjerujem, jedna od zagrijavanja pitanja zapravo pitao o heksadecimalni zapis osim binarni i decimalni. I ovdje je motivacija da s heksadecimalnom imate 16 znamenaka na raspolaganju. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, nakon čega slijedi od a, b, c, d, e, f. A ako računamo sve one do, ste dobili ukupno 16 godina. Dakle, to je u suprotnosti s decimala, gdje imamo 10 znamenke, 0 do devet. To je u suprotnosti s binarnim gdje smo samo 0 i 1. Ali na kraju dana možete jednostavno predstavljaju iste brojeve, ali nešto drugačije. I hexadecimal je uobičajeno jer kao ispada - pa ćemo vidjeti kasnije u tijeku - čak i kada smo dobili na web programiranje u kontekstu HTML i kodove boja, hexadecimal je lijepo. Budući da svake znamenke, ispada, predstavlja četiri bita savršeno. Dakle, to je samo vrsta linija se lijepo kao što smo na kraju ćete vidjeti. Dakle, ovo bi moglo biti Ox123 ili nešto kao što je to, označava adresa 123 negdje u mome memorije računala. Ali, naravno, neki se pojave problemi zbog toga temeljni Provedba. A sjećam da sam uzeo nož na provedbu funkcije kao što je ovaj - usporedite crtica 0 dot c prošlog tjedna, kako iako je izgledalo kao da je Dobro, to jednostavno nije usporedite dvije žice ispravno. Ja sam bacio glavna, a ja sam bačena daleko su komentari samo da se usredotočite na kod koji je od interesa ovdje. I to je u crveno jer je lud. Iz kojeg razloga? Pa, na vrhu tamo kad sam proglasio string, ono što se stvarno događa ispod haube? Pa, dopustite mi da ide preko zaslon ovdje i privući da. Tako sam izjavio, opet, niz s GetString. Dakle, ja ću ići naprijed i sada skrenuti s za ono što zapravo jest. To će biti trg ovdje. I ja ću tvrditi da je to 32 bita. Barem to obično biva, barem na CS50 aparata u puno računala. Ja ću ga nazvati e. Ali sada sjetiti da smo zove GetString. Dakle GetString se vraća, Naravno, niz. Ako korisnik upiše u h-e-l-l-o upišite string Hello dobiva vratio. I to string, kao što smo upravo rekao, završava negdje u memorije računala s obrnute kose 0 na kraju. Ja ću povući ovu kao niz - ili granični blok znakova - da je ona zapravo je. A sada, ono što je GetString zapravo vraćaju? Ono što je GetString vraćaju sve ovo vrijeme? Pa, recimo, u tjednima prije, vraća string. No, više tehnički, što se GetString povratak očito? PUBLIKA: adresa. ZVUČNI 1: adresa. Naime to vraća adresu Prvi zalogaj, što god da je. Ja samo držati koristeći jedan, dva, tri zato što je zgodan. To vraća adresu prvog znakova u nizu. I rekao je prošlog tjedna da je to je dovoljno. Jer uvijek možemo shvatiti gdje kraj niza samo Ponavljanje preko njega, možda, s za petlje ili while petlje ili nešto slično da, samo u potrazi za "obrnute kose 0", Posebna Sentinel znakova. I znamo da je string dogoditi da bude duljine - u ovom slučaju - pet. Dakle tehnički ono GetString radi se vraća Ox123 u ovom slučaju. A što se onda dogodi tehnički je da pohranjujemo, unutar s., Ox123. Na kraju dana, iako je to je novi koncept, pokazivače, oni su samo varijable. No, oni se dogoditi za pohranu bitova koji skupno predstavljaju adresu. Dakle tehnički sve što dobiva pohranjeni u S je Ox123. No, mi kao ljudi - uključujući i danas ide dalje - Stvarno se ne ide na skrb, u pravilu, što je stvarna adresa nekog komad memorije. To je samo na niskoj razini detalja na biti intelektualno zanimljiva. Tako ću poništiti. A umjesto toga, više visokoj razini, samo reci da kada govorimo o pokazivače Ja ću samo privući više razumljiv strelica koja prenosi Ista ideja i sažeci daleko pojedinosti o tome što je stvarni temeljni adresa. Sada, ako se vratimo u kodu, što dogodilo prošli tjedan, ako imamo string t jednako GetString? Pa, ako sam opet, tip u Pozdrav ovaj put ću doći jedan komad memorije. h-e-l-l-o backslash 0. Ali zato sam nazvao GetString drugi put - i znam to iz gleda izvorni kod za GetString - čak iako je slučajnost da je halo upisali u dva puta, GetString nije će pokušati optimizirati i biti pametan. To samo ide da biste dobili još jedan komad memorije od računala, što je će biti na drugoj adresi. Neka je samo reći 456 samovoljno. I što onda će to vratiti? To će vratiti 456 i pohraniti ga u t. Dakle, ono što se stvarno događa, na Lijeva strana je imam još jedan komad memorije, 32 bita obično. I tamo će ići Ox456. Ali opet, nisam zainteresiran za to određene brojeve više. Samo ću se apstraktno to nacrtati kao strijela. Dakle, ovo je sad novo objašnjenje. Ali to je isto točno ideja koja je se događalo sve ovo vrijeme. I tako onda razlog, da je ovaj prvi verzija usporediti bio lud prošli tjedan je razlog zašto? Kada to učinite, ako je jednaka jednaka t ono što su doista Ispod poklopca motora usporedbe? Vi ste uspoređujući adrese. I samo intuitivno, jasno, Ox123 ne ide na jednaku Ox456. Ti brojevi, one bita samo su drugačija. I tako stalno, prošli tjedan je izjavio upišete različite stvari, čak i ako Riječi su bile riječi do riječi isti. Tako smo popraviti. U laik uvjete, što je popraviti? PUBLIKA: Koristite funkciju. ZVUČNI 1: Koristite funkciju. Ili zvjezdica svakako su uključeni, ali koristiti funkciju učiniti što? PUBLIKA: Za usporedbu konce. ZVUČNI 1: Kako biste usporedili konce. Dakle, osnovni problem je ovdje bio da sam bio s obzirom Kvaliteta žice koje će definirati usporedba njihovih adresa. I očito da je glupo sad odjednom razumiješ što se događa ispod poklopca motora. Da doista usporediti žice da vidi je li oni su jednaki u načinu na koji ljudi će razmotriti dvije žice biti jednaki trebamo usporediti ih znak za znak za karaktera. Sada sam mogao učiniti ovaj vrlo dosadnog. No, familijarno, mi smo pomoću for petlje. I samo usporediti s. nosač ja protiv t bracket ja. Nosač je i plus 1 protiv t nosač i plus 1, i tako dalje, unutar neka vrsta petlje. I ako uočite da dva lika razlikuju, ili ako sam shvatiti da uuu, s. kraći od t ili dulje od t I odmah mogu reći lažna, oni nisu isti. Ali ako ja dobiti kroz S i T i reći Isto, isto, isto, isto, isto, kraj obje žice, mogu reći Istina, oni su jednaki. Pa, hvala bogu, godina netko pisao taj kod za nas. A oni su ga zvali StrComp za usporedbu string. I iako je to malo brojač intuitivno, StrComp vraća 0 ako su oni dvije žice, S i T su isti. No, ona se vraća negativnu vrijednost ako je trebao doći prije t po abecednom redu ili Pozitivna vrijednost ako bi trebao doći nakon t po abecedi. Dakle, ako ste ikada željeli riješiti nešto, ispada da StrComp je korisno. Jer to ne samo reći da ili ne, jednaka ili ne. To vam daje osjećaj naručivanja sviđa moć rječnik. Dakle StrComp, a zarez t jednaka jednako 0 znači da je žice su doista jednaki. Jer onaj tko je napisao ovu funkciju godina vjerojatno koristiti za petlju ili while petlje ili nešto slično integrirati preko likova ponovno i opet i opet. No, problem s dva je nastao ovdje. Ovo je copy0.c. I dvije u crvenom je jer je manjkav. A što mi radimo ovdje? Pa, prvo sam nazvao GetString. I sam pohranjeni povratnu vrijednost u s.. Dakle, to je uglavnom isti kao i ovaj gornji dio slike. No, ono što dolazi nakon toga? Pa, dopustite mi da ide naprijed i riješi od cijela hrpa toga. Mi ćemo natrag u vrijeme u kojem smo upravo imaju s, što je konzistentno s linije jedan gore. Ja provjeriti. Ako je jednaka jednaka je 0. Sada, brzo strani bilješku, kada je Možda GetString povratak 0? Nema dovoljno memorije. Točno? To je rijetkost da će se to dogoditi, Sigurno na računalu koje je dobio stotine ili megs čak gigs od RAM-a. No, to bi mogao, u teoriji, vratite 0, pogotovo ako korisnik ne surađuju. Ima načina da se pretvarati kao da niste uneseni ništa i trik GetString u povratku 0 učinkovito. Dakle, to će se provjeriti za to. Jer, ako je netko od vas počeo dobili, već, segmentacije mane - koji je vjerojatno bio izvor neke frustracije - one su gotovo uvijek rezultat memorije vezane pogreške. Nekako ste messed up s obzirom na pokazivač, čak i ako nisu shvatili Tu je pointer. Dakle, možda su izazvana segmentaciju greške što je prije tjedan dana jedan pomoću nešto kao za petlje ili neko vrijeme petlje i niz od strane ide predaleko Posljednjih granica neki niz koji proglasio da, u tjednu u dva Osobito. Možda ste to učinili ni u problemu postavite četiri s bijeg. Iako vjerojatno niste vidjeli sve zvijezde u distribucijsku koda za Bijeg, ispada da oni GRect i GOval i druge takve stvari, oni su zapravo upućuje ispod poklopca motora. No, Stanford, poput nas, vrsta kože da detaljno barem za knjižnice svrhe, baš kao i mi za gudački i char *. Ali GRect i GOval i svih onih stvari koje su ti dečki ili će se pomoću ovaj tjedan su u konačnici memorijske adrese. Vi jednostavno ne znate. Dakle, to je ne čudi onda, možda, da možda zapeti neke segmentacija greške. No, ono što je zanimljivo ovdje, Ako nakon što smo provjeriti za 0 radimo string t dobiva s.. Pa, dopustite mi da proglasi t. Ja ću ga izvući kao trga, 32 bita, zovu t. A onda ću to učiniti dobiva s.. Pa, što to znači? Pa, to je malo teško razmišljati o tome zamisliti mudar. Ali neka je razmišljati o što je unutra x? Što je doslovce unutar ove varijable? Vrijednost Ox123. Dakle, kad kažem string t dobiva e, koja je upravo doslovno znači uzeti broj u sekundama, koje je Ox123 i staviti ga Ox123. Ili slikovito, ako ja vrsta apstraktne daleko od toga da ima detaljno Učinak doslovno radi to kao dobro. Pa sad, mislim natrag na prošlog tjedna kada je nastavili smo s kapitalističkom T. I. je T 0 nosača. Pa, T 0 nosača, iako je pointer, možete ga tretirati kao da je to polje, s kvadratičnim Nosač zapis. Dakle, gdje je T nosač 0? Pa, to je h. I tako kada koristimo tu liniju koda, dva gornja, što je u tom c type.h header file, to je gdje proglašena. Vi ste kapitaliziranje ovu H. No, od Naravno, to je isto točno h to je unutar e, da se tako izrazim. I tako sada ste promijenili ili kapitaliziraju se izvornik i takozvana kopija. Budući da nije za kopiranje Način na koji ljudi bi željeli da bude. Dakle, ono što je ovdje popraviti, u copy1.c prošlog tjedna? Funkcije, tako da smo zapravo mogli kopirati string. I bitno, što trebamo učiniti kako bi kopirali string? Pa, u toj zelenoj verziji ovdje sam učiniti ga prilično niskoj razini. Tu su zapravo funkcionira oni bi mogli pomoći s ovim. No, većina osnovnih jedan, a najviše upoznati jedan, u najmanju ruku, će uskoro biti upoznati s nama, je sljedeći - tako da se u prvom retku koda u zelenom danas. Upravo sam ponovo napisao s kao char *. Nema funkcionalni Razlika postoji. Upravo sam bacio CS50 knjižnicu i Ja sam ga zovete što je to, char *. Sada točka, točka, točka, jer je bilo neka pogreška provjere da nije zanimljivo razgovarati o jednom. Dakle, sada je proglasio t. To je također znak *. Tako sam nacrtao mali trg na Zaslon kao prije. No, na desnoj strani, malloc, rekao mi je izdvojiti memorije. Dakle izdvojiti neki komad memorije. A koliko bajtova mi zapravo želite izdvojiti, to čini? Pa, string duljina s.. Dakle, ako je to je halo će biti pet. Mi ćemo reći h-e-l-l-o. Dakle, pet bajtova. Ali onda plus jedan, zašto 1? 0 znakova. Ako mi ne ostavljaju prostor za ovim tipom smo možda slučajno stvoriti situaciju gdje je struna h-e-l-l-o. I onda sljedeći put GetString je nazvao i sam upisati, primjerice, David, D-a-v-i-d, računalo će mislim da je zapravo h-e-l-l-o-d-a-v-i-d jer je nema pauze između tih riječi. Dakle, trebamo tu pauzu. Dakle, mi ne želimo pet. Želimo šest bajtova. I bajtova kažem. Ali to je doista vrijeme veličina Char. Tehnički znak je gotovo Uvijek jedan byte. No, samo da bi naš broj prenosiv, da tako kažemo, tako da se radi na različitih računala, čak i ako su na njega biti nešto drugačiji ispod napa, idem generički kažu veličina znak da moj broj uvijek rade. I nemam ga kompilirati samo jer sam nadograditi moje računalo ili koristite Neki različite platforme. Tako sam dobio 6 puta većeg char, koja bi trebala iznositi 1. Dakle, to znači da bi malloc daj mi šest bajtova. Što je to zapravo radi? Pa, neka mi vratiti u vrijeme ovdje gdje smo u toj priči. Dakle, ako sam se vratiti ovdje, ja sam proglasio char * t zove. Sada sam nazvao malloc za šest bajtova. A sada ću izvući tih šest bajtova baš kao i niz ranije. Ali ja zapravo ne znaju što je u ovom polju. Ako alocirati memoriju ispada da ne mogu vjerovati da postoji neki Poznato vrijednost postoji. Moglo se koriste nečim drugo, neka druga funkcija, neke druge linija koda koju je napisao. Dakle, mi općenito zvat ove smeće Vrijednosti i privući ih, možda, kako upitnika, samo pokazuje da smo ne znam što je zapravo tamo. I to nije velika stvar, tako dugo dok se su dovoljno pametni da prepisati onima Kante vrijednosti s brojevima ili znakovi da mi je stalo. Dakle, u ovom slučaju ono što ću učiniti? Pa, moja linija koda Sljedeći, imam četvero. int ja dobiti 0, n dobiva string duljina s.. Dakle, poznato za petlju. I je manji od ili jednak n, koji je obično iznad. No, ovaj put to je namjerno. Ja + +, a onda sam jednostavno napraviti t nosač ja dobiva s.. Budući da moja slika izgleda ovako, na taj trenutak, pohranjena je u t adresa tih slučajnih komad memorije čije vrijednosti su nepoznati. No, čim sam to t nosač 0 koji me poslao ovdje. A što završi uzimajući privučeni tamo? Mi završiti stavljanjem h. Jer to je ono što je na s nosača 0. A onda ista stvar za e, i l i l, i o. n, zašto sam ići gore kroz jednaka je n? Zbog 0 karaktera. Dakle, samo da bude jasno, a zatim, ako ja zapravo izbriše god to smeće vrijednosti, a onda zapravo privući u što očekujem, to je nosač 1, 2, 3, 4, plus koji je prateći novi lik. I sad ako mi i dalje prošlosti točke, točka, točka u ovoj verziji ispravan a kapitalizirana t nosač 0 Bih, od Tečaj se kapitaliziraju samo ovaj momak ovdje, koji konceptualno, je u konačnici cilj. Pa to je sve pokazivač. A ti si bio koristeći ih za nekoliko tjedana Sada u kontekstu žice. No, ispod poklopca motora su malo složeniji. Ali ako mislite o njima u ovom slikovni oblik Predlažem da su oni Vjerojatno nije sve što je zastrašujuće što su oni Možda prvi činiti na prvi pogled, pogotovo s takvim novim sintakse. Bilo kakva pitanja na pokazivače, žice, ili znakova? Da? Publika: Može li se vratiti za [nečujno]? ZVUČNI 1: Svakako. PUBLIKA: Pa kako dolaze u vaš posljednji linije, nemate liniju T * i * je u liniji? Ne možete imati referencu na - ZVUČNI 1: Ah, stvarno dobro pitanje. Zašto ne imam i * t * e? Zbog kratko, prošlog tjedna, kao u našem zamijeniti funkcije, ja nisam rekao da kada imaš pokazivač sredstva pomoću koji idete tamo, kao što smo učinili fizički na pozornici, bio je zapravo koristite operator zvijezda. Ispada da je ovaj trg-nosač Oznaka je ono što ćemo nazvati sintaktička šećera, što je samo seksi način rekavši da je stenografsku zapis za upravo ono što opisuje. Ali to je malo više intuitivno. I na rizik što to čini više komplicirana nego što treba biti, što se zapravo događa ovdje je sljedeće - Ako kažem * t to znači ići u Adresa pohranjeni u t. Dakle, doslovno, ako t je spremanje adresa tog h početku, * t znači ići tamo. Sada, što t nosač 0 znači? Sve točno stvar. To je samo malo više user friendly pisati. Ali nisam još gotov. Ne mogu samo reći * t * S dobiva. Zato što bih se onda radiš? Ja bih se stavljanjem h, h, h, h, h kroz cijelu stvar. Točno? Jer * t je otići na adresu u t. Ali, mi smo unutar petlje. A što sam ja povećavanjem vrijednosti, Naravno, na svakoj iteraciji? ja. No, tu je prilika ovdje, zar ne? Iako to se osjeća kao da je dobivanje malo sofisticiraniji od square-nosača zapisa upotrijebili smo za neko vrijeme - dopustite mi da poništi moje promjene h postoji - iako je sada uzimajući malo uzgajivač, osnovna ideja, ako * t znaci ovdje i * t je samo idite na adresu u t. No, ono što je adresa ut? Broj držimo koristite? Kao Ox456, neka to donijeti natrag samo zbog rasprave. Pa, ako želim dobiti na e se u t string, ja samo želim ići, u biti, 456. Odnosno, 457. Moram samo dodati jedan. No, ja to mogu, zar ne? Zbog t, iako držim crtež ona je sada kao strijela, to je samo broj, Ox456. A ako dodam da je jedan ili više Općenito, ako sam ja dodati da ja mogu zapravo dobiti točno gdje želim. Dakle, ako ja zapravo učiniti - i to je ono što se sada zove pointer aritmetika - Ja mogu ukloniti ovu liniju. Koji je, iskreno, mislim jasnije i Malo više user friendly za čitanje. No, to nije ništa manje točna. Ova linija koda sada koristi pointer aritmetiku. To govori otići adrese - što je početak t, koji je t plus i, koji je u početku je 0, što je velik. Jer to znači početak t plus 1, plus 2, plus 3, i tako dalje. A isto se bave s. Dakle sintaktička šećera za to. Ali razumijevanje onoga što se doista događa ispod poklopca motora, ja bih rekao, je zapravo korisna i sama od sebe. Jer to znači da sada ne postoji mnogo magiju događa ispod poklopca motora. Tu se ne ide da se još mnogo toga naslage, koje možemo guliti natrag za vas. Ovo je c. A to je programiranje. Stvarno dobro pitanje. U redu, tako da je ovo bio da je lud Program sam mislio na ranije. Swap je manjkav. Ako se činilo da rade. Sjetite se da baš kao s mlijekom i sok od naranče - koji sam započeo pio današnju demonstraciju. Dakle, baš kao i sa sokom od naranče i mlijeko, imali smo koristiti privremena varijabla, tmp, držati privremeno, tako da smo mogli onda promijeniti svoju vrijednost, a zatim ažurirati b. No, ova funkcija, rekli smo, ili ovaj Program u kojem je ova funkcija napisao je krivo i manjkav, zašto? Da? PUBLIKA: [nečujno]. ZVUČNI 1: Točno, kada je nazovete zamjenu - ili općenitije, kada nazovite najviše bilo koju funkciju - ako su argumenti na toj funkciji su primitivne, da se tako izrazim, Ints i znakova i parovi i pluta, stvari bez zvjezdica, što prolaze kopijom argument. Dakle, ako je x 1 i y je 2, ide da je 1 i B će biti 2. No, oni će biti različite komade bitova, različitim komadima memorije koji se dogoditi da se skladištenje identične vrijednosti. Dakle, ovaj broj je super savršena kod zamjene A i B. To nije dobro, na zamjene - u prošlotjednom primjer - x i y. Jer opet, oni su u pogrešnom opsegu. Sada, kako smo to ide o utvrđivanju? Morali smo napraviti funkciju izgleda malo uglier. Ali opet, razmislite što to samo znači. I zapravo, neka mi, za dosljednost, promijeniti jednu stvar tako da je identičan ono što smo upravo učinili. Kao što sam spomenuo prošlog tjedna, to ne važno gdje to ide. Zapravo, obično bi stavili star uz ime varijable. No, mislim da će to biti malo lakše uzeti u obzir * uz tip podataka, kao što znači da je pokazivač kao int u ovom slučaju. Pa što ja radim ovdje? Ja govorim ne daju mi ​​int i još jednom int, nazivajući ih ib. Daj mi adresu int. Daj mi adresu drugog int. Poziv na one adrese A i B. A onda pomoću * zapis prema dolje u nastavku, ići na svaku od tih adresa koliko je potrebno da biste dobili bilo ili postavite vrijednost. No, postoji iznimka. Zašto ne imati * pored MPT? Zašto mi to učiniti, na primjer? To se osjeća kao da bi trebala ići sve van i ispraviti cijelu stvar. Da? PUBLIKA: [nečujno]. ZVUČNI 1: Nisam proglasio tmp kao string. Dakle, to bi deklarirati, u ovom slučaju, tmp kako bi se adresa int. Ali to nije sasvim ono što želim, za nekoliko razloga. PUBLIKA: Vi ne želite da ih zamijene. ZVUČNI 1: Točno, ne želim se mijenjati ništa s MPT. tmp je samo Tjedan-jedna stvar. Sve što želim je promjenjiva spremiti neki broj. Ja uopće ne brinu o adresama u ovom trenutku. Trebam samo 32 bita ili pa za spremanje int. I želim staviti u tim 32 bita što nije u, da tako kažemo, ali što je u, samo da budemo precizniji. Jer ako je adresa, * znači otići tamo i dobiti vrijednost 1. Na primjer, u prošlotjednom primjer ili u slučaju B-a, dobiti vrijednost 2. Dakle, ono što se doista događa? Dopustite mi nacrtati ovdje koji će Samo zafrkavati, osim dijela danas. No, to će se nastaviti prikazivati za neko vrijeme. Ovaj, ja tvrdim, je ono što vaše računalo ' memorije izgleda kad naiđete Program, bilo koji program. Kada pokrenete program, na samom vrhu vašeg računala RAM-a - tako misle ovaj pravokutnik, doista, kao i vaši računala RAM-a ili memorije, sve 101 milijardi bajtova njega, sve dvije milijarde bajtova, svim dva gigabajta njega, bez obzira na količinu imate je, neka je skrenuti ga kao pravokutnik. A ja tvrdim da kad pokrenete program kao što su Microsoft Word ili Chrome ili bilo što slično, da se bitovi Microsoft i Google koji je napisao - u slučaju tih programa - se učitava u memoriju Vašeg računala gdje se mogu izvršiti više brzo i hranio u CPU, koji se je mozak računala. I u TAM pohranjene su na samom Vrh svoj program, da se tako izrazim. Drugim riječima, ako je to komad memorije, kada je dva puta kliknuti na Microsoft Word, komadići dolaze s tvrdog diska. Oni se učitava u RAM. A mi ćemo ih gurati prema gore, na samom vrhu ovog pravokutnika konceptualno. Pa, ostatak sjećanju je koristi za različite stvari. Na samom vrhu vidite inicijalizirati Podaci i uninitialize podatke. To ima veze, za najveći dio, s Konstante ili globalnih varijabli koji imaju vrijednosti. No, više o onima drugi put. Tada imate hrpu, koja vratit ćemo se. No, na dnu je dio koji je Posebno zameci upravo sada. To je tzv stog. Dakle, baš kao i na većini bilo dvorani D ovdje na kampus, imate one posude koje samo slagati jedan na drugi na kojem možete staviti hranu i sitnica. Stog u računalnom sustavu je vrlo slična. Osim dok je u ladicu, što mi koristimo u blagovaonica, dakako, podrazumijeva nositi stvari ladice ili su okviri - kako ćemo ih nazvati - u računalo ' memorija se koristi za držanje varijable i vrijednosti. Dakle, ono što se stvarno na ispod haube? Pa, neka mi prevrtanja na zaslonu ovdje. I neka se usredotočiti samo na donji dio za trenutak. Ako je to donji dio mojih memorije računala ispada kad sam zovemo glavna funkcija - što se događa, iskreno, automatski za mene - Ja dobiti komad memorije na Dno moje RAM se tako izrazim. I ovo je mjesto gdje je glavna lokalnim varijablama ići. To je mjesto gdje argc i argv možda ići, i bilo varijabli I izjavljujem unutar glavna. Oni završiti na dnu od mog računala RAM-a. Sada pretpostavimo da je glavna funkcija poziva kao zamjene, kao što je to učinio prošli tjedan? Pa, u biti smo stavili novu ladicu, Novi okvir, na moj komad memorije. I ja ću se opisuju kao pripadaju swap funkciji. Sada što je unutar swapa? Pa, na temelju prošlotjednog programa i jednom smo upravo vidjeli izvadak iz, unutar okvira zamjenom-a, ili na zamjeni-a ladica, su ono varijabli? Dobro, a i b. Jer, oni su njegovi lokalni argumenata, plus treći, tmp. Pa stvarno, mogao sam izvući ovu malo više čisto. Dopustite mi da ide naprijed i poništiti naljepnicu. I neka mi tvrde da znate što? Vjerojatno će završiti ovdje. B će završiti ovdje. I tmp će završiti ovdje. Sada, naručivanje might biti malo drugačija. No, koncepcijski je to ideja. I samo zajedno, to je ono što zvat ćemo Swap karoseriju, ili blagovaonica-dvoranu ladicu. A isto bave glavna. No, neću ponovno iscrtavanje to. No, to je mjesto gdje argc i argv i bilo njegovih lokalnih varijabli kao što su xiy neće biti na odmet. Pa sad razmislite što se doista događa kada pozvati zamjenu. Kada zovete zamjenu, izvršavanje koda kao to, da ste u prolazu, u kolicima verzija, a i b kao kopije xiy. Dakle, ako ja sada ne nacrtali ovo na zaslonu - dobio bi dobili bolje na to - tako da priča sam govorio sam sebi je u ovom lud verziji, kada smo zamjenjivati ​​sugovornika prolaze doslovno i B kao cijeli brojevi, što se zapravo događa? Pa, ono što se stvarno događa je to. Dopustite mi da ide naprijed i poništiti samo jasno da se neki prostor ovdje. Dakle, ovo je moj memorije računala. Dakle, ako imam, primjerice - zapravo ćemo učiniti na ovaj način - Ako ja tvrdim da je to x, skladištenje vrijednost 1 kao prošlog tjedna. A to je y, spremanje vrijednosti 2 baš kao i prošlog tjedna. I to je glavna, kad zovem zamjenu, dajući sebi pristup, a b i trimetoprim, ja ću tvrditi da ovo i to je 1. To je b. To je 2. To se zove tmp. I u početku, ona ima neku vrijednost smeće dok sam zapravo pohraniti u njemu, što je 1. Onda sam ići naprijed i promijeniti da se što? B vrijednost. I tako sada imam dvije ovdje. I onda mi je rekao b dobiva tmp. Opet, baš kao i razum ček, treći linija koda ovdje je jednostavno to jedan, b dobiva tmp. I tako na kraju, što da radim? I ići naprijed i promijeniti b se god vrijednost MPT je, što je 1. Ne dirajte tmp opet. Ali sada, problem je što je prije swapa vraća, jer to nije hendikep natrag neke vrijednosti, nema povratka Izjava izrijekom u njoj. Što se zapravo događa? Pa, u biti sve to memorije - OK, očito voli gumicu samo jedan prsta - jednostavno nestane. Sada je u stvarnosti to nije ide nigdje. Ali možete misliti na to sada kao upitnicima. Jer to više nije zapravo u uporabi. I ništa ne učini s tim vrijednostima. Dakle, u slučaju zelenoj verziji ovaj broj, što umjesto da se bude prešao u zamjenu? Dakle adrese. Dakle, adresa xi adresa y. Dakle, ako ćemo ponovno ovu priču ispričati jedan zadnji vrijeme, a ja sam zapravo privući zamjenu opet, ali s pokazivačima, to je to što b, a to se tmp, što je zapravo pohranjene u u ovu zelenu verzija mog koda gdje sam prolazeći u adrese? To će biti pokazivač x. Tako sam mogao izvući strijelu. Ali neka je koristiti isti proizvoljna Primjer kao i prije. Recimo da je to nešto poput Ox123. I to će biti zbog Ox127 to četiri bajta daleko, jer je to int, pa Ox127. I opet, ja sam uzimajući neke slobode s brojevima. Oni su puno manji nego što bi zapravo biti iu drugim redoslijedom. Ali to je kako je slika Sada je drugačije. Ali kad sam koristiti ovaj zeleni kod a ja ne int tmp dobili *. * Sredstvo koje treba učiniti sljedeće, uzeti adresa koja je u i ići na njega, što je 1. I to je ono što sam onda staviti u tmp. U međuvremenu, u sljedećem retku koda Ovdje, * dobiva B, što to znači? Pa, *, pa ići ovdje dobiva * b, što znači otići tamo. A to znači da mu je vrijednost na postoji. Konačno, posljednja linija koda jednostavno rekao * b dobiva tmp. Dakle, b, kaže otići tamo i to prebrisati tmp koji, u ovom slučaju, ide da se, opet, 1. I to je razlog zašto zeleni verzija Naš Kodeks djela, dok je crvena Verzija nikada nije učinio. To sve se svodi samo na to kako Memorija je uspio i gdje je zapravo stavlja u računala RAM-a. A za sada, to je jedna od stvari da stog se koristi za. Pitanja o izgledu? Na pokazivače? Ili na zamjeni? U redu, tako da malloc, podsjetimo, učinio ovako nešto. To je super jednostavan primjer. A to je onaj koji Binky upoznao nas, doduše prilično brzo, na kraju razreda. Dovraga, tamo idemo opet. Dakle prisjetiti da je to primjer koji Binky upoznao nas, doduše nešto brzo, na kraju razreda. I ovdje mi se jako malloc po drugi put. Budući da je prvi put smo ga koristiti za stvoriti dovoljno RAM-a, izdvojiti dovoljno RAM-a pohraniti string. Ovaj put Binky držati ga jednostavno. Dakle, to je samo za pohranu int, očito. I to je potpuno u redu. To je malo čudno, iskreno, da koristiti malloc izdvojiti jednu int. Ali točka Nickovom Claymation je zapravo samo ispričati priču o tome što dogodi ili ne dogodi kada da zlostavljaju memorije. Dakle, u ovom slučaju, ovaj program učinio nekoliko stvari. U prvom slučaju ovdje, što proglasi Pokazivač se zove x na int. To onda izjavljuje pokazivač zove y kao int. To onda pohranjuje u x., što? Netko drugi je sada. Ono što se pohranjuju u X prema Treći redak ovog programa? PUBLIKA: [nečujno]. ZVUČNI 1: Pa, ne baš bajtova, po reći. Točnije sada. Što dobiva pohranjena u X? Adresa, mislim da sam ga čuo. Pa što malloc povratak? malloc alocira bihevioralno komad memorije. Ali kako to vam dati pristup do njega? To što se vraća? Adresu prvog bajta s blokom memorije. Sada, ovo je super jednostavna. To je samo jedan bajt, što znači rješavanje mi smo dobivanje natrag adresa cijelu stvar. Tako pohranjeni u x. dakle, adresa tog komad memorije. U međuvremenu, ono što će se dogoditi sljedeće? Pa zapravo, idemo naprijed i izvlačenje iz ove jako brzo. Pa ako ćemo ići preko zaslona i ovdje igramo ovo int * x * y i int će učiniti ono što za mene? Tvrdim da je to samo će učiniti ovako nešto i to nazvati x, a to i zovu y. U međuvremenu, treća linija koda će izdvojiti veličinu int, koji se dogoditi da bude - Žao mi je ako sam rekao jedan prije nego što sam mislio jedan INT - četiri bajta o tipičnom računalu. Barem s CS50 aparata. Dakle, ovo će se izdvojiti da, tko zna? Negdje ovdje. A to je pohranjena na nekom Adresa vol, tko zna? No, ono što se događa da se vratio je da je adresa. No, mi ćemo izvući ovu slikovito samo kao strijela kao što je to. Sada u sljedećem retku * x dobiva 42. Što * x znači u laik uvjete? Dovoljno je otići tamo. Idi na toj adresi. Ili drugim riječima, slijedite Strelica i staviti 42 ima. No, tada se dogodilo nešto loše Binky se, zar ne? Podsjetimo da je linija pet ovdje, * y dobiva 13, doista nesretan broj, A što za nas? Pa, * y znači otići tamo. Pa, to nije dano Vrijednost ipak, zar ne? Kod nema y je postavljene na bilo što. Imali smo x inicijalizacije na adresu. No y proglašen do vrha. Ali onda zarez, nema vrijednosti je zapravo staviti u njega. Tako da je pošteno to nazivamo Vrijednost smeća. Tko zna što je tamo? To su ostaci bitova koji su korišteni neki prethodni redak koda u moj program. Dakle, ako ja kažem otići tamo, to je kao, Nemam pojma gdje je strelica će završiti. I to je kada obično dobili grešku segmentacije. Ako ste slučajno dereference, tako da se govore, ili otići na adresu koja nije zapravo legitimna adresa, loše stvari događaju. A to je upravo ono što se dogodilo razmišljati Binky. Dakle, da podsjetim da je priča da je Nick bio govorim ovdje je ista ideja, kao što Ja sam nacrtana s iluzijom kredom na ploči tamo. X i Y su objavljene. Onda smo dodijeljeno veličinu int i spremio je u x.. Onda sljedeći redak jesmo * x. Ovo je Nickova čarobni štapić od dereferencing. To mu 42 u memoriji istaknuo x. No, to je mjesto gdje stvari otišao užasno krivo. Točno? Pokušali smo dereference y. No y imao neke lažne vrijednosti, zar ne? To strelicu u donjem lijevom kutak, nije zapravo ukazuje na ništa. To je vrsta radiš ono što sam A ovdje na brodu. Tako se loše stvari događaju, segmentacije kvara ili Binky kriv, u ovom slučaju. Ali ako mi onda popraviti da radi x dobiva y Kako se priča promjenu? Pa, ako mi je činiti X dobiva y, to je učinkovito isto što i reći bez obzira na to, vol-nešto će biti isto ovdje, Ox-nešto. Ili slikovito ćemo izvući strijelu. Dakle, ovdje na brodu s Binky, sa sljedećim liniju broj, * y znači otići tamo. Gdje je tu? To znači da ovamo. A kad smo ažurirali da se 13 to samo ide i uključuje piše 13 ovdje. Pa možda i nije posve jednostavno na prvi pogled. Ali da ponovim i koristiti iste žargon da Binky je korištenjem ovdje, pa Prva dva izdvojiti naputke, x i y, ali ne i pointees. I pointees nije uglavnom koriste termin. No, apsolutno je pointer. Ali to je ono što se ukazao na Binky je u nomenklaturi. Ova nova linija, naravno, dodjeljuje int pointee. Dakle komad memorije - kao što sam nacrtao na na desna strana postoji - i skup x jednak ukazati na njega. Ovo dereferences x pohraniti 42 osobe memorije da je to pokazivao. I onda, naravno, bila je loša stvar. Zbog y nije pokazivao na još ništa. To ga popravlja. Dakle, ovo je još uvijek lud programa. Samo zato što smo puše kroz Kod redak po redak i govore, oh dobro, neka ga srušiti postoji. To je loša stvar. Tečajevi su program samo će pobaciti uopce na toj liniji. Ali, ako ste bili ukloniti srušio postroje i zamijeniti ga s posljednja dva redaka nalaze li zauzet - pomoću pokazivača zadatak - y ukazati na x kao točka t. I onda dereference y na vrlo siguran način. Dakle, gdje se ovaj nas napuste? Pa, ispada da se ispod haube u CS50 knjižnici, upućuje se koristiti tijekom. I mi zapravo ćete početi guliti natrag sloj koji ne zadugo. No, ispostavilo previše, izraz koji Neki od vas mogli biti upoznati s, osobito onih ugodnije, je zapravo onaj vrlo popularan web stranice, ili stog preljeva, ovih dana. No, to je zapravo vrlo tehničkih značenje. Mi sada znamo što je stog. To je kao hrpu ladica unutar jednog blagovaonici. Ili unutar vašeg računala Njegova memorija one okvire koji se koristi funkcija. Pa, ispostavilo se da je zbog toga vrlo jednostavna implementacija memorije i okviri na tzv stog, zapravo možete preuzeti kontrolu od računalnog sustava prilično jednostavno. Možete upasti u sustav ako su ljudi kao što nas nisu napisana naš kod osobito dobro. Ako ljudi poput nas koriste komade memorije ili korištenje polja - čak i češće - ali ponekad zaboravite da provjerite Granice naše polje kao možda moraju se ponekad i ponovljena smjer predaleko prošlosti kraja polja. U najboljem slučaju, vaš program Možda jednostavno srušiti. Segmentacija kriv, neka vrsta od neugodno. Nije lijepo, ali to nije nužno jako loša stvar. No, ako je vaš program je zapravo o stvarnom računalima korisnika, ako je to je trčanje na web stranici da je stvarni slučajni ljudi Na internetu su udaranje, ostavljajući ljudi izazivaju loše stvari na vašem koda općenito nije dobra stvar, jer to znači mogućnost da se kontrolu nad računalom. A to će izgledati malo zagonetan. Ali sam mislio da ću vas panika s ovaj posljednji primjer ovdje. Evo primjer koda. I tu je dobar Wikipedia članak koji šetnje kroz ovo podrobnije. Imam glavna na donjem raspisivanju Foo, prolazeći u argv od 1. A to je samo tako da možete pokrenuti program i proći proizvoljna ulaz. A onda Foo je proglašen do vrha kao prihvaćanje string, ili više Naime, char *. To onda izjavljuje niz znakova. Nazovite to tampon, općenitije, veličine 12. Dakle, 12 znakova može stati unutar te niz zove c. I onda koristi ovu novu funkciju, što je novo, ali nije teško razumijem, memorije primjerak. Ona kopira memoriju iz bara, koji je bio varijabla n prošlosti, bez obzira na korisnik upisao u argv 1 u c. Koliko bajta? String duljina traci. Dakle, drugim riječima, ako korisnik upiše u h-e-l-l-o enter, dužina niza Hello je pet. Dakle, pet od tih bajtova će dobiti kopirati u nizu pod nazivom c, koji je veličine 12. No, ono što korisnik upiše u mnogo dulje Riječ koja je 13 znakova ili 14 znakova ili 100 znakova ili više? Gdje će oni ići? Pa, da okvir, da je ladica u dining-dvorana stog, oni će ići tamo. I to samo ide za početak prepisati druge stvari koje je već Na taj dimnjak, prelijeva stog, da se tako izrazim. Dakle slikovito, mislim da je to na ovaj način. Ovo je samo šareni verzija Slika smo crtanja. Na dnu, recimo, je glavna. I na vrhu, što ste vidjeli danas je okvir, boji se sada, za Funkcija se zove foo. No, ono što je zanimljivo ovdje o Foo je da ovdje je okvir. Dakle, to je nacrtana kao meni učinio, ali u svijetlo plavoj boji. A sada ovo je mjesto gdje c nosač 0 prolazi. I ovo je mjesto gdje c nosač 11 će završiti. Drugim riječima, to se događa biti predstavljeni kao trga. No, ako samo držati plopping bajtova dolje - ili znakovi - oni će završiti se na mjestu 0 skroz gore do 11. jer je 0 indeksirane. No, gdje je 13. znakova će završiti? Gdje je 14.? Gdje je lik 50. će završiti? To će zadržati ide prema dolje. Jer iako smo izvučeni Slika s hrpom odrastanja, adrese, ispostavilo se, idite na mala adrese, male pokazivače, do velikih adrese. Pa to samo čuva ide gore i gore. Dakle, ako korisnik upiše u Pozdrav, to je super. Ne bug, nema problema, svatko je siguran. Ali, ako korisnik upiše u ono što ćemo nazovite optužni kôd, predstavljeni generički su, napad, napad, napad, napad, što se može dogoditi? I, ako se sve ulaz da je korisnički upisali u nije samo neka prijateljska ili uvredljivog niz znakova. To je zapravo niz znakova da ako ga sastaviti, to je zapravo broj. Možda je kod koji briše sve datoteka na tvrdom disku ili za slanje spama ili nešto slično. Obavijest da je ono što je ključno je da ako je loš momak dobio dovoljno sretan da prepisati crveni komad memorije - što nisam izvući na moju sliku, ali Wikipedia ovu sliku ovdje ima - njegova tzv povratna adresa. Kada se hrana vraća, kada se vraća, swapom kako se računalo zna ići na do ovdje dolje? Ili u tech segmentu gore navedenog, kako to znam da ide iz swapa code - 0-ih i jedan je da sastavite zamjenu - Povratak na početak? Postoji takozvani povratak adresa pohranjen u toj istoj stog okvira, na Isto kafanske ladicu. Dakle, ako negativac je dovoljno pametan da stavi napad kod, napad kod, napad broj, i dobiti dovoljno sretan - Često putem pokušaja i pogrešaka - na prepisati taj crveni povratnu adresu, s adresom i obavijest samom vrhu. Obavijest 0835C080. To je napisan prema natrag do vrha za Razlozi bismo možda ćete ponovo. To je taj broj. Dakle, ako negativac dobiva dovoljno sretan ili je dovoljno pametan da prepisati red strip memorije s adresom kod koji on ili ona ima neki način ubrizgava u vašem računalu, pogodi čiji broj će se vratiti čim Foo je učinio izvršavanju? Negativac je broj. Dakle, ovaj napad kod, AAA, opet, možda slanje spama, možda izbrisati sve datoteke na tvrdom disku. Ali to je ono što doista stack overflow je ili prelijevanja spremnika ili Buffer overflow napad. I to je nevjerojatno, nevjerojatno česta do danas s programa napisanih u C, C + +, pa čak i nekim drugim jezicima. Na toj strašnoj bilješku, mi ćemo završiti sa šalom. [Smijeh] Vidimo se u srijedu. Na sljedećem CS50 - Dakle, ja sam sve od danas, ali disk svjetiljke čekaj, nemasnog mlijeka, pola telefona Knjiga, sok od naranče da sam popio danas. USB kabel, ključ. [Glazba svira]