[Prehrávanie hudby] David J. Malan: Dobre. To je CS50. A to je začiatok týždňa 5. A ako ste si možno všimli, niektoré z materiálu je stále o niečo viac komplexné, trochu hustejšia. 

A je to veľmi jednoduché, a to najmä v prípade, ste boli vo zvyku na nejakú dobu, že sa snaží čmárať po väčšinu niečo, čo robíme, hovoríme v triede. Ale uvedomiť si, že nie je potrebné Ideálne pedagogický prístup k učeniu, tento druh materiálu, a materiály všeobecne. A tak sme radi, že oznamuje, že CS50 vlastné Gheng Gong začala pripravovať kánonický súbor poznámok do kurzu, nádeje , Ktorý je, že, jedna, táto slúži nielen ako referencie a zdroje pre preskúmanie materiálu a bude späť prostredníctvom materiálu, ktorý môže mať Utiekol ste na prvýkrát, ale tiež preto, že vaše hlavy môže byť viac hore ako dole, keď ho príde čas na prednášku, tak, že by ste mohli zapojiť viac zamyslene, ako na rozdiel od viacerých Scribble. 

Vďaka, že povedal, čo nájdete na Webové stránky sú tieto dokumenty ako tento. A oznámenia, v ľavom hornom rohu, tam je nielen obsah, ale aj časové kódy, ktoré okamžite skočíte na príslušnú časť vo video on-line. A čo Chang tu urobil je, v podstate, dokumentácia čo sa stalo v tomto Najmä prednáška. A mnoho z prednášok Už teraz online s týmto URL. A budeme pokračovať, aby ste mohli písať zvyšok z tých, do konca tohto týždňa, takže sa využiť tohto zdroja. 

Takže bez ďalších okolkov, sme začali lúpať späť vrstva, ktorá je string na nejakú dobu. A to, čo sme si povedali reťazec je vlastne minulý týždeň? Takže char hviezda. A char hviezda, no, čo sa to vlastne znamená? No, tentoraz, ak máme bolo volanie funkcie, ako getString a skladovanie tak zvané vratnej Hodnota getString v proměnná-- sa to volá s Typ string-- sme písali riadok kódu tam hore. A to je len, keď vidím, môj rukopis tu zväčšený to som si uvedomil, ako je to otrasné. 

Avšak predpokladajme, že, na pravej strane je, však, primerané zobrazenie toho, čo je sa deje toto všetko tentoraz s getString. getString, samozrejme, dostane reťazec. Ale čo to vlastne znamená? To znamená, že dostane kus pamäť od operačného systému volaním funkcie s názvom malloc. Ale o tom viac neskôr. A potom sa to vyplní že kus pamäte s písmenami užívateľ zadali, nasleduje, samozrejme, znak null, alebo spätné lomítko nula až na samom konci. 

Medzitým, na ľavej strane tohto príbehu, celú tú dobu, sme boli deklarovanie premenné, ako s. A že premenná je to, čo teraz začne volať ukazovateľ. Nie je to krabica vnútri, ktoré dáme reťazec, Daven, samo o sebe, ale dáme v tomto námestí poľa na ľavej strane, čo presne? Jo? 

Divákov: Adresa kde je umiestnený v pamäti. 

David J. Malan: Presne tak. Adresa, kde Daven sa nachádza v pamäti. A nie je tam, kde sa nachádzajú všetky Daven samy o sebe, ale konkrétne adresa z čoho? Jo? 

Divákov: Prvý znak. 

David J. Malan: Prvý znak v Daven, ktorá v tomto prípade, Navrhol som bol svojvoľne a nerealisticky 1 OX1, čo práve znamená, že hexadecimálne číslo jedna. Ale to asi bude byť oveľa väčší počet že by sme mohli čerpať s 0x ako predpona, predstavuje hexadecimálny znak. A pretože nepotrebujeme vedieť, kde Zvyšok postáv Daven sú, pretože to, čo jednoduchý dizajn rozhodnutia, ktorá bola vyrobená pred mnohými rokmi? Jo? 

Divákov: Spätné lomítko 0. David J. Malan: Áno, presne tak. Spätné lomítko 0 umožňuje, aj keď v lineárny čas, prechádzať reťazec, chôdze od ľava do prava, sa pre slučky, alebo na chvíľu slučky, alebo niečo také že, a určiť, oh, tu je koniec tohto konkrétneho reťazca. A tak sa len adresu, na začiatok reťazca, môžeme pristupovať celistvosť za to, pretože celú tú dobu, reťazec bol len znak hviezda. 

Takže je to určite v poriadku aj naďalej používať CS50 knižnice, a to abstrakcia, aby som tak povedal, ale budeme začína presne vidieť, čo sa deje pod celú túto dobu. Takže si možno spomenú tento príklad, Tiež od minule, porovnať 0, ktorá ani vlastne nie je porovnanie. Ale začali sme to vyriešiť. 

Ale ako asi opakovacie, Mohol by som zaujímať niekoho v ružovej slon dnes, tiež by Chang? Ako sa o vás vo fronte? [Nepočuteľné]. Poď hore. 

A do tej doby, ako ste prišli, poďme do úvahy len na okamih, čo Tento kód bol vlastne robí. Je to deklarovať dve premenné sa top, s a t, a volanie getString. To nie je veľmi užívateľsky príjemný program, pretože nehovorí, čo mám robiť. Ale poďme len predpokladať, že sme so zameraním na šťavnaté časti. A potom budeme robiť, ak je s rovná rovná t, mal by povedať printf, ste zadali to isté. Dobrý deň. Ako sa voláte? 

Janelle: Janelle. David J. Malan: Janelle, Rád vás spoznávam. Takže vašu výzvu na ruku pre slona je najprv nakresliť nám obraz toho, čo je zastúpený v tých prvých dvoch linky. Takže s a t môže byť zastúpené ako na obrazovke? A môžete len kresliť s prst na tejto veľkej obrazovke. 

Takže tam sú dve polovice na každá strana tejto rovnice. Takže tam je to s na ľavej strane, a potom getString na pravej strane. A potom je tu t na ľavej strane, a potom getString na pravej strane. Tak ako môžeme začať kreslenie obrázok, ktorý predstavuje to, čo sa deje tu v pamäti, povedali by ste? A dovoľte mi, aby som vám vysvetlil to, čo robíte, ako to je. 

Janelle: OK. No, v prvom, to by sa pýtať, môžete získať vstupný reťazec. A to by store-- oh, prepáčte. David J. Malan: OK. Dobre. A to sa hovorí, čo? Oh, OK. Len tak ďalej. Nechcela som rušiť. Janelle: Ospravedlňujem sa. Tak to by vstup do adresa of-- nie je istý. Nemôžem presne spomenúť na číslo, ale verím, že sa začína s 0. 

David J. Malan: To je v poriadku, pretože som čísla hore, takže nie je správna odpoveď. 

Janelle: Počnúc 0 oblúku. 

David J. Malan: OK, tak prvok 0. Iste. 

Janelle: A potom, ak bol ako len dva-letter-- 

David J. Malan: OK, späť k vám. 

Janelle: Takže prvok 0, a potom prvok 1 alebo 2 prvkom. David J. Malan: A ktorý kus obrázok sa vám práve teraz kreslenie? Výzva na getString? Alebo vyhlásenia s? 

Janelle: Vyhlásenie o zhode S, verím. Oh, getString, pretože by to byť vložené do každého [? oblasť. ?] 

David J. Malan: Dobrý. Presne tak. Aj keď sa toto účinne vracia pole, odvolanie, Až sa vrátime reťazec, môžeme index do tohto reťazca s použitím 01 a 2. Technicky sa jedná o pravdepodobne zastúpené jednotlivé adresy, ale to je v poriadku. 

Takže predpokladám, či môžem len rýchlo odovzdať tam, kde sme skončili Naposledy, ak jeden z reťazca bola g b e, spätné lomítko 0, čo predstavuje Gabe je vstup, ako môžeme predstavovať to teraz? Ak je to pamäť, ktorá je bola vrátená getString? 

Janelle: Bolo by to zastúpená oblúkom? 

David J. Malan: oblúkom? No, no. Povedzme, obrazovo, dovoľte mi, aby som jednoducho ísť dopredu a navrhujú, že, ak je to s, toto je vrátená hodnota getString. A vy ste vyvodiť to ako 0, 1, 2, čo je úplne rozumné, pretože sme môže index do reťazca, ako také. Ale len preto, aby bol v súlade s naposledy, nechaj ma ísť napred a ľubovoľne navrhnúť, aby tento je adresa 1, je to adresa 2, Táto adresa je 3, a tak ďalej. A tak jednoducho byť super jasné, čo sa deje ísť s následkom, že Prvý riadok kódu, by to povedal? 

Janelle: Adresa 1? 

David J. Malan: Presne tak. Takže riešenie 0x1. A medzitým, nechajte ma ísť napred a duplikovať veľa z toho, čo ste urobili a pridajte sem svoj vlastný tričko. Ak by som mal písať v Gabe opäť, druhýkrát, Po zobrazení výzvy s getString, kde Samozrejme, je Gabe ísť? No, presumably-- 

Janelle: Rovnako ako tu? David J. Malan: Jo. Janelle: Alebo je to tiež v rovnakých boxoch? David J. Malan: Dovoľte mi navrhnúť, jo, presne, takže v týchto ďalších zariadení. Ale to, čo je teraz Kľúčom k úspechu je, že aj keď som vyvodiť to veľmi blízko dohromady-- 0x1, toto je 0x2-- v skutočnosti, teraz by mohla byť adresa 0x10, Napríklad, a 0x11, 0x12 a, a tak ďalej. A tak, ak je to ten prípad, čo sa deje, že skončí tu v t? 

Janelle: 0x10? David J. Malan: Presne tak. Takže 0x10. A tak teraz, posledná otázka. Ste zďaleka, musel pracovať Najťažšie pre slona tak ďaleko. Do teraz, keď som vytiahnuť kód znova, keď som si v súlade tri, ak je rovná rovná t, čo som vlastne porovnaním, že sme tu vyvodiť? 

Janelle: dve adresy? David J. Malan: Presne tak. Takže hovorím, je S equal na t? Inými slovami, je rovný 1 rovná 10? A samozrejme, Zrejmá odpoveď je teraz nie. A tak tento program je v konečnom dôsledku do tlače čo by ste povedali? 

Janelle: Bolo by to, ste zadali rovnakú vec? 

David J. Malan: Takže ak s je 1 a t je 10? 

Janelle: Zadali ste rôzne veci. 

David J. Malan: Presne tak. Zadali ste rôzne veci. V poriadku. Takže potlesk, keby sme mohli, tu. [APPLAUSE] Bolo to bolestivé. Ja viem. Dobrá práca. Tak teraz uvidíme, či nemôžeme odhaliť, čo oprava bola. A samozrejme, keď sme pevne tohle-- čo budem teraz predstavujú v green-- sme urobili zopár vylepšení tu. Po prvé, rovnako ako rozumu skontrolovať, ja som prvú kontrolu ak je rovný null, a t je rovné null. A len aby bolo jasno, kedy by mohlo s alebo t mať hodnotu null v kóde, ako je toto? Keď môže s alebo t byť null. Jo? 

Divákov: [nepočuteľné]. 

David J. Malan: Presne tak. V prípade, že reťazec, ktorý užívateľ zadali, je príliš dlhý , Aby sa zmestili do pamäte, alebo nejaký divný roh prípad ako to, getString, ako uvidíme, doslova dnes, v jeho dokumentácii, hovorí, že sa vráti null as špeciálny sentinel hodnota, alebo tak nejako zvláštne symbol to znamená, že sa niečo pokazilo. Takže chceme skontrolovať , Pretože to dopadá že null je veľmi nebezpečné hodnoty. 

Často, keď sa pokúsite urobiť niečo s null zahŕňajúce function-- odovzdaním ako vstup pre instance-- túto funkciu môže sa veľmi zrúti a s ním zložiť celý program. Takže to tretí riadok je teraz len zdravý rozum kontrola, kontrola chýb, ak chcete. To je dobrý zvyk teraz aby sme sa do akejkoľvek dobe, kedy sme skúste použiť hodnotu, ktorá mohol potenciálne byť null. 

Teraz, vo štvrtom riadku tu, "Ak strcmp (s, t)," dobre, čo je to s odkazom na? Tak sme si povedali, je to veľmi stručne pomenovaný funkcie na porovnávanie reťazcov. A jeho cieľom v živote je porovnať jeho prvý argument proti druhej, ale nie, ak ide o ich adresy, ako sme to urobili neúmyselne moment pred s červeným kódom, ale skôr porovnávať tie dva reťazca v ľudsky intuitívne spôsob porovnaním tohto, proti tomu, proti tomu, proti tomu, a potom sa zastaví, ak a keď alebo oba prsty narazí na spätné lomítko 0. Takže niekto pred rokmi zavedený strcmp realizovať pre nás funkčnosť že sme dúfali, by sme sa dostali len o porovnanie dvoch jednoduchých hodnôt. 

Teraz úprimne povedané, stále výkres všetkých týchto rôznych čísel. Ale realita je, že som bol takže tie sa po celú dobu. A tak mi dovoľte pokračovať a čmárať na toto aby bod, ktorý na konci dňa a v pohybe vpred, nie sme naozaj bude starať o čo sa týka veci sú v skutočnosti v pamäti. Takže nebudem kresliť týchto druh čísel tak už, Som len Abstrakt preč trochu viac priateľský len s šípkami. 

Inými slovami, ak je to je ukazovateľ, No, povedzme, nakresliť, a to doslova, ako ukazovateľ, šípka smerujúca sám od seba k niečomu inému, a nestarať sa príliš o viac markant z týchto adries ktorý opäť urobil som si tak ako tak. Ale uvidíme tieto adresy, Niekedy, pri ladení kódu. 

Teraz medzitým, tento program tu rieši, samozrejme, tento problém tým, že porovná tieto dva reťazce. Ale my sme sa dostali do ďalšieho problému. To bolo z kópie naprogramovať minule, pričom som sa snažil zarobiť len prvý znak v reťazci. Ale čo bolo symptóm sme videli poslednej dobe, kedy sa používateľ zadal hodnotu, ako Gabe malými písmenami, pre s, potom sme priradili s do t ako v treťom riadku tam, a potom som sa snažil zarábať t držiak 0? Aký bol vplyv meniace sa t držiak 0 tu? 

Divákov: Zmenila ov. 

David J. Malan: Áno, Zmenil som s, rovnako. Vzhľadom k tomu, čo sa naozaj deje? No, dovoľte mi, aby som zistil, či môžem vyčistiť do obrázka, a to takto. 

Ak je to je, opäť, slovo g, a, b, e, spätné lomítko, 0 a S budeme pokračovať v kreslení ako krabica tu, ale žiadne ďalšie adresy. Poďme prestať robiť veci. Povedzme, nakresliť obrázok zjednodušiť svet. 

Keď Prehlasujem t s reťazcom t, , Ktorý vytvára ten kus pamäti. Námestie sa stane, že 32 bitov vo väčšine počítačov. V skutočnosti, ak ste niekedy počuli o počítač s 32-bitovou architektúru, naozaj si predstaviť, hovoriť, že práve znamená, že používa 32-bitové adresy. A ako technický stranou, ak ste niekedy nad tým, prečo staršie počítače, ak ste skutočne snažil polievka je s množstvom pamäte RAM, môže mať len maximálne štyri gigabajty pamäte RAM, dobre, že je to preto, že doslova, váš starý počítač mohol len sa počítajú ako vysoké ako 4 miliardy, 4 miliardy bajtov, Pretože to bolo za použitia 32-bit čísla adresy. 

Ale v každom prípade, v tomto príklad, príbeh je oveľa jednoduchšie. t je len ďalší ukazovateľ, alebo Naozaj char hviezda, aka reťazec. A ako to chcem aktualizovať tento obrázok Teraz sa, že druhý riadok kódu, po bodka, bodka, bodka? Keď som si string t sa rovná y bodkočiarka, Ako sa zmení tento obrázok? Jo? 

Divákov: [nepočuteľné]. 

David J. Malan: Jo. Presne tak. Len som dal šípku od t box na rovnakú adresu, rovnaké prvé písmeno dal. Alebo technicky, ak toto chlap bol ešte na 0x1, je to, ako by som mal 0x1 tu a 0x1 tu. Ale opäť, koho to zaujíma o adresách? Je to len myšlienka, že teraz nie je podstatné. Tak toto je to, čo sa tu deje. Tak samozrejme, ak nechcete t konzoly 0, čo je pole notácie, z course-- a úprimne povedané, vyzerá to ako by pole tu, ale teraz je to divná vec. Vedzte, že programovací jazyk, C, ponúka túto funkciu, pričom, aj keď t je ukazovateľ, alebo s je ukazovateľ, môžete aj naďalej používať, že pozná, komfortné hranatá zátvorka notácie ísť na prvý prvok, alebo druhý prvok, alebo akýkoľvek prvok že ukazovateľ ukazuje na, pretože podľa všetkého to je, ako v tomto prípade, ukázal na nejaké pole. 

Tak ako tento problém vyriešiť? Úprimne povedané, to je miesto, kde sa dostal na prvý pohľad trochu ohromujúci. Ale tu je nová a vylepšená verzia. 

Takže najprv, ja idem zbaviť knižnici CS50, len odhaliť, že to je naozaj char hviezda, len synonymom. A T je tiež znak hviezda. Ale to, čo sa deje na pravá strana od tejto línie kde t je priradená hodnota? 

Čo je malloc? Čo je to strlen? Čo je sizeof (char)? Prečo to sakra robí toto linka vyzerať tak zložité? Čo to robí na vysokej úrovni? Čo je to ukladanie do t? Jo? Divákov: Je to rozdelenie určité množstvo pamäte. Je to uložiť, myslím, Písmená [nepočuteľné]. 

David J. Malan: Perfect. Perfect. Je to rozdelenie určitej Množstvo pamäte ukladať, pravdepodobne, budúce listy. A najmä, malloc Preto sa vracia to, čo? 

Divákov: Vrátenie [nepočuteľné]? David J. Malan: Presne tak. Vraciate adresu tejto pamäti, čo je ozdobný spôsob, ako hovoriť, vráti adresu Prvý byte tejto pamäte. Je povinnosťou si budem pamätať, koľko pamäte som vlastne pridelené, alebo požiadal o malloc. 

Teraz, ako moc je to? No, aj keď tam je veľa zátvoriek tu, malloc trvá len jeden argument. A ja s uvedením strlen S, tak aby ma toľko bytov, koľko je v s, ale pridať. Prečo? Jo? 

Divákov: spätné lomítko 0. David J. Malan: Presne tak. Musíme urobiť malý upratovanie. Tak preto, že tam je spätné lomítko 0, mali by sme si uvedomiť, že. V opačnom prípade budeme vytvoriť reťazec, ktorý nemá zvláštne, že terminátor. 

Medzitým, len byť super anál, mám sizeof (char), len v prípade, že niekto beží My kód nie je na CS50 spotrebiče ale možno iný počítač celkom, kde znakov je jeden bajt, konvencií, ale dva bajtov, alebo niečo väčšieho, než je. Je to jednoducho byť super, Super averziu k chybám. Aj keď v skutočnosti je to s najväčšou pravdepodobnosťou bude 1. 

Teraz, medzitým som sa do toho pustite a kopírovanie string, t držiak i sa rovná t držiak s. A ja sa odloží na minulý týždeň zdrojový kód, aby videli, čo sa deje. Ale kľúč stánok s jedlom, a Dôvod, prečo som dal kód teraz v zelenej, Je tomu tak preto, že posledný riadok, t držiak 0 rovná toupper, má za následok Zarábať ktorý reťazec? T a / alebo S? Ten posledný riadok kódu. 

Len t, pretože to, čo je sa stalo tentoraz, keď som trochu späť, že posledný krok, čo sa stalo, je, keď som volať malloc, Ja v podstate sa kus pamäti ktorý má rovnakú veľkosť ako originál, pretože to je aritmetický som urobil. Som ukladanie do t na adresu z tohto bloku pamäte. Aj keď to vyzerá pekne a pekný, pekný a čistý, Realita je, že je to, čo budeme udržať volá, hodnoty odpadky tu. To je kus pamäte by mohol veľmi a boli použité skôr, niekoľko sekúnd, pred pár minútami. Takže by mohlo byť úplne čísla alebo písmená, jednoducho náhodou. Ale to nie je platný, kým som sám naplniť tento kus pamäte sa skutočnými znakmi, ako ja to, že pre sláčiky. V poriadku? 

Takže teraz, vyvrcholenie Tieto tri príklady , Ktoré boli zdanlivo rozdelené minule, tento Swap príklad, táto funkcia pracoval v tom zmysle, že vymenil a a b. Ale nefungovalo to, v akom inom zmysle? Jo? 

Divákov: [nepočuteľné]. 

David J. Malan: Presne tak. Ak by som mal túto funkciu volať z another-- napríklad, z funkcie, ako je hlavné, kde Mám premenné, X a Y, ako som urobil minulý týždeň, rovnaký kód, a prejdem X a Y Presunúť, a potom volať Swap-- to, Samozrejme, je správna verzia je to, čo sa chystáme see-- to nefungovalo. Takže to, čo je oprava? 

No, tak len preto, aby sa jasné, nechaj ma ísť napred a-- daj mi jedna sekunda sem, a pozri či môžem vám ukázať ten posledný, ktorý bude v-- uvidíme, či sa mi podarí nájsť to skutočné fast-- OK [nepočuteľné]. OK, tu to je. Takže ignorovať príkazy som len písať. Chcem, aby to získať na last minute príklad z minulého obdobia, ktoré je teraz nazývaný žiadny Swap. 

Takže žiadne Swap je miesto, kde sme skončili minule, kedy som inicializovaný x a y na 1 až 2. Potom hovorím Swap, prechádzajúcej v bodoch 1 a 2. A potom sa táto funkcia pracoval v nejakom zmysle, ale nemal trvalé vplyv na x a y. Takže otázka po ruke je, ako teraz sa vlastne tento problém vyriešiť? Aké je riešenie na dosah ruky? 

No, v swap.c, ktorý je nový dnes, Všimnite si, pár rozdielov. X a Y sú rovnaké. Ale to, čo je jasne inak o linke 25? Čo je nové tam, ak si spomeniete, ako to vyzeralo pred druhým? 

Divákov: [nepočuteľné]. 

David J. Malan: Jo. Takže ampersand sú nový kus syntaxe a to nielen v tomto programe, ale aj všeobecnejšie v CS50. K dnešnému dňu, nemyslím si, že Videli sme nejaké príklady alebo naozaj hovoril o nich v každom detail, iné ako, možno, preventívne v časti, ampersand takhle. No, to dopadá ampersand je jedným z posledných kusov novú syntaxou budeme sa učiť. Všetko, čo to znamená, že je Adresa nejaké premenné. Na akú adresu sa x žiť? Ale to, čo sa adresa y žiť? Vzhľadom k tomu, v prípade, že Zásadným problémom, ako bolo to, že x a y boli odovzdané v kópii, na to, čo naozaj chcú robiť je poskytnúť Swap sa ako poklad mapa, ktorá vedie k kde X a Y vlastne sú v pamäti RAM, takže Swap môže nasledovať tú mapu a ísť tam, kam x alebo y označuje miesto a zmeniť skutočné hodnoty 1 a 2, tam. 

Takže Swap potrebuje tiež trochu zmeniť. A na prvý pohľad by to mohlo Vyzeráš trochu podobný char hviezdy. A naozaj je to tak. Takže je ukazovateľ na aký typ dát, na základe tohto zvýraznené časti? Takže je to int. 

Takže už nie je int, je to adresa int. A podobne, b je teraz deje byť adresa int. Takže keď som teraz voláme Swap z hlavnej, Nebudem dávať Swap 1 a 2. Chystám sa dať to ako Ox-niečo a Ox-niečo, dve adresy, ktoré povedú Swap ich skutočné umiestnenie v pamäti svojho počítača. 

Takže teraz, môj zostávajúce realizácia musí zmeniť tad. Čo je to teraz samozrejme iná v týchto troch riadkov kódu? Je tu tie zatratenie všetky hviezdy na mieste, všetko v poriadku? Tak čo sa to tu deje? Jo? 

Divákov: Je to samozrejme [nepočuteľné]. 

David J. Malan: Presne tak. Takže v tomto context--, a to nebolo rozhodnutie o najlepší dizajn, pravda, pred rokmi. V tejto súvislosti, kedy stačí mať hviezdu, a nemáte dátový typ, ako int, ihneď doľava, namiesto toho máte znamienko rovnosti, jasne, v tejto súvislosti, keď hovoríte, hviezda, to znamená, že ísť do adresa, ktorá je v. Sledujte mapu pokladu, aby som tak povedal. 

A medzitým, v súlade 37, znamená to, že to isté. Prejdite na adresu A, a dal to, čo tam je? Či už je miesto, ktoré b určuje. Inými slovami, prejdite na B. Získať túto hodnotu. Choď na a na rovnej podpísať, operátor priradenia, tam dal túto hodnotu. 

Podobne, int temp je len int. Nič sa musí zmeniť na tepl. Je to len náhradné sklo z Annenberg pre trochu mlieka alebo pomarančového džúsu. Ale ja si treba hovoriť, prejdite na b. Prejdite do tohto miesta určenia a dal hodnotu v teplote tam. Takže to, čo sa deje potom? Keď som sa vlastne hovoriť Swap tentoraz, ak je tento prvý zásobník tu predstavuje Main, Tento druhý zásobník predstavuje Swap, kedy Prejdem Ampersand x a y ampersand od hlavného Presunúť, len aby bolo jasno, Čo je to za stack frame príjem? Jo? 

Divákov: [nepočuteľné]. David J. Malan: Presne tak. Adresy x a y adresa. A na čo si spomeniete z nich ako poštové adresy. 33 Oxford Street a 35 Oxford Street, a chcete presunúť dve budovy ktoré sú na týchto miestach. 

Je to trochu smiešne myšlienky, ale to je všetko, máme na mysli adresu. Kde na svete môže nájsť tie dva ints? Kde na svete môžeš nájsť tie dve budovy? Takže keď konečne po všetkých tých rokoch, keď som ísť do dnešnej zdrojového kódu a zostaviť Swap a beh ./swap konečne pre Prvýkrát môžeme skutočne vidieť, že moje hodnoty sú naozaj bola úspešne zamenené. A teraz, môžeme dokonca vziať Na toto, povedzme, gdb. 

Tak nechaj ma ísť do rovnakého súboru. Nechaj ma ísť napred a spustiť gdb z ./swap. A teraz, v Swap, ja idem dopredu a nastaviť bod zlomu v Mohanom. A teraz idem dopredu a spustite program. A teraz vidíme, môj kód Zastavil sa u tejto línie. 

Ak by som do toho pustite a tlač x, čo by som mal vidieť tu? To je otázka. Čože? 

Divákov: [nepočuteľné]. 

David J. Malan: Tak náhodné čísla, možno. Možno som šťastie, a to je pekný a jednoduchý, ako je 0. Ale možno, že je to nejaké náhodné číslo. V tomto prípade som mal šťastie. Proste sa to stane, že je 0. Ale je to naozaj šťastie, pretože nie, kým som zadajte nasledujúci a potom vytlačiť x má, že riadok kódu, linka 19, bol popravený. 

Medzitým, ďalší zase, keď píšete, a dnes vytlačiť y, budem vidieť 2. Teraz, keď píšem ďalej, bude to trochu mätúce, pretože teraz, printf bude zobrazovať na obrazovky, ako to dopadlo. x je 1. 

Poďme to urobiť znova. A teraz, tu je miesto, kde veci zaujímavé. Než som sa zavolať Swap, alebo dokonca krok do toho, poďme sa trochu pozrieť. x je, opäť, 1. Y je, samozrejme, rýchle rozum skontrolujte, 2, takže nie je ťažké tam. Ale čo je ampersand x? Odpoveď, je to trochu funky vyzerajúci. Ale int hviezda v zátvorke je len GDP spôsob, ako povedať toto je adresa. Nie je to int, je to ukazovateľ na int, alebo inak známy ako adresu. 

Čo je to šialená vec? Nikdy sme nevideli niečo celkom rád, že pred. Tak toto je adresa môjho počítača pamäť, kde x sa stane žiť. Je to Ox-niečo. A to je, úprimne povedané, prečo Ja som začal kresliť šípky, miesto čísel, pretože kto naozaj zaujíma že int je najmä adresa, ktorá je tak veľký. Ale bffff0c4, to všetko sú naozaj hexadecimálnych číslic, ktoré sú 0 až f. 

Takže my nebudeme zaoberať príliš dlho na to, čo tie veci sú. Ale keď som sa vytlačiť y, Samozrejme, vidím dva. Ale ampersand y, vidím túto adresu. A upozornenie pre zvedavý, ako ďaleko od seba, sú x a y? Môžete ignorovať väčšinu adresu. Štyri byty. A to je v súlade s našimi skôr, tvrdí, že, ako veľký je int? Štyri byty. Takže to vyzerá, že všetko, čo je zoraďovať dobre, ako by sa mohlo dúfať v pamäti. 

Takže teraz, povedzme, rýchly posun vpred na konci tohto príbehu. Poďme ďalej a typ kroku, ponoriť sa do funkcie Swap. A teraz nevšimol, keď som typ, je to zhodná s adresou x. Keby som typ B, je to rovnaké na adresu y. Takže to, čo by som mal vidieť, keď hovoria, prejdite na adresu a? Takže vytlačiť hviezdy. Takže hviezdička znamená, tam, v tomto kontexte. Ampersand znamená, že to, čo je adresa. Takže hrať prostriedky 1. A tlač hviezda b mi dáva 2. 

A dovoľte mi, aby som prevziať, pre túto chvíľu, že aspoň kód, ktorý pokračuje sa teraz môže spustiť odôvodnené prostredníctvom týmto spôsobom. Ale budeme znovu túto myšlienku onedlho. Takže táto verzia Swap Teraz je správny a umožňuje nám vymeniť tento konkrétny typ dát. 

Takže nejaké otázky a potom na swap? Na hviezdy? Na adresu? A uvidíte, s problém nastaviť 4, tak nejako, ale problém nastaviť 5, určite, ako tieto veci sú užitočné a získať oveľa viac pohodlné s nimi, ako výsledok. Vôbec niečo? V poriadku. Tak malloc je, opäť, táto funkcia že práve prideľuje pamäť, pamäť alokácie. A prečo je to užitočné? No, tentoraz, ste používali malloc. Ak si myslíte, hneď ako getString práce, pravdepodobne, je to bolo pýtať sa niekoho na kus pamäti, kedykoľvek užívateľ zadá reťazec in, pretože sme rozhodne Nevedel, ako zamestnanci CS50, aké veľké tie reťazce, ktoré ľudia budú typu môže byť. 

Tak poďme, prvýkrát, začnite Zlúpnite Ako sa CS50 knižnica práce, prostredníctvom niekoľkých príkladov ktorá nás povedie tam. Takže keď som otvoriť gedit a otvoriť scanf 0, budeme vidieť nasledujúci kód. Scanf 0, k dispozícii na internetových stránkach dnes, má pomerne málo riadkov kódu tú, 14 až 20. A pozrime sa, čo to robí. Prehlasuje, int, s názvom x. To hovorí, že niečo ako, číslo, prosím. A teraz hovorí, scanf% i, & x. Takže tam je veľa nových vecí tam. 

Ale scanf, môžete trochu myslieť ako opak printf. printf, samozrejme, vytlačí na obrazovku. scanf druh skenov od užívateľa klávesnice niečo, čo on alebo ona napísal. 

% Aj je, rovnako ako printf. To znamená, že očakávame, že užívateľ typu int. A teraz, prečo si myslíš, že som by mohlo byť okolo scanf & X? V prípade, že zmyslom života scanf je dostať niečo od užívateľa, aký je význam priechodom, a x, teraz? Jo? 

Divákov: [nepočuteľné]. David J. Malan: Presne tak. Nech som, človek, zadajte, môj vstup sa bude uložený na tomto mieste. Nestačí, spomínam, len odovzdať x, pretože sme videli už, kedykoľvek postúpiť len surové premenné, ako int, na nejakú inú funkciu, Iste, môže to zmeniť variabilný, ale nie natrvalo. To nemôže mať vplyv na hlavnej. Je možné zmeniť len svoju vlastnú lokálnu kópiu. Ale ak miesto, nemusíte daj mi aktuálne int, ale môžete mi ukázať cestu k že int, teraz, že scanf, Iste, môžem z toho, že osloviť a dať tam číslo takže máte prístup k nemu rovnako. 

Takže keď som spustiť tento program, uvidíme. Uistite sa scanf 0 dot slash, scanf 0. A keď som teraz zadajte číslo ako 50, vďaka za 50. Ak teraz zadajte číslo ako negatívny 1, pre záporné 1. Teraz zadajte číslo ako 1,5, hm. Prečo sa môj program ma ignorovať? No, pretože jednoducho, povedal som to očakávať len int. V poriadku. Takže to je jedna verzia tohto. Poďme zobrať veci do zárezu a navrhnúť, že to nie je dobré. A tu sa skrýva veľmi jednoduchý príklad o tom, ako môžeme začať písať kód že ostatní ľudia môžu využívať alebo ohroziť tým, že robí zlé veci. Tak línie 16, tak podobné v duchu, aby skôr, ale nie som vyhlásil, že v pravý tentoraz. Ja som, ktorým bolo char hviezdu, aka reťazca. 

Ale čo to vlastne znamená? Takže keď nezadáte address-- a Ja som ho volať ľubovoľne, buffer, ale nemohol som zavolať, že to, aby simple-- a potom som si to, vysvetlite mi, keby si mohol, na základe predchádzajúcej logika, čo sa scanf robí v riadku 18, ak priechod% s a vyrovnávacej pamäte, čo je adresa? Čo je scanf, ak platí presne rovnaká logika ako verzia 0, Pokúsim sa urobiť tu, keď používateľ zadá niečo? Jo? 

Divákov: [nepočuteľné]. 

David J. Malan: Presne tak. Scanf, tým skôr logika, bude mať reťazec že ľudské písané v-- je teraz reťazec, že to nie je číslo, pravdepodobne, ak on alebo ona cooperates-- a to bude sa snažiť, aby to reťazec v pamäti na ľubovoľnú adresu vyrovnávacej pamäte určuje. A to je skvelé, pretože vyrovnávacej pamäti je skutočne má byť adresa. 

Ale tvrdím, že tento program je buggy v veľmi závažným spôsobom, pretože to, čo hodnota je vyrovnávacej pamäte v predvolenom nastavení? Čo som inicializovaný do? Čo kus pamäti? Ja nie, že jo? 

Takže aj keď som pridelená char hviezda, ktorá sa už nenazýva s, je to miesto nazýva buffer-- tak Poďme nakresliť názov premennej teraz ako buffer-- či nemám volal getString alebo malloc tu že v praxi znamená, že buffer je len niektoré odpadky hodnota. 

Teraz čo to znamená? To znamená, že som povedal, scanf očakávať reťazec od užívateľa. A viete čo? Bez ohľadu na to, čo sa ukazuje na-- a kreslím otáznik, ale v skutočnosti, to bude niečo ako OX1, 2, 3, nie? Je to nejaký falošný hodnota, ktorá práve sa stane, že tam pred rokom. Takže inak povedané, je to ako by pufer je len ukazuje na niečo, čo v pamäti. Nemám poňatia, čo sa deje. 

Takže keď som zadať Gabe teraz, bude to pokúsiť sa dať g-a-b-E / 0 tam. Ale kto vie, čo to je? A v minulosti, akákoľvek Tentoraz sme sa snažili dotknúť pamäť, ktorá nepatrí nám, čo sa stalo? Alebo takmer zakaždým. Chyba segmentácie, nie? 

Táto šípka, nemám tušenie, kde to je polohovacie. je to len náhodná hodnota. A samozrejme, ak sa interpretovať náhodná hodnota ako adresa, sa chystáte ísť do nejaký náhodný cieľ. Takže Gabe by skutočne crash môj program v tomto prípade tu. 

Takže to, čo môžeme urobiť, je to skoro rovnako zlé? Zoberme do úvahy toto tretej a Posledným príkladom z scanf. Táto verzia je lepšia, v akom zmysle? Ak ste spokojní s predchádzajúci problém, to je lepšie. Prečo? 

Divákov: [nepočuteľné]. David J. Malan: Dobrý. Takže v tomto prípade linky 16 je lepšie, v tom zmysle, že sme explicitne vyčlenia pamäti. Nie sme pomocou malloc, sme použili týždeň 2 prístup len deklarovať poľa. A my sme povedal, že reťazec je len pole znakov, tak to je úplne legitímne. Ale to je, samozrejme, ako zistíte, pevnú veľkosť 16. 

Tak tento program je úplne bezpečné, keď som typ v jednej znakové reťazce, dvojmiestny Reťazca, 15 znakové reťazce. Ale akonáhle začnem písať 16, 17, 18, 1000 znakové reťazce, , Kde je tento reťazec skončí? Bude to skončiť čiastočne tu. Ale kto vie, čo ešte je za hranicami tohto konkrétneho poľa? 

Je to, ako keď som vyhlásený za 16 krabíc tu. Takže skôr než vytiahnuť všetky 16, budeme len predstierať, že som sa vyvodiť 16. Ale keď potom sa snažím čítať reťazec To je oveľa dlhšie, rovnako ako 50 znakov, Chystám sa začať dávať a, b, c, d, x, y, z. A to je pravdepodobne inej pamäte segmente že, opäť, môže spôsobiť môj program k havárii, pretože som nežiadal niečo viac ako len 16 bajtov. 

Takže koho to zaujíma? No, tu je knižnica CS50. A väčšina z toho je len ako návod tak hore. Knižnica CS50, celú tú dobu, má tento riadok v súlade 52. Videli sme typedef, alebo uvidíte typedef v pset 4, ktorá sa práve vytvára synonymum čím char hviezda môže byť viac jednoducho odvolával sa na ako reťazec. Takže to je jeden z Niekoľko koliesok sme použili tajne pod kapotou. 

Medzitým, tu je funkcia, getchar. Teraz sa zdá, nie je telo na to. A v skutočnosti, keď som držať rolovanie, nemám vlastne zobraziť všetky implementácie z týchto funkcií. Pre kontrolu sanity, prečo tomu tak je? 

Divákov: [nepočuteľné]. David J. Malan: Jo. Tak toto je hlavičkový súbor. A hlavičkové súbory obsahujú prototypy, plus nejaké ďalšie veci, zdá sa, ako typedefs. Ale v CS50.c, ktoré máme nikdy uvedený priamo, ale bola v CS50 spotrebiča všetkých Tentoraz, hlboko vnútri jeho zložiek, Všimnite si, že je celý banda funkcií tu. 

V skutočnosti, poďme prejdite nadol. Poďme ignorovať väčšinu z nich, pre túto chvíľu. Ale prejdite na vezmi_int a uvidíte, ako vezmi_int funguje. Takže tu je vezmi_int. A ak budete niekedy naozaj záležalo, ako dostať int funguje, tu je jeho dokumentácie. A medzi vecami sa hovorí, že je to vám povie, čo rozsahy hodnôt sa môže vrátiť. Je to v podstate negatívne 2000000000 k pozitívnemu 2000000000, dávať alebo brať. 

A ukázalo sa, to všetko čas, aj keď sme nikdy mal by ste skontrolovať na to, keď sa niečo pokazí, Ukazuje sa, že všetky Tentoraz vezmi_int má vracajú zvláštne konštantná, nie je null, ale skôr INT_MAX, ktorý je Dohovor len pár programátora. To znamená, že je tu špeciálna hodnota. Uistite sa, za to, len v prípade, že sa niečo pokazí. Ale my sme nikdy neobťažoval sa, že k dnešnému dňu, pretože znova, to je určený pre zjednodušenie. 

Ale ako sa dostať vezmi_int vykonávať? No, jeden trvá žiadne argumenty. Vieme, že. Vracia int. Vieme, že. Tak ako to funguje pod kapotou? 

Takže je zrejme nekonečný slučka, aspoň jedného vzhľad. Všimnite si, že sme pomocou getString. Tak to je zaujímavé. vezmi_int žiada, aby naše vlastné funkcie, getString. A teraz, prečo by to mohlo byť? Prečo som defenzívne tu v rade 165? Čo by sa mohlo stať v súlade 164, len aby bolo jasno? Je to rovnaká odpoveď ako predtým. Môže byť len z pamäte. Sa niečo pokazí s getString, musíme byť schopní zvládnuť. A dôvod, prečo som sa nevracia null že technicky, null je ukazovateľ. vezmi_int má vrátiť int. Tak som sa svojvoľne rozhodol, v podstate, že 2 miliardy, dávať alebo brať, bude byť osobitnú hodnotu, ktorá som nikdy nemôže skutočne dostať od užívateľa. Je to len jedna hodnota idem strácať reprezentovať chybový kód. 

Takže teraz, veci sa trochu fantázie. A nie je to úplne rovnaké funkcie ako predtým, ale je to veľmi podobné. Tak zistíte, Prehlasujem tu, v súlade 172, a to ako int n a char c. A potom som použiť tento funky linku, sscanf, čo sa ukázalo nekontroluje reťazec z klávesnice. Stojí existujúci reťazec, ktorý užívateľ už zadali. Tak som už volal getString, ktorý znamená, že mám reťazec v pamäti. sscanf je to, čo by ste Volanie funkcie rozobrať. Vyzerá to na povrázku som zadali, znak po znaku, a robí niečo užitočného. , Že reťazec je uložený v súlade. A viem, že len tým, že ide zálohovať tu a hovoria, oh, OK, Zavolal som jej to s Tentokrát, ale linka. 

A teraz je to trochu inak. Ale to v podstate znamená, z dôvodov budeme trochu mávať rukami na dnes, že sme kontrolu na zistiť, či používateľ zadal a int a možno iný charakter. V prípade, že užívateľ zadal int, je to bude uložený v n, pretože som Absolvovaní tohto adresou, Nový trik sme dnes videli. V prípade, že užívateľ tiež napísal v ako 123x, že x sa chystá skončiť písmeno v znaku c. 

Teraz sa ukazuje, že sscanf mi povedať, inteligentne, koľko premenných bola sscanf úspešne schopní vyplniť. Takže podľa tejto logiky, v prípade, že funkcia Ja vykonávanie je vezmi_int, ale ja som kontrolu, prípadne, pre užívateľov aby zadali do int nasleduje niečo iné, Čo chcem sscanf je Návratová hodnota skutočne byť? V prípade, že cieľom je získať len int od užívateľa? 

Takže ak sscanf priznanie 2, čo to znamená? Užívateľ zadal niečo ako, a to doslova, 123x, čo je jednoducho nezmysel. Je to chybový stav, a Chcem skontrolovať, že. 

Takže ak používateľ zadá to v tým, že táto logika, čo robí sscanf vrátiť, by ste povedali? Takže to bude vracať 2, pretože 123 sa ísť sem, a x je skončí tu. Ale ja nechcem x, aby sa naplnil. Chcem sscanf len uspieť v plnenie prvý z jeho premenných. A tak to je dôvod, prečo som chcete sscanf vrátiť jeden. 

A ak je to niečo málo cez hlavu pre túto chvíľu, že je to úplne v pohode. Uvedomte si však, že jeden z Hodnoty vezmi_int a getString je to, že robíme sakra Veľa chýb kontroly, ako tomu tak že k dnešnému dňu, môžete do značnej miery napíšte čokoľvek klávesnicu a my sa ho chytiť. A určite, personál, určite nie byť zdrojom chyby vo vašom programu, pretože sme defenzívne kontrola pre všetky hlúpe veci, ktoré by užívateľ mohol robiť, ako je písanie reťazec, kedy ste naozaj chceli int. Takže teď-- prídeme späť na predtým long-- ale po celú tú dobu, getString a vezmi_int majú Bol pod kapotou pomocou tejto Základnou myšlienkou adries pamäte. 

Takže teraz, poďme robiť veci trochu viac užívateľsky príjemný. Ako si možno spomínate, od Binkym posledný time-- ak bude moja myš cooperate-- tak sme mali tento kód, ktorý Úprimne povedané, je celkom nezmyselné. Tento kód dosahuje nič užitočné, ale to bol príklad že profesor Parlante použiť, aby sa predstavujú čo sa deje v program, ktorý zahŕňa pamäť. 

Takže poďme sa prerozprávať to Príbeh mimoriadne stručne. Tieto prvé dva riadky, v Anglicky, robiť to, čo by na to? Len rozumne človek, ale mierne technické termíny, sa bodnúť. Divákov: [nepočuteľné]. 

David J. Malan: OK, tie, ktorým sa stanovuje adresy pre váš X a premenné y. Nie úplne, pretože x a y nie sú premenné v tradičnom slova zmysle. x a y sú adresy alebo uloží adresu. Skúsme to ešte raz. To nie je zlý začiatok, hoci. Jo? 

Divákov: [nepočuteľné]. David J. Malan: Dobrý. Myslím, že je to trochu čistejšie. Deklarácia dva ukazovatele, dve celé čísla. A my sme im volať x a y. Alebo keď sme k tomu to ako obrázok, opäť, pripomenúť, proste, že všetky robíme s tým prvom riadku kreslí krabici ako je tento, s nejakou hodnotou odpadky v ňom, a volať to x, a potom ďalšie box takto, s niektorými odpadky hodnoty v tom, volať to y. Máme vyhlásil dva ukazovatele, ktoré nakoniec uloží adresu int. Takže to je všetko. 

Takže keď Binky to urobil, íl rovnako vyzeral takto. A Nick len tak zabalili šípky, ako by to neukazuje nikde najmä preto, že sú to len hodnoty na odpadky. Oni nie sú explicitne inicializovať kdekoľvek najmä. 

Teraz ďalší rad kód, odvolanie, bola táto. Takže rozumne užívateľsky príjemný, ale trochu technickú angličtinu, čo je to riadok kódu robíš? Jo? 

Divákov: [nepočuteľné]. 

David J. Malan: Perfect. Je to prideľovanie kus pamäti, že je to veľkosť int. A to je polovica odpovedí. Odpovedali ste právo polovica výrazu. To, čo sa deje na ľavá strana znamienko rovnosti? Jo? Divákov: a priradí že k premennej x? 

David J. Malan: a priradí že k premennej x. Takže rekapitulácia, pravá strana prideľuje dostatok pamäte pre uloženie int. Ale malloc špecificky vráti adresu tohto kusu pamäti, ktorú ste práve navrhla je uložená v x. 

Takže to, čo Nick minule Binkym je ťahal, že ukazovateľ sa, hlina, ukázať sa na bielu kus pamäti ktorá je rovná veľkosti int. A skutočne, to znamená, predstavujú štyri bajty. 

Teraz, ďalší riadok kódu to urobil, hviezda x dostane 42. Takže 42 je jednoduché na pravá strana, zmysel života. Ľavá strana, hviezda x znamená čo? To tiež môže mať gone-- to je v poriadku. OK. 

DIVÁKOV: V podstate, ísť na [nepočuteľné] David J. Malan: Dobrý. Divákov: [nepočuteľné]. David J. Malan: Presne tak. Ľavá strana znamená ísť do x. x je adresa. Je to ako 33 Oxford Street alebo OX1. A hviezda x znamená ísť na to osloviť a dať to, čo tam je? 42. 

Takže naozaj, to je presne to, čo Nick urobil. Začal s vedľajšou, v podstate, mentálne ukázal prstom na x, v smere šípky na bielom poli na pravej strane bočné, a uvedenie čísla 42 tam. Ale potom sa to začalo trochu nebezpečné, nie? Binky je prísť o hlavu. 

Hviezda y sa rovná 13, smolu, znamená čo? Takže hviezdy Y znamená ísť na adresu v y. Ale čo je adresa y? Dobre, je to hodnota odpadky, nie? Nakreslil som to ako otáznik. Nick vytiahol ho ako stočený šípku nahor. A akonáhle sa pokúsite do hviezdy Y, hovorí sa tam, ale nie je legitímna adresa, je to nejaký falošný umiestnenie, Program sa bude pád. A Binky hlava sa deje odletieť tu, ako to dopadlo. 

Takže nakoniec, tento program bol len naplno chyba. Bolo buggy programu. A je potrebné opraviť. A jediný spôsob, naozaj, to opraviť by, napríklad, tento riadok, ktoré sme nemali ani dostať, pretože program spadol príliš skoro. Ale ak by sme mali napraviť, čo vplyv má robiť y rovné x má? No, je to v podstate poukazuje na y bez ohľadu na hodnotu x ukazuje na. 

Takže Nick príbehu, alebo Binky príbeh, a to ako x a y sa ukázal na biely kus pamäti, tak, že nakoniec, keď ti sa hviezda y znovu sa rovná 13, môžete skončiť uvedenie 13 v vhodné umiestnenie. Takže všetky tieto linky sú dokonale legitímne, s výnimkou pre tento jeden, keď sa to stalo pred vami vlastne pridelený ý nejakú hodnotu. 

Teraz našťastie nemusíte musia zdôvodniť cez všetky z týchto druhov otázok, na vlastnú päsť. Nechaj ma ísť napred a otvoriť up okne terminálu tu a otvoriť, len na okamih, super krátky program, ktorý Tiež je trochu zbytočné. Je to škaredé. To nie je dosiahnuť niečo užitočného. Ale to ukazujú problémy pamäti, takže sa poďme pozrieť. 

Hlavné, super jednoduché. Je to zrejme volá funkciu, f, a potom sa vráti 0. Je to docela ťažké, aby neporiadok to. Takže hlavné je celkom dobrý, tak ďaleko. 

Takže f je problematické. A práve nedal moc úsilie na to pomenovanie tu, aby zameranie na kód. f má dva riadky. A poďme sa pozrieť, čo sa teraz deje. Tak na jednej strane tady-- a dovoľte mi, aby som to v súlade s predchádzajúcou example-- na jednej strane, ľavá strana je to, čo v angličtine? To je-- Divákov: Vytvorenie ukazovatele. David J. Malan: Vytvorenie ukazovatele int a volať to x. Takže to vytvára jednu z tých krabíc Stále kreslenie na dotykovej obrazovke. A teraz, na pravej strane bočné, malloc, samozrejme, prideľuje kus pamäti. A len aby bolo jasno, ako koľko pamäte je to zrejme prideľovanie, ak ste práve druh si to spočítajte tu? 

Tak to je 40 bajtov. A viem, že len preto, že viem, int, na CS50 spotrebiče, aspoň je štyri bajty. SO 10 krát 4 je 40. Takže to je ukladanie je x, adresa prvý z 40 ints že boli pridelené miesto späť, k sebe, k sebe, k sebe. 

A to je to, čo je kľúčom k malloc. Neznamená to však trvať trochu pamäti tu, trochu tu, trochu tu. To vám dáva jeden blok pamäte, súvisle, od operačného systém. 

A čo teraz, x držiak 10 = 0? Ľubovoľný riadok kódu. To nie je dosiahnuť niečo užitočného. Ale je zaujímavé, pretože x držiak 10--? Jo? 

Divákov: [nepočuteľné]? 

David J. Malan: x držiak 10 nemusí byť null. Detail null prichádza iba do hry s reťazcami, na konci reťazca. Ale dobrá myšlienka. 

Aká veľká je to pole, a to aj keď som pridelilo 40 bytov? Je to 0 až deväť, jo? Je to 10 ints celkom. 40 bajtov, ale 10 ints, indexované 0 až 0. 

Takže to, čo je to, že x držiak 10? Je to vlastne časť neznámy odpadky hodnota. Je to pamäť, ktorá nepatrí ku mne. Nemal by som byť dotýkať, že byte číslo 41, 42, 43, 44. Idem trochu príliš ďaleko. 

A skutočne, keď som spustiť tento programu, môže veľmi dobre dôjsť k chybe. Ale niekedy, budeme mať šťastie. A tak len preukázať tohle-- a úprimne povedané, nikdy neviete, pred vami sa to-- poďme bežať to. Nebolo vlastne havárii. 

Ale keď som sa to zmeniť, pre inštancie, byť ako 1000, aby sa to naozaj úmyselné, pozrime sa ak sa nám podarí to, aby pád tentoraz. OK, to sa nespadne. Ako sa o 100.000? Poďme prerobiť a teraz spustite ho. OK. Uf. V poriadku. Takže sa zdá, opäť sa jedná segmenty pamäti, aby som tak povedal, sú pomerne veľké, takže môžeme sa znovu a znovu šťastie. Ale nakoniec, akonáhle sa dostanete na smiech a naozaj ísť ďaleko na obrazovke, sa dotknete pamäti, že v skutočnosti, naozaj nepatrí k vám. 

Ale úprimne povedané, títo druhy chýb sa deje bude ťažšie a ťažšie zistiť, na vlastnú päsť. Ale našťastie, ako programátori, máme nástroje, ktoré nám umožňujú robiť to pre nás. Tak toto je snáď jedna z najškaredších programov, dokonca škaredšie, ako výstup gdb je. Ale vždy má linku alebo dva, ktoré sú super užitočné. 

Valgrind je program, ktorý pomáha nebude ladiť program, sám o sebe, ale nájsť pamäte súvisiace problémy, konkrétne. To bude automaticky spustiť kód si a pozrite sa aspoň na dve veci. Po prvé, si niečo náhodné, ako dotykové pamäte že nepatril k vám? To vám pomôže nájsť tie prípady. 

A za druhé, bude to pomôže nájdete niečo, čo nazýva úniky pamäte, ktoré máme úplne ignoroval, naivne, po určitú dobu a blažene. Ale ukazuje sa, všetko Tentoraz, kedykoľvek ste volali getString v tak veľa z našich programov, Pýtaš sa prevádzkové systém pre pamäť, ale máte nejakú spomienku sa niekedy, že mu späť, robí UNALLOC, alebo zadarmo, rovnako ako sa tomu hovorí. Nie, pretože sme nikdy spýtal sa vás k tomu. 

Ale to všetko čas, programy si písal v C boli unikajúci pamäti, žiada prevádzkové systém pre viac a viac pamäť pre sláčiky a ktovie čo ešte, ale nikdy podal ju späť. A teraz je to trochu o zjednodušujúce, ale ak ste niekedy spustiť váš Mac alebo váš počítač dlhšiu dobu, otvorenie veľa programov, Možno zatváranie programov, a hoci vaše počítač Nehavarované, je to stále tak oveľa pomalší, ako by ich to naozaj používať veľké množstvo pamäte alebo prostriedky, aj keď, ak nie ste ešte nedotýkajte klávesnice, , Ktoré by mohli bylo-- ale nie always-- mohol byť to, že programy, ktoré používate majú sami pretekanie pamäte. A udržať žiada OS viac a viac pamäte, ale zabúdajú na to, nie je v skutočnosti ju používať, ale teda s pamäťou preč z iných programov, ktoré by mohli chcieť. Tak to je obyčajné vysvetlenie. Tu je miesto, kde je Valgrind Výstup je úplne ukrutný k tým menej a pohodlnejšie podobne. Ale zaujímavé veci je práve tu. To mi hovorí, neplatný zápis o veľkosť štyri sa deje v tomto programe, najmä, na riadku 21 memory.c. 

Keď pôjdem na linku 21, hm, tam naozaj je neplatný zápis o veľkosti štyri. Prečo veľkosť štyri? No, to number-- a by mohlo byť anything-- je int. Takže je to štyri bajty. Takže dávam štyri bajty kde nepatrí. To je to, čo Valgrind Je mi vlastne hovorí. Okrem toho bude tiež povedz mi, ako uvidíme, ako spustiť to v budúcnosti pset, či a keď ste unikli pamäť, čo napokon Mám, pretože som volal malloc, ale ja som v skutočnosti volal, v tomto prípade zdarma, ktoré budeme nakoniec vidieť je opakom malloc. 

Takže teraz, myslím, že konečný príklad. Tak toto je trochu viac tajomný, ale je to snáď Najväčší dôvod byť opatrný s pamäťou, a dôvod, prečo sa mnoho programov a / alebo na webové servery, dokonca k tomuto dňu, sú prevzaté od zlých niekde na internete, ktorí sú nejakým spôsobom odosielanie falošné pakety na server sa snaží ohroziť svoje účty, alebo sa vaše dáta, alebo len všeobecne sa cez stroj. Pretečeniu vyrovnávacej pamäti, ako je názov napovedá, prostriedok pretekania nie int, ale vyrovnávacej pamäti. A vyrovnávacia pamäť je len ozdobný spôsob, ako hovoriť, že je to banda pamäti. 

A skutočne, som zavolal reťazec pred vyrovnávacej pamäte, namiesto s. Vzhľadom k tomu, či je to buffer, ako v tom zmysle, YouTube, alebo kedykoľvek sa pozeráte videá, ste mohli vidieť slovo vyrovnávacej pamäte, bodka, bodka, bodka. Je to neuveriteľne otravné. A to práve znamená, že že vaše video prehrávač sa snaží stiahnuť veľa bajtov, veľa bytov z videa z internetu. Ale je to pomalé, takže sa snažia k stiahnutiu veľa z nich vyplniť vyrovnávacej pamäti, nádobu, aby sa máte dostatok bytov, aby sa po ukázať video, bez pauzy neustále. Ale ako sa ukázalo, je to možné majú vyrovnávacia pamäť k tomuto veľký. Ale skúste dať toľko dát v to, a veľmi zlé veci sa môže stať. Tak napríklad, poďme sa pozrieť na Táto záverečná teaser na príklad. To je ďalší program to, že na prvý pohľad, nerobí nič extra užitočného. Je tu hlavnú funkciu ktorý volá túto funkciu, f. A že funkcia f, tu má char pole, s názvom C, veľkosť 12. A potom je pomocou tohto nová funkcia s názvom strncpy. 

Ukazuje sa, že sa tento jednoduchý, jednoduchý riadok kódu, len dva riadky, sme sa celý svoj program, , A preto sa celý môj počítač, a môj užívateľský účet, a môj pevný pohon potenciálne zraniteľný voči každému kto vie, a je dosť dobré pre spustenie Tento program s určitou príkazového riadka argumentom. Inými slovami, ak je to zlý človek kladie vnútri argvargv [1] zadaním na klávesnici veľmi špeciálne vytvorenom reťazec, nie je abc, 123, ale v podstate, binárne symboly, ktoré predstavujú spustiteľný kód, program, ktorý on alebo ona napísal, s týmto jednoduchým programom, ktorý je zástupca z tisícov programov ktoré sú rovnako zraniteľné, Trúfam si tvrdiť, on alebo ona môže nakoniec odstrániť všetky súbory na mojom pevnom disku, sa bliká výzvu, aby on alebo ona môže typ príkazov na vlastnú päsť, e-mailom všetky súbory pre seba. Čokoľvek, čo sa dá robiť, keď alebo si môže robiť s týmto kódom. 

Nebudeme úplne vyriešiť ešte. A v skutočnosti, že to bude zahŕňajú malý obrázok ako je toto, ktoré budeme čoskoro pochopiť, tým lepšie. Ale pre dnešok, poďme končí čo je, dúfajme, že o niečo viac pochopiteľné XKCD vtip, kým sme pokračovať nabudúce. V poriadku. Uvidíme sa v stredu. 

[Prehrávanie hudby] 

SPEAKER: A teraz, hlboko myšlienky, podľa Daven Farnham. Pamäť je ako skákanie do hromady zlaté listy na nedeľné popoludnie. Fúkania vetra, hodil svoj hair-- oh, Cnie sa mi dni when-- 

[SMIECH]