[Přehrávání hudby] David J. Malan: Dobře. To je CS50. A to je začátek týdne 5. A jak jste si možná všimli, některé z materiálu je stále o něco více komplexní, trochu hustší. 

A je to velmi snadné, a to zejména v případě, jste byli ve zvyku na nějakou dobu, že se snaží čmárat po většinu něco, co děláme, říkáme ve třídě. Ale uvědomit si, že není třeba Ideální pedagogický přístup k učení, tento druh materiálu, a materiály obecně. A tak jsme rádi, že oznamuje, že CS50 vlastní Gheng Gong začala připravovat kanonický soubor poznámek do kurzu, naděje , který je, že, jedna, tato slouží nejen jako reference a zdroje pro přezkoumání materiálu a bude zpět prostřednictvím materiálu, který může mít Utekl jste napoprvé, ale také proto, že vaše hlavy může být více nahoru než dolů, když jej přijde čas na přednášku, tak, že byste mohli zapojit více zamyšleně, jako na rozdíl od více scribbly. 

Díky, že řekl, co najdete na Webové stránky jsou tyto dokumenty jako tento. A oznámení, v levém horním rohu, tam je nejen obsah, ale také časové kódy, které okamžitě skočíte na příslušnou část ve video on-line. A co Chang tady udělal je, v podstatě, dokumentace co se stalo v tomto Zejména přednáška. A mnoho z přednášek Již nyní online s tímto URL. A budeme pokračovat, abyste mohl psát zbytek z těch, do konce tohoto týdne, takže se využít tohoto zdroje. 

Takže bez dalších okolků, jsme začali loupat zpět vrstva, která je string na nějakou dobu. A to, co jsme si řekli řetězec je vlastně minulý týden? Takže char hvězda. A char hvězda, no, co se to vlastně znamená? No, tentokrát, pokud máme bylo volání funkce, jako getString a skladování tak zvané vratné Hodnota getString v proměnná-- se to jmenuje s Typ string-- jsme psali řádek kódu tam nahoře. A to je jen, když vidím, můj rukopis zde zvětšený to jsem si uvědomil, jak je to otřesné. 

Nicméně předpokládejme, že, na pravé straně je, nicméně, přiměřené zobrazení toho, co je se děje tohle všechno tentokrát s getString. getString, samozřejmě, dostane řetězec. Ale co to vlastně znamená? To znamená, že dostane kus paměť od operačního systému voláním funkce s názvem malloc. Ale o tom více později. A pak se to vyplní že kus paměti s písmeny uživatel zadali, následuje, samozřejmě, znak null, nebo zpětné lomítko nula až na samém konci. 

Mezitím, na levé straně tohoto příběhu, celou tu dobu, jsme byli deklarování proměnné, jako s. A že proměnná je to, co nyní začne volat ukazatel. Není to krabice uvnitř, které dáme řetězec, Daven, samo o sobě, ale dáme v tomto náměstí pole na levé straně, co přesně? Jo? 

Diváků: Adresa kde je umístěn v paměti. 

David J. Malan: Přesně tak. Adresa, kde Daven se nachází v paměti. A není tam, kde se nachází všechny Daven samy o sobě, ale konkrétně adresa z čeho? Jo? 

Diváků: První znak. 

David J. Malan: První znak v Daven, která v tomto případě, Navrhl jsem byl svévolně a nerealisticky 1 OX1, což právě znamená, že hexadecimální číslo jedna. Ale to asi bude být mnohem větší počet že bychom mohli čerpat s 0x jako předpona, představuje hexadecimální znak. A protože nepotřebujeme vědět, kde Zbytek postav Daven jsou, protože to, co jednoduchý design rozhodnutí, která byla vyrobena před mnoha lety? Jo? 

Diváků: Zpětné lomítko 0. David J. Malan: Jo, přesně tak. Zpětné lomítko 0 umožňuje, i když v lineární čas, procházet řetězec, chůze od leva do prava, se pro smyčky, nebo na chvíli smyčky, nebo něco takového že, a určit, oh, tady je konec tohoto konkrétního řetězce. A tak se jen adresu, na začátek řetězce, můžeme přistupovat celistvost za to, protože celou tu dobu, řetězec byl jen znak hvězda. 

Takže je to určitě v pořádku i nadále používat CS50 knihovny, a to abstrakce, abych tak řekl, ale budeme začíná přesně vidět, co se děje pod celou tuto dobu. Takže si možná vzpomenou tento příklad, Také od minule, porovnat 0, která ani vlastně není porovnání. Ale začali jsme to vyřešit. 

Ale jak asi opakovací, Mohl bych zajímat někoho v růžové slon dnes, také by Chang? Jak se o vás ve frontě? [Neslyšitelné]. Pojď nahoru. 

A do té doby, jak jste přišli, pojďme v úvahu jen na okamžik, co Tento kód byl vlastně dělá. Je to deklarovat dvě proměnné se top, s a t, a volání getString. To není velmi uživatelsky příjemný program, protože neříká, co mám dělat. Ale pojďme jen předpokládat, že jsme se zaměřením na šťavnaté části. A pak budeme dělat, je-li s rovná rovná t, měl by říci printf, jste zadali totéž. Dobrý den. Jak se jmenujete? 

Janelle: Janelle. David J. Malan: Janelle, Rád vás poznávám. Takže vaši výzvu na ruku pro slona je nejprve nakreslit nám obraz toho, co je zastoupen v těch prvních dvou linky. Takže s a t může být zastoupeny jak na obrazovce? A můžete jen kreslit s prst na této velké obrazovce. 

Takže tam jsou dvě poloviny na každá strana této rovnice. Takže tam je to s na levé straně, a pak getString na pravé straně. A pak je tu t na levé straně, a pak getString na pravé straně. Tak jak můžeme začít kreslení obrázek, který představuje to, co se děje tady v paměti, řekli byste? A dovolte mi, abych vám vysvětlil to, co děláte, jak to je. 

Janelle: OK. No, v první, to by se ptát, můžete získat vstupní řetězec. A to by store-- oh, promiňte. David J. Malan: OK. Dobře. A to se říká, co? Oh, OK. Jen tak dál. Nechtěla jsem rušit. Janelle: Omlouvám se. Tak to by vstup do adresa of-- není jistý. Nemohu přesně vzpomenout na číslo, ale věřím, že se začíná s 0. 

David J. Malan: To je v pořádku, protože jsem čísla nahoru, takže není správná odpověď. 

Janelle: Počínaje 0 oblouku. 

David J. Malan: OK, tak prvek 0. Jistě. 

Janelle: A pak, pokud byl jako jen dva-letter-- 

David J. Malan: OK, zpět k vám. 

Janelle: Takže prvek 0, a pak prvek 1 nebo 2 prvkem. David J. Malan: A který kus obrázek se vám právě teď kreslení? Výzva k getString? Nebo prohlášení s? 

Janelle: Prohlášení o shodě S, věřím. Oh, getString, protože by to být vloženy do každého [? oblast. ?] 

David J. Malan: Dobrý. Přesně tak. I když se toto účinně vrací pole, odvolání, Až se vrátíme řetězec, můžeme index do tohoto řetězce s použitím 01 a 2. Technicky se jedná o pravděpodobně zastoupené jednotlivé adresy, ale to je v pořádku. 

Takže předpokládám, jestli můžu jen rychle předat tam, kde jsme skončili Naposledy, pokud jeden z řetězce byla g b e, zpětné lomítko 0, což představuje Gabe je vstup, jak můžeme představovat to teď? Pokud je to paměť, která je byla vrácena getString? 

Janelle: Bylo by to zastoupená obloukem? 

David J. Malan: obloukem? No, no. Řekněme, obrazově, dovolte mi, abych prostě jít dopředu a navrhují, že, pokud je to s, toto je vrácená hodnota getString. A vy jste vyvodit to jako 0, 1, 2, což je naprosto rozumné, protože jsme může index do řetězce, jako takové. Ale jen proto, aby byl v souladu s naposled, nech mě jít napřed a libovolně navrhnout, aby tento je adresa 1, je to adresa 2, Tato adresa je 3, a tak dále. A tak prostě být super jasné, co se děje jít s následkem, že První řádek kódu, by to řekl? 

Janelle: Adresa 1? 

David J. Malan: Přesně tak. Takže řešení 0x1. A mezitím, nechte mě jít napřed a duplikovat hodně z toho, co jste udělali a přidejte sem svůj vlastní tričko. Pokud bych měl psát v Gabe opět, podruhé, Po zobrazení výzvy s getString, kde Samozřejmě, je Gabe jít? No, presumably-- 

Janelle: Stejně jako tady? David J. Malan: Jo. Janelle: Nebo je to také ve stejných boxech? David J. Malan: Dovolte mi navrhnout, jo, přesně, takže v těchto dalších zařízení. Ale to, co je teď Klíčem k úspěchu je, že i když jsem vyvodit to hodně blízko dohromady-- 0x1, toto je 0x2-- ve skutečnosti, teď by mohla být adresa 0x10, Například, a 0x11, 0x12 a, a tak dále. A tak, pokud je to ten případ, co se děje, že skončí tady v t? 

Janelle: 0x10? David J. Malan: Přesně tak. Takže 0x10. A tak teď, poslední otázka. Jste zdaleka, musel pracovat Nejtěžší pro slona tak daleko. Do teď, když jsem vytáhnout kód znovu, když jsem si v souladu tři, pokud je rovná rovná t, co jsem vlastně porovnáním, že jsme tady vyvodit? 

Janelle: dvě adresy? David J. Malan: Přesně tak. Takže říkám, je S equal na t? Jinými slovy, je roven 1 rovná 10? A samozřejmě, Zřejmá odpověď je nyní ne. A tak tento program je v konečném důsledku do tisku co byste řekli? 

Janelle: Bylo by to, jste zadali stejnou věc? 

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

Janelle: Zadali jste různé věci. 

David J. Malan: Přesně tak. Zadali jste různé věci. V pořádku. Takže potlesk, kdybychom mohli, zde. [APPLAUSE] Bylo to bolestivé. Já vím. Dobrá práce. Tak teď uvidíme, jestli nemůžeme odhalit, co oprava byla. A samozřejmě, když jsme pevně tohle-- což budu nyní představují v green-- jsme udělali pár vylepšení zde. Za prvé, stejně jako rozumu zkontrolovat, já jsem první kontrolu pokud je roven null, a t je rovno null. A jen aby bylo jasno, kdy by mohlo s nebo t mít hodnotu null v kódu, jako je tohle? Když může s nebo t být null. Jo? 

Diváků: [neslyšitelné]. 

David J. Malan: Přesně tak. V případě, že řetězec, který uživatel zadali, je příliš dlouhý , aby se vešly do paměti, nebo nějaký divný roh případ jako to, getString, jak uvidíme, doslova dnes, v jeho dokumentaci, říká, že se vrátí null as speciální sentinel hodnota, nebo tak nějak zvláštní symbol to znamená, že se něco pokazilo. Takže chceme zkontrolovat , protože to dopadá že null je velmi nebezpečné hodnoty. 

Často, když se pokusíte udělat něco s null zahrnující function-- předáním jako vstup pro instance-- tuto funkci může se velmi zhroutí a s ním sundat celý program. Takže to třetí řádek je nyní jen zdravý rozum kontrola, kontrola chyb, chcete-li. To je dobrý zvyk teď abychom se do jakékoliv době, kdy jsme zkuste použít hodnotu, která mohl potenciálně být null. 

Nyní, ve čtvrtém řádku tady, "Pokud strcmp (s, t)," dobře, co je to s odkazem na? Tak jsme si řekli, je to velmi stručně pojmenovaný funkce pro porovnávání řetězců. A jeho cílem v životě je porovnat jeho první argument proti druhé, ale ne, pokud jde o jejich adresy, jako jsme to udělali neúmyslně moment před s červeným kódem, ale spíše srovnávat ty dva řetězce v lidsky intuitivní způsob porovnáním tohoto, proti tomu, proti tomu, proti tomu, a pak se zastaví, jestliže a když nebo oba prsty narazí na zpětné lomítko 0. Takže někdo před lety zaveden strcmp realizovat pro nás funkčnost že jsme doufali, bychom se dostali jen o porovnání dvou jednoduchých hodnot. 

Teď upřímně řečeno, pořád výkres všech těchto různých čísel. Ale realita je, že jsem byl takže ty se po celou dobu. A tak mi dovolte pokračovat a čmárat na tohle aby bod, který na konci dne a v pohybu vpřed, nejsme opravdu bude starat o co se týká věci jsou ve skutečnosti v paměti. Takže nebudu kreslit těchto druhy čísel tak už, Jsem jen Abstrakt pryč trochu víc přátelský jen s šipkami. 

Jinými slovy, je-li to je ukazatel, No, řekněme, nakreslit, a to doslova, jako ukazatel, šipka směřující sám od sebe k něčemu jinému, a nestarat se příliš o více markant z těchto adres který opět udělal jsem si tak jako tak. Ale uvidíme tyto adresy, Někdy, při ladění kódu. 

Nyní mezitím, tento program tady řeší, samozřejmě, tento problém tím, že porovná tyto dva řetězce. Ale my jsme se dostali do dalšího problému. To bylo z kopie naprogramovat minule, přičemž jsem se snažil vydělat jen první znak v řetězci. Ale co bylo symptom jsme viděli poslední době, kdy se uživatel zadal hodnotu, jako Gabe malými písmeny, pro s, pak jsme přiřadili s do t jako ve třetím řádku tam, a pak jsem se snažil vydělávat t držák 0? Jaký byl vliv měnící se t držák 0 zde? 

Diváků: Změnila ů. 

David J. Malan: Ano, Změnil jsem s, stejně. Vzhledem k tomu, co se opravdu děje? No, dovolte mi, abych zjistil, jestli můžu vyčistit do obrázku, a to takto. 

Je-li to je, opět, slovo g, a, b, e, zpětné lomítko, 0 a S budeme pokračovat v kreslení jako krabice tady, ale žádné další adresy. Pojďme přestat dělat věci. Řekněme, nakreslit obrázek zjednodušit svět. 

Když Prohlašuji t s řetězcem t, , který vytváří ten kus paměti. Náměstí se stane, že 32 bitů ve většině počítačů. Ve skutečnosti, pokud jste někdy slyšeli o počítač s 32-bitovou architekturu, opravdu si představit, mluvit, že právě znamená, že používá 32-bitové adresy. A jako technický stranou, pokud jste někdy nad tím, proč starší počítače, pokud jste skutečně snažil polévka je s množstvím paměti RAM, může mít pouze maximálně čtyři gigabajty paměti RAM, dobře, že je to proto, že doslova, váš starý počítač mohl jen se počítají jako vysoké jako 4 miliardy, 4 miliardy bajtů, Protože to bylo za použití 32-bit čísla adresy. 

Ale v každém případě, v tomto příklad, příběh je mnohem jednodušší. t je jen další ukazatel, nebo Opravdu char hvězda, aka řetězec. A jak to chci aktualizovat tento obrázek Nyní se, že druhý řádek kódu, po tečka, tečka, tečka? Když jsem si string t se rovná y středník, Jak se změní tento obrázek? Jo? 

Diváků: [neslyšitelné]. 

David J. Malan: Jo. Přesně tak. Jen jsem dal šipku od t box na stejnou adresu, stejné první písmeno dal. Nebo technicky, pokud toto chlap byl ještě na 0x1, je to, jako bych měl 0x1 tady a 0x1 zde. Ale opět, koho to zajímá o adresách? Je to jen myšlenka, že teď není podstatné. Tak tohle je to, co se tady děje. Tak samozřejmě, pokud nechcete t konzole 0, což je pole notace, z course-- a upřímně řečeno, vypadá to jako by pole tady, ale teď je to divná věc. Vězte, že programovací jazyk, C, nabízí tuto funkci, přičemž, i když t je ukazatel, nebo s je ukazatel, můžete i nadále používat, že zná, komfortní hranatá závorka notace jít na první prvek, nebo druhý prvek, nebo jakýkoli prvek že ukazatel ukazuje na, protože podle všeho to je, jako v tomto případě, ukázal na nějaké pole. 

Tak jak tento problém vyřešit? Upřímně řečeno, to je místo, kde se dostal na první pohled trochu ohromující. Ale tady je nová a vylepšená verze. 

Takže nejprve, já jdu zbavit knihovně CS50, jen odhalit, že to je opravdu char hvězda, jen synonymem. A T je také znak hvězda. Ale to, co se děje na pravá strana od této linie kde t je přiřazena hodnota? 

Co je malloc? Co je to strlen? Co je sizeof (char)? Proč to sakra dělá toto linka vypadat tak složité? Co to dělá na vysoké úrovni? Co je to ukládání do t? Jo? Diváků: Je to rozdělení určité množství paměti. Je to uložit, myslím, Písmena [neslyšitelné]. 

David J. Malan: Perfect. Perfect. Je to rozdělení určité Množství paměti ukládat, pravděpodobně, budoucí dopisy. A zejména, malloc Proto se vrací to, co? 

Diváků: Vrácení [neslyšitelné]? David J. Malan: Přesně tak. Vracíte adresu této paměti, což je ozdobný způsob, jak říkat, vrátí adresu První byte této paměti. Je povinností si budu pamatovat, kolik paměti jsem vlastně přiděleno, nebo požádal o malloc. 

Nyní, jak moc je to? No, i když tam je hodně závorek tady, malloc trvá jen jeden argument. A já s uvedením strlen S, tak aby mě tolik bytů, kolik je v s, ale přidat. Proč? Jo? 

Diváků: zpětné lomítko 0. David J. Malan: Přesně tak. Musíme udělat malý úklid. Tak proto, že tam je zpětné lomítko 0, měli bychom si uvědomit, že. V opačném případě budeme vytvořit řetězec, který nemá zvláštní, že terminátor. 

Mezitím, jen být super anál, mám sizeof (char), jen v případě, že někdo běží My kód není na CS50 spotřebiče ale možná jiný počítač celkem, kde znaků je jeden bajt, konvencí, ale dva bajtů, nebo něco většího, než je. Je to prostě být super, Super averzi k chybám. I když ve skutečnosti je to s největší pravděpodobností bude 1. 

Teď, mezitím jsem se do toho pusťte a kopírování string, t držák i se rovná t držák s. A já se odloží na minulý týden zdrojový kód, aby viděli, co se děje. Ale klíč stánek s jídlem, a Důvod, proč jsem dal kód nyní v zelené, Je tomu tak proto, že poslední řádek, t držák 0 rovná toupper, má za následek Vydělávat který řetězec? T a / nebo S? Ten poslední řádek kódu. 

Jen t, protože to, co je se stalo tentokrát, když jsem trochu zpět, že poslední krok, co se stalo, je, když jsem volat malloc, Já v podstatě se kus paměti který má stejnou velikost jako originál, protože to je aritmetický jsem udělal. Jsem ukládání do t na adresu z tohoto bloku paměti. I když to vypadá hezky a pěkný, pěkný a čistý, Realita je, že je to, co budeme udržet volá, hodnoty odpadky tady. To je kus paměti by mohl velmi a byly použity dříve, několik sekund, před pár minutami. Takže by mohlo být naprosto čísla nebo písmena, prostě náhodou. Ale to není platný, dokud jsem sám naplnit tento kus paměti se skutečnými znaky, jako já to, že pro smyčce. V pořádku? 

Takže teď, vyvrcholení Tyto tři příklady , které byly zdánlivě rozděleny minule, tento Swap příklad, tato funkce pracoval v tom smyslu, že vyměnil a a b. Ale nefungovalo to, v jakém jiném smyslu? Jo? 

Diváků: [neslyšitelné]. 

David J. Malan: Přesně tak. Pokud bych měl tuto funkci volat z another-- například, z funkce, jako je hlavní, kde Mám proměnné, X a Y, jak jsem udělal minulý týden, stejný kód, a projdu X a Y Přesunout, a pak volat Swap-- to, Samozřejmě, je správná verze je to, co se chystáme see-- to nefungovalo. Takže to, co je oprava? 

No, tak jen proto, aby se jasné, nech mě jít napřed a-- dej mi jedna sekunda sem, a viz jestli můžu vám ukázat ten poslední, který bude v-- uvidíme, jestli se mi podaří najít to skutečné fast-- OK [neslyšitelné]. OK, tady to je. Takže ignorovat příkazy jsem jen psát. Chci, aby to získat na last minute příklad z minulého období, které je nyní nazýván žádný Swap. 

Takže žádné Swap je místo, kde jsme skončili minule, kdy jsem inicializován x a y na 1 až 2. Pak říkám Swap, procházející v bodech 1 a 2. A pak se tato funkce pracoval v nějakém smyslu, ale neměl trvalé vliv na x a y. Takže otázka po ruce je, jak nyní se vlastně tento problém vyřešit? Jaké je řešení na dosah ruky? 

No, v swap.c, který je nový dnes, Všimněte si, pár rozdílů. X a Y jsou stejné. Ale to, co je jasně jinak o lince 25? Co je nového tam, pokud si vzpomenete, jak to vypadalo před druhým? 

Diváků: [neslyšitelné]. 

David J. Malan: Jo. Takže ampersandy jsou nový kus syntaxe a to nejen v tomto programu, ale také obecněji v CS50. K dnešnímu dni, nemyslím si, že Viděli jsme nějaké příklady nebo opravdu mluvil o nich v každém detail, jiné než, možná, preventivně v části, ampersand takhle. No, to dopadá ampersand je jedním z posledních kusů novou syntaxí budeme se učit. Vše, co to znamená, že je Adresa nějaké proměnné. Na jakou adresu se x žít? Ale to, co se adresa y žít? Vzhledem k tomu, v případě, že Zásadním problémem, než bylo to, že x a y byly předány v kopii, na to, co opravdu chtějí dělat je poskytnout Swap se jako poklad mapa, která vede k kde X a Y vlastně jsou v paměti RAM, takže Swap může následovat tu mapu a jít tam, kam x nebo y označuje místo a změnit skutečné hodnoty 1 a 2, tam. 

Takže Swap potřebuje taky trochu změnit. A na první pohled by to mohlo Vypadáš trochu podobný char hvězdy. A opravdu je to tak. Takže je ukazatel na jaký typ dat, na základě tohoto zvýrazněné části? Takže je to int. 

Takže už není int, je to adresa int. A podobně, b je nyní děje být adresa int. Takže když jsem teď voláme Swap z hlavní, Nebudu dávat Swap 1 a 2. Chystám se dát to jako Ox-něco a Ox-něco, dvě adresy, které povedou Swap jejich skutečné umístění v paměti svého počítače. 

Takže teď, můj zbývající realizace musí změnit tad. Co je to teď samozřejmě jiná v těchto třech řádků kódu? Je tu ty zatracené všechny hvězdy na místě, vše v pořádku? Tak co se to tu děje? Jo? 

Diváků: Je to samozřejmě [neslyšitelné]. 

David J. Malan: Přesně tak. Takže v tomto context--, a to nebylo rozhodnutí o nejlepší design, pravda, před lety. V této souvislosti, kdy stačí mít hvězdu, a nemáte datový typ, jako int, ihned doleva, místo toho máte rovnítko, jasně, v této souvislosti, když říkáte, hvězda, to znamená, že jít do adresa, která je v. Sledujte mapu pokladu, abych tak řekl. 

A mezitím, v souladu 37, znamená to, že to samé. Přejděte na adresu A, a dal to, co tam je? Ať už je místo, které b určuje. Jinými slovy, přejděte na B. Získat tuto hodnotu. Jdi na a na rovné podepsat, operátor přiřazení, tam dal tuto hodnotu. 

Podobně, int temp je jen int. Nic se musí změnit na tepl. Je to jen náhradní sklo z Annenberg pro trochu mléka nebo pomerančového džusu. Ale já si třeba říkat, přejděte na b. Přejděte do tohoto místa určení a dal hodnotu v teplotě tam. Takže to, co se děje potom? Když jsem se vlastně říkat Swap tentokrát, je-li tento první zásobník zde představuje Main, Tento druhý zásobník představuje Swap, kdy Projdu Ampersand x a y ampersand od hlavního Přesunout, jen aby bylo jasno, Co je to za stack frame příjem? Jo? 

Diváků: [neslyšitelné]. David J. Malan: Přesně tak. Adresy x a y adresa. A na co si vzpomenete z nich jako poštovní adresy. 33 Oxford Street a 35 Oxford Street, a chcete přesunout dvě budovy které jsou na těchto místech. 

Je to trochu směšné myšlenky, ale to je vše, máme na mysli adresu. Kde na světě může najít ty dva ints? Kde na světě můžeš najít ty dvě budovy? Takže když konečně po všech těch letech, kdy jsem jít do dnešní zdrojového kódu a sestavit Swap a běh ./swap konečně pro Poprvé můžeme skutečně vidět, že moje hodnoty jsou opravdu byla úspěšně zaměněny. A teď, můžeme dokonce vzít Na toto, řekněme, gdb. 

Tak nech mě jít do stejného souboru. Nech mě jít napřed a spustit gdb z ./swap. A nyní, v Swap, já jdu dopředu a nastavit bod zlomu v Mohanem. A teď jdu dopředu a spusťte program. A nyní vidíme, můj kód Zastavil se u této linie. 

Pokud bych do toho pusťte a tisk x, co bych měl vidět tady? To je otázka. Cože? 

Diváků: [neslyšitelné]. 

David J. Malan: Tak náhodná čísla, možná. Možná jsem štěstí, a to je pěkný a jednoduchý, jako je 0. Ale možná, že je to nějaké náhodné číslo. V tomto případě jsem měl štěstí. Prostě se to stane, že je 0. Ale je to opravdu štěstí, protože ne, dokud jsem zadejte následující a pak vytisknout x má, že řádek kódu, linka 19, byl popraven. 

Mezitím, další zase, když píšete, a dnes vytisknout y, budu vidět 2. Teď, když píšu dál, bude to trochu matoucí, protože teď, printf bude zobrazovat na obrazovky, jak to dopadlo. x je 1. 

Pojďme to udělat znovu. A teď, tady je místo, kde věci zajímavé. Než jsem se zavolat Swap, nebo dokonce krok do toho, pojďme se trochu podívat. x je, opět, 1. Y je, samozřejmě, rychlé rozum zkontrolujte, 2, takže není těžké tam. Ale co je ampersand x? Odpověď, je to trochu funky vypadající. Ale int hvězda v závorce je jen GDP způsob, jak říci toto je adresa. Není to int, je to ukazatel na int, nebo jinak známý jako adresu. 

Co je to šílená věc? Nikdy jsme neviděli něco docela rád, že před. Tak tohle je adresa mého počítače paměť, kde x se stane žít. Je to Ox-něco. A to je, upřímně řečeno, proč Já jsem začal kreslit šipky, místo čísel, protože kdo opravdu zajímá že int je zejména adresa, která je tak velký. Ale bffff0c4, to všechno jsou opravdu hexadecimálních číslic, které jsou 0 až f. 

Takže my nebudeme zabývat příliš dlouho na to, co ty věci jsou. Ale když jsem se vytisknout y, Samozřejmě, vidím dva. Ale ampersand y, vidím tuto adresu. A upozornění pro zvědavý, jak daleko od sebe, jsou x a y? Můžete ignorovat většinu adresu. Čtyři byty. A to je v souladu s našimi dříve, tvrdí, že, jak velký je int? Čtyři byty. Takže to vypadá, že vše, co je seřazovat dobře, jak by se mohlo doufat v paměti. 

Takže teď, řekněme, rychlý posun vpřed na konci tohoto příběhu. Pojďme dál a typ kroku, ponořit se do funkce Swap. A teď nevšiml, když jsem typ, je to shodná s adresou x. Kdybych typ B, je to stejné na adresu y. Takže to, co bych měl vidět, když říkají, přejděte na adresu a? Takže vytisknout hvězdy. Takže hvězdička znamená, tam, v tomto kontextu. Ampersand znamená, že to, co je adresa. Takže hrát prostředky 1. A tisk hvězda b mi dává 2. 

A dovolte mi, abych převzít, pro tuto chvíli, že alespoň kód, který pokračuje se nyní může spustit odůvodněné prostřednictvím tímto způsobem. Ale budeme znovu tuto myšlenku zanedlouho. Takže tato verze Swap Nyní je správný a umožňuje nám vyměnit tento konkrétní typ dat. 

Takže nějaké otázky a pak na swap? Na hvězdy? Na adresu? A uvidíte, s problém nastavit 4, tak nějak, ale problém nastavit 5, určitě, jak tyto věci jsou užitečné a získat mnohem více pohodlné s nimi, jako výsledek. Vůbec něco? V pořádku. Tak malloc je, opět, tato funkce že právě přiděluje paměť, paměť alokace. A proč je to užitečné? No, tentokrát, jste používali malloc. Pokud si myslíte, hned jak getString práce, pravděpodobně, je to bylo ptát se někoho na kus paměti, kdykoliv uživatel zadá řetězec in, protože jsme rozhodně Nevěděl, jak zaměstnanci CS50, jak velké ty řetězce, které lidé budou typu může být. 

Tak pojďme, poprvé, začněte Sloupněte Jak se CS50 knihovna práce, prostřednictvím několika příkladů která nás povede tam. Takže když jsem otevřít gedit a otevřít scanf 0, budeme vidět následující kód. Scanf 0, k dispozici na internetových stránkách dnes, má poměrně málo řádků kódu tu, 14 až 20. A podívejme se, co to dělá. Prohlašuje, int, s názvem x. To říká, že něco jako, číslo, prosím. A teď říká, scanf% i, & x. Takže tam je spousta nových věcí tam. 

Ale scanf, můžete trochu myslet jako opak printf. printf, samozřejmě, vytiskne na obrazovku. scanf druh skenů od uživatele klávesnice něco, co on nebo ona napsal. 

% I je, stejně jako printf. To znamená, že očekáváme, že uživatel typu int. A teď, proč si myslíš, že jsem by mohlo být kolem scanf & X? V případě, že smyslem života scanf je dostat něco od uživatele, jaký je význam průchodem, a x, teď? Jo? 

Diváků: [neslyšitelné]. David J. Malan: Přesně tak. Ať jsem, člověk, zadejte, můj vstup se bude uložen na tomto místě. Nestačí, vzpomínám, jen předat x, protože jsme viděli už, kdykoli předat jen syrové proměnné, jako int, na nějakou jinou funkci, Jistě, může to změnit variabilní, ale ne trvale. To nemůže mít vliv na hlavní. Je možné změnit jen svou vlastní lokální kopii. Ale pokud místo, nemusíte dej mi aktuální int, ale můžete mi ukázat cestu k že int, teď, že scanf, Jistě, mohu z toho, že oslovit a dát tam číslo takže máte přístup k němu stejně. 

Takže když jsem spustit tento program, uvidíme. Ujistěte se scanf 0 dot slash, scanf 0. A když jsem teď zadejte číslo jako 50, díky za 50. Pokud teď zadejte číslo jako negativní 1, pro záporné 1. Nyní zadejte číslo jako 1,5, hm. Proč se můj program mě ignorovat? No, protože prostě, řekl jsem to očekávat pouze int. V pořádku. Takže to je jedna verze tohoto. Pojďme vzít věci do zářezu a navrhnout, že to není dobré. A zde se skrývá velmi jednoduchý příklad o tom, jak můžeme začít psát kód že ostatní lidé mohou využívat nebo ohrozit tím, že dělá špatné věci. Tak linie 16, tak podobné v duchu, aby dříve, ale nejsem prohlásil, že v pravý tentokrát. Já jsem, kterým bylo char hvězdu, aka řetězce. 

Ale co to vlastně znamená? Takže když nezadáte address-- a Já jsem ho volat libovolně, buffer, ale nemohl jsem zavolat, že to, aby simple-- a pak jsem si to, vysvětlete mi, kdybys mohl, na základě předchozí logika, co se scanf dělá v řádku 18, pokud průchod% s a vyrovnávací paměti, což je adresa? Co je scanf, pokud platí přesně stejná logika jako verze 0, Pokusím se udělat tady, když uživatel zadá něco? Jo? 

Diváků: [neslyšitelné]. 

David J. Malan: Přesně tak. Scanf, tím dříve logika, bude mít řetězec že lidské psané v-- je nyní řetězec, že to není číslo, pravděpodobně, pokud on nebo ona cooperates-- a to bude se snažit, aby to řetězec v paměti na libovolnou adresu vyrovnávací paměti určuje. A to je skvělé, protože vyrovnávací paměti je skutečně má být adresa. 

Ale tvrdím, že tento program je buggy v velmi závažným způsobem, protože to, co hodnota je vyrovnávací paměti ve výchozím nastavení? Co jsem inicializován do? Co kus paměti? Já ne, že jo? 

Takže i když jsem přidělena char hvězda, která se již nenazývá s, je to místo nazývá buffer-- tak Pojďme nakreslit název proměnné nyní jako buffer-- jestli nemám volal getString nebo malloc zde že v praxi znamená, že buffer je jen některé odpadky hodnota. 

Teď co to znamená? To znamená, že jsem řekl, scanf očekávat řetězec od uživatele. A víte co? Bez ohledu na to, co se ukazuje na-- a kreslím otazník, ale ve skutečnosti, to bude něco jako OX1, 2, 3, ne? Je to nějaký falešný hodnota, která právě se stane, že tam před rokem. Takže jinak řečeno, je to jako by pufr je jen ukazuje na něco, co v paměti. Nemám ponětí, co se děje. 

Takže když jsem zadat Gabe teď, bude to pokusit se dát g-a-b-E / 0 tam. Ale kdo ví, co to je? A v minulosti, jakákoliv Tentokrát jsme se snažili dotknout paměť, která nepatří nám, co se stalo? Nebo téměř pokaždé. Chyba segmentace, ne? 

Tato šipka, nemám tušení, kde to je polohovací. je to jen náhodná hodnota. A samozřejmě, pokud se interpretovat náhodná hodnota jako adresa, se chystáte jít do nějaký náhodný cíl. Takže Gabe by skutečně crash můj program v tomto případě zde. 

Takže to, co můžeme udělat, je to skoro stejně špatné? Vezměme v úvahu toto třetí a Posledním příkladem z scanf. Tato verze je lepší, v jakém smyslu? Pokud jste spokojeni s předchozí problém, to je lepší. Proč? 

Diváků: [neslyšitelné]. David J. Malan: Dobrý. Takže v tomto případě linky 16 je lepší, v tom smyslu, že jsme explicitně vyčleňují paměti. Nejsme pomocí malloc, jsme použili týden 2 přístup jen deklarovat pole. A my jsme řekl, že řetězec je jen pole znaků, tak to je naprosto legitimní. Ale to je, samozřejmě, jako zjistíte, pevnou velikost 16. 

Tak tento program je naprosto bezpečné, když jsem typ v jedné znakové řetězce, dvoumístný Řetězce, 15 znakové řetězce. Ale jakmile začnu psát 16, 17, 18, 1000 znakové řetězce, , kde je tento řetězec skončí? Bude to skončit částečně zde. Ale kdo ví, co ještě je za hranicemi tohoto konkrétního pole? 

Je to, jako když jsem prohlášen za 16 krabic zde. Takže spíše než vytáhnout všechny 16, budeme jen předstírat, že jsem se vyvodit 16. Ale když pak se snažím číst řetězec To je mnohem déle, stejně jako 50 znaků, Chystám se začít dávat a, b, c, d, x, y, z. A to je pravděpodobně jiné paměti segmentu že, opět, může způsobit můj program k havárii, protože jsem nežádal něco víc než jen 16 bajtů. 

Takže koho to zajímá? No, tady je knihovna CS50. A většina z toho je jen jako návod tak nahoře. Knihovna CS50, celou tu dobu, má tento řádek v souladu 52. Viděli jsme typedef, nebo uvidíte typedef v pset 4, která se právě vytváří synonymum čímž char hvězda může být více jednoduše odkazoval se na jako řetězec. Takže to je jeden z Několik koleček jsme použili tajně pod kapotou. 

Mezitím, tady je funkce, getchar. Nyní se zdá, není tělo na to. A ve skutečnosti, když jsem držet rolování, nemám vlastně zobrazit všechny implementace z těchto funkcí. Pro kontrolu sanity, proč tomu tak je? 

Diváků: [neslyšitelné]. David J. Malan: Jo. Tak tohle je hlavičkový soubor. A hlavičkové soubory obsahují prototypy, plus nějaké další věci, zdá se, jako typedefs. Ale v CS50.c, které máme nikdy uveden přímo, ale byla v CS50 spotřebiče všech Tentokrát, hluboko uvnitř jeho složek, Všimněte si, že je celý banda funkcí zde. 

Ve skutečnosti, pojďme přejděte dolů. Pojďme ignorovat většinu z nich, pro tuto chvíli. Ale přejděte na vezmi_int a uvidíte, jak vezmi_int funguje. Takže tady je vezmi_int. A pokud budete někdy opravdu záleželo, jak dostat int funguje, zde je jeho dokumentace. A mezi věcmi se říká, že je to vám řekne, co rozsahy hodnot se může vrátit. Je to v podstatě negativní 2000000000 k pozitivnímu 2000000000, dávat nebo brát. 

A ukázalo se, to vše čas, i když jsme nikdy měl byste zkontrolovat na to, když se něco pokazí, Ukazuje se, že všechny Tentokrát vezmi_int má vracejí zvláštní konstantní, není null, ale spíše INT_MAX, který je Úmluva jen pár programátora. To znamená, že je zde speciální hodnota. Ujistěte se, za to, jen v případě, že se něco pokazí. Ale my jsme nikdy neobtěžoval se, že k dnešnímu dni, protože znovu, to je určen pro zjednodušení. 

Ale jak se dostat vezmi_int provádět? No, jeden trvá žádné argumenty. Víme, že. Vrací int. Víme, že. Tak jak to funguje pod kapotou? 

Takže je zřejmě nekonečný smyčka, alespoň jednoho vzhled. Všimněte si, že jsme pomocí getString. Tak to je zajímavé. vezmi_int žádá, aby naše vlastní funkce, getString. A teď, proč by to mohlo být? Proč jsem defenzivní zde v řadě 165? Co by se mohlo stát v souladu 164, jen aby bylo jasno? Je to stejná odpověď jako předtím. Může být jen z paměti. Se něco pokazí s getString, musíme být schopni zvládnout. A důvod, proč jsem se nevrací null že technicky, null je ukazatel. vezmi_int má vrátit int. Tak jsem se svévolně rozhodl, v podstatě, že 2 miliardy, dávat nebo brát, bude být zvláštní hodnotu, která jsem nikdy nemůže skutečně dostat od uživatele. Je to jen jedna hodnota jdu ztrácet reprezentovat chybový kód. 

Takže teď, věci se trochu fantazie. A není to úplně stejné funkce jako dříve, ale je to velmi podobné. Tak zjistíte, Prohlašuji zde, v souladu 172, a to jak int n a char c. A pak jsem použít tento funky linku, sscanf, což se ukázalo nekontroluje řetězec z klávesnice. Stojí existující řetězec, který uživatel již zadali. Tak jsem už volal getString, který znamená, že mám řetězec v paměti. sscanf je to, co byste Volání funkce rozebrat. Vypadá to na provázku jsem zadali, znak po znaku, a dělá něco užitečného. , Že řetězec je uložen v souladu. A vím, že jen tím, že jde zálohovat tady a říkají, oh, OK, Zavolal jsem jí to s Tentokrát, ale linka. 

A teď je to trochu jinak. Ale to v podstatě znamená, z důvodů budeme trochu mávat rukama na dnes, že jsme kontrolu na zjistit, zda uživatel zadal a int a možná jiný charakter. V případě, že uživatel zadal int, je to bude uložen v n, protože jsem Absolvování tohoto adresou, Nový trik jsme dnes viděli. V případě, že uživatel také napsal v jako 123x, že x se chystá skončit písmeno ve znaku c. 

Nyní se ukazuje, že sscanf mi říct, inteligentně, kolik proměnných byla sscanf úspěšně schopni vyplnit. Takže podle této logiky, v případě, že funkce Já provádění je vezmi_int, ale já jsem kontrolu, případně, pro uživatele aby zadali do int následuje něco jiného, Co chci sscanf je Návratová hodnota skutečně být? V případě, že cílem je získat jen int od uživatele? 

Takže pokud sscanf přiznání 2, co to znamená? Uživatel zadal něco jako, a to doslova, 123x, což je prostě nesmysl. Je to chybový stav, a Chci zkontrolovat, že. 

Takže pokud uživatel zadá to v tím, že tato logika, co dělá sscanf vrátit, byste řekli? Takže to bude vracet 2, protože 123 se jít sem, a x je skončí tady. Ale já nechci x, aby se naplnil. Chci sscanf jen uspět v plnění první z jeho proměnných. A tak to je důvod, proč jsem chcete sscanf vrátit jeden. 

A pokud je to něco málo přes hlavu pro tuto chvíli, že je to úplně v pohodě. Uvědomte si však, že jeden z Hodnoty vezmi_int a getString je to, že děláme sakra Mnoho chyb kontroly, jako tomu tak že k dnešnímu dni, můžete do značné míry napište cokoliv klávesnici a my se ho chytit. A určitě, personál, určitě ne být zdrojem chyby ve vašem programu, protože jsme defenzivně kontrola pro všechny hloupé věci, které by uživatel mohl dělat, jako je psaní řetězec, kdy jste opravdu chtěli int. Takže teď-- přijdeme zpět na předtím long-- ale po celou tu dobu, getString a vezmi_int mají Byl pod kapotou pomocí této Základní myšlenkou adres paměti. 

Takže teď, pojďme dělat věci trochu více uživatelsky příjemný. Jak si možná vzpomínáte, od Binkym poslední time-- pokud bude moje myš cooperate-- tak jsme měli tento kód, který Upřímně řečeno, je docela nesmyslné. Tento kód dosahuje nic užitečné, ale to byl příklad že profesor Parlante použít, aby se představují co se děje v program, který zahrnuje paměť. 

Takže pojďme se převyprávět to Příběh mimořádně stručně. Tyto první dva řádky, v Anglicky, dělat to, co by na to? Jen rozumně člověk, ale mírně technické termíny, se bodnout. Diváků: [neslyšitelné]. 

David J. Malan: OK, ty, kterým se stanoví adresy pro váš X a proměnné y. Ne zcela, protože x a y nejsou proměnné v tradičním slova smyslu. x a y jsou adresy nebo uloží adresu. Zkusme to ještě jednou. To není špatný začátek, ačkoli. Jo? 

Diváků: [neslyšitelné]. David J. Malan: Dobrý. Myslím, že je to trochu čistší. Deklarace dva ukazatele, dvě celá čísla. A my jsme jim volat x a y. Nebo když jsme k tomu to jako obrázek, opět, připomenout, prostě, že všechny děláme s tím prvním řádku kreslí krabici jako je tento, s nějakou hodnotou odpadky v něm, a volat to x, a pak další box takhle, s některými odpadky hodnoty v tom, volat to y. Máme prohlásil dva ukazatele, které nakonec uloží adresu int. Takže to je všechno. 

Takže když Binky to udělal, jíl stejně vypadal takto. A Nick jen tak zabalili šipky, jako by to neukazuje nikde zejména proto, že jsou to jen hodnoty na odpadky. Oni nejsou explicitně inicializovat kdekoli zejména. 

Nyní další řada kód, odvolání, byla tato. Takže rozumně uživatelsky příjemný, ale poněkud technickou angličtinu, co je to řádek kódu děláš? Jo? 

Diváků: [neslyšitelné]. 

David J. Malan: Perfect. Je to přidělování kus paměti, že je to velikost int. A to je polovina odpovědí. Odpověděli jste právo polovina výrazu. To, co se děje na levá strana rovnítko? Jo? Diváků: a přiřadí že k proměnné x? 

David J. Malan: a přiřadí že k proměnné x. Takže rekapitulace, pravá strana přiděluje dostatek paměti pro uložení int. Ale malloc specificky vrátí adresu tohoto kusu paměti, kterou jste právě navrhla je uložena v x. 

Takže to, co Nick minule Binkym je táhl, že ukazatel se, hlína, ukázat se na bílou kus paměti která je rovna velikosti int. A skutečně, to znamená, představují čtyři bajty. 

Teď, další řádek kódu to udělal, hvězda x dostane 42. Takže 42 je jednoduché na pravá strana, smysl života. Levá strana, hvězda x znamená co? To také může mít gone-- to je v pořádku. OK. 

DIVÁKŮ: V podstatě, jít na [neslyšitelné] David J. Malan: Dobrý. Diváků: [neslyšitelné]. David J. Malan: Přesně tak. Levá strana znamená jít do x. x je adresa. Je to jako 33 Oxford Street nebo OX1. A hvězda x znamená jít na to oslovit a dát to, co tam je? 42. 

Takže opravdu, to je přesně to, co Nick udělal. Začal s vedlejší, v podstatě, mentálně ukázal prstem na x, ve směru šipky na bílém poli na pravé straně boční, a uvedení čísla 42 tam. Ale pak se to začalo trochu nebezpečné, ne? Binky je přijít o hlavu. 

Hvězda y se rovná 13, smůlu, znamená co? Takže hvězdy Y znamená jít na adresu v y. Ale co je adresa y? Dobře, je to hodnota odpadky, ne? Nakreslil jsem to jako otazník. Nick vytáhl ho jako stočený šipku nahoru. A jakmile se pokusíte do hvězdy Y, říká se tam, ale není legitimní adresa, je to nějaký falešný umístění, Program se bude pád. A Binky hlava se děje odletět tady, jak to dopadlo. 

Takže nakonec, tento program byl jen naplno chyba. Bylo buggy programu. A je potřeba opravit. A jediný způsob, opravdu, to opravit by, například, tento řádek, které jsme neměli ani dostat, protože program spadl příliš brzy. Ale pokud bychom měli napravit, co vliv má dělat y rovné x má? No, je to v podstatě poukazuje na y bez ohledu na hodnotu x ukazuje na. 

Takže Nick příběhu, nebo Binky příběh, a to jak x a y se ukázal na bílý kus paměti, tak, že nakonec, když ti se hvězda y znovu se rovná 13, můžete skončit uvedení 13 v vhodné umístění. Takže všechny tyto linky jsou dokonale legitimní, s výjimkou pro tento jeden, když se to stalo před vámi vlastně přidělen ý nějakou hodnotu. 

Teď naštěstí nemusíte musí zdůvodnit přes všechny z těchto druhů otázek, na vlastní pěst. Nech mě jít napřed a otevřít up okně terminálu zde a otevřít, jen na okamžik, super krátký program, který Také je trochu zbytečné. Je to ošklivé. To není dosáhnout něčeho užitečného. Ale to ukazují problémy paměti, takže se pojďme podívat. 

Hlavní, super jednoduché. Je to zřejmě volá funkci, f, a pak se vrátí 0. Je to docela těžké, aby nepořádek to. Takže hlavní je docela dobrý, tak daleko. 

Takže f je problematické. A právě nedal moc úsilí na to pojmenování zde, aby zaměření na kód. f má dva řádky. A pojďme se podívat, co se teď děje. Tak na jedné straně tady-- a dovolte mi, abych to v souladu s předchozí example-- na jedné straně, levá strana je to, co v angličtině? To je-- Diváků: Vytvoření ukazatele. David J. Malan: Vytvoření ukazatele int a volat to x. Takže to vytváří jednu z těch krabic Pořád kreslení na dotykové obrazovce. A teď, na pravé straně boční, malloc, samozřejmě, přiděluje kus paměti. A jen aby bylo jasno, jak kolik paměti je to zřejmě přidělování, pokud jste právě druh si to spočítejte tady? 

Tak to je 40 bajtů. A vím, že jen proto, že vím, int, na CS50 spotřebiče, alespoň je čtyři bajty. SO 10 krát 4 je 40. Takže to je ukládání je x, adresa první z 40 ints že byly přiděleny místo zpět, k sobě, k sobě, k sobě. 

A to je to, co je klíčem k malloc. Neznamená to však trvat trochu paměti tady, trochu tady, trochu tady. To vám dává jeden blok paměti, souvisle, od operačního systém. 

A co teď, x držák 10 = 0? Libovolný řádek kódu. To není dosáhnout něčeho užitečného. Ale je zajímavé, protože x držák 10--? Jo? 

Diváků: [neslyšitelné]? 

David J. Malan: x držák 10 nemusí být null. Detail null přichází pouze do hry s řetězci, na konci řetězce. Ale dobrá myšlenka. 

Jak velká je to pole, a to i když jsem přiděleno 40 bytů? Je to 0 až devět, jo? Je to 10 ints celkem. 40 bajtů, ale 10 ints, indexovány 0 až 0. 

Takže to, co je to, že x držák 10? Je to vlastně část neznámý odpadky hodnota. Je to paměť, která nepatří ke mně. Neměl bych být dotýkat, že byte číslo 41, 42, 43, 44. Jdu trochu příliš daleko. 

A skutečně, když jsem spustit tento programu, může velmi dobře dojít k chybě. Ale někdy, budeme mít štěstí. A tak jen prokázat tohle-- a upřímně řečeno, nikdy nevíte, před vámi se to-- pojďme běžet to. Nebylo vlastně havárii. 

Ale když jsem se to změnit, pro instance, být jako 1000, aby se to opravdu úmyslné, podívejme se pokud se nám podaří to, aby pád tentokrát. OK, to se nespadne. Jak se o 100.000? Pojďme předělat a nyní spusťte jej. OK. Uf. V pořádku. Takže se zdá, opět se jedná segmenty paměti, abych tak řekl, jsou poměrně velké, takže můžeme se znovu a znovu štěstí. Ale nakonec, jakmile se dostanete k smíchu a opravdu jít daleko na obrazovce, se dotknete paměti, že ve skutečnosti, opravdu nepatří k vám. 

Ale upřímně řečeno, tito druhy chyb se děje bude těžší a těžší zjistit, na vlastní pěst. Ale naštěstí, jako programátoři, máme nástroje, které nám umožňují dělat to pro nás. Tak tohle je snad jedna z nejošklivějších programů, dokonce ošklivější, než výstup gdb je. Ale vždy má linku nebo dva, které jsou super užitečné. 

Valgrind je program, který pomáhá nebude ladit program, sám o sobě, ale najít paměti související problémy, konkrétně. To bude automaticky spustit kód si a podívejte se alespoň na dvě věci. Za prvé, jsi něco náhodné, jako dotykové paměti že nepatřil k vám? To vám pomůže najít ty případy. 

A za druhé, bude to pomůže najdete něco, co nazývá úniky paměti, které máme zcela ignoroval, naivně, po určitou dobu a blaženě. Ale ukazuje se, vše Tentokrát, kdykoli jste volali getString v tak mnoho z našich programů, Ptáš se provozní systém pro paměť, ale máte nějakou vzpomínku se někdy, že mu zpět, dělá UNALLOC, nebo zdarma, stejně jako se tomu říká. Ne, protože jsme nikdy zeptal se vás k tomu. 

Ale to všechno čas, programy jsi psal v C byly unikající paměti, žádá provozní systém pro více a více paměť pro smyčce a kdoví co ještě, ale nikdy podal ji zpátky. A teď je to trochu o zjednodušující, ale pokud jste někdy spustit váš Mac nebo váš počítač delší dobu, otevření spousta programů, Možná zavírání programů, a přestože vaše počítač Nehavarováno, je to stále tak mnohem pomalejší, jako by je to opravdu používat velké množství paměti nebo prostředky, i když, pokud nejste ještě nedotýkejte klávesnice, , které by mohly bylo-- ale ne always-- mohl být to, že programy, které používáte mají sami nevracení paměti. A udržet žádá OS více a více paměti, ale zapomínají na to, není ve skutečnosti ji používat, ale tedy s pamětí pryč z jiných programů, které by mohly chtít. Tak to je obyčejné vysvětlení. Tady je místo, kde je Valgrind Výstup je zcela ukrutný k těm méně a pohodlnější podobně. Ale zajímavé věci je právě tady. To mi říká, neplatný zápis o velikost čtyři se děje v tomto programu, zejména, na řádku 21 memory.c. 

Když půjdu na linku 21, hm, tam opravdu je neplatný zápis o velikosti čtyři. Proč velikost čtyři? No, to number-- a by mohlo být anything-- je int. Takže je to čtyři bajty. Takže dávám čtyři bajty kde nepatří. To je to, co Valgrind Je mi vlastně říká. Kromě toho bude také řekni mi, jak uvidíme, jak spustit to v budoucnu pset, zda a když jste unikly paměť, což ostatně Mám, protože jsem volal malloc, ale já jsem ve skutečnosti volal, v tomto případě zdarma, které budeme nakonec vidět je opakem malloc. 

Takže teď, myslím, že konečný příklad. Tak tohle je trochu víc tajemný, ale je to snad Největší důvod být opatrný s pamětí, a důvod, proč se mnoho programů a / nebo na webové servery, dokonce k tomuto dni, jsou převzaty od zlých někde na internetu, kteří jsou nějakým způsobem odesílání falešné pakety na server se snaží ohrozit své účty, nebo se vaše data, nebo jen obecně se přes stroj. Přetečení vyrovnávací paměti, jak je název napovídá, prostředek přetékání ne int, ale vyrovnávací paměti. A vyrovnávací paměť je jen ozdobný způsob, jak říkat, že je to banda paměti. 

A skutečně, jsem zavolal řetězec před vyrovnávací paměti, namísto s. Vzhledem k tomu, jestli je to buffer, jako v tom smyslu, YouTube, nebo kdykoliv se díváte videa, jste mohli vidět slovo vyrovnávací paměti, tečka, tečka, tečka. Je to neuvěřitelně otravné. A to právě znamená, že že vaše video přehrávač se snaží stáhnout spoustu bajtů, spousta bytů z videa z internetu. Ale je to pomalé, takže se snaží ke stažení spoustu z nich vyplnit vyrovnávací paměti, nádobu, aby se máte dostatek bytů, aby se po ukázat video, bez pauzy neustále. Ale jak se ukázalo, je to možné mají vyrovnávací paměť k tomuto velký. Ale zkuste dát tolik dat v to, a velmi špatné věci se může stát. Tak například, pojďme se podívat na Tato závěrečná teaser na příklad. To je další program to, že na první pohled, nedělá nic extra užitečného. Je tu hlavní funkci který volá tuto funkci, f. A že funkce f, tady má char pole, s názvem C, velikost 12. A pak je pomocí tohoto nová funkce s názvem strncpy. 

Ukazuje se, že se tento jednoduchý, jednoduchý řádek kódu, jen dva řádky, jsme se celý svůj program, , a proto se celý můj počítač, a můj uživatelský účet, a můj pevný pohon potenciálně zranitelný vůči každému kdo ví, a je dost dobré pro spuštění Tento program s určitou příkazového řádku argumentem. Jinými slovy, je-li to špatný člověk klade uvnitř argvargv [1] zadáním na klávesnici velmi speciálně vytvořeném řetězec, není abc, 123, ale v podstatě, binární symboly, které představují spustitelný kód, program, který on nebo ona napsal, s tímto jednoduchým programem, který je zástupce z tisíců programů které jsou stejně zranitelné, Troufám si tvrdit, on nebo ona může nakonec odstranit všechny soubory na mém pevném disku, se bliká výzvu, aby on nebo ona může typ příkazů na vlastní pěst, e-mailem všechny soubory pro sebe. Cokoliv, co se dá dělat, když nebo si může dělat s tímto kódem. 

Nebudeme zcela vyřešit ještě. A ve skutečnosti, že to bude zahrnují malý obrázek jako je toto, které budeme brzy pochopit, tím lépe. Ale pro dnešek, pojďme končí co je, doufejme, že o něco více pochopitelné XKCD vtip, dokud jsme pokračovat příště. V pořádku. Uvidíme se ve středu. 

[Přehrávání hudby] 

SPEAKER: A teď, hluboko myšlenky, podle Daven Farnham. Paměť je jako skákání do hromady zlaté listy na nedělní odpoledne. Foukání větru, hodil svůj hair-- oh, Stýská se mi dny when-- 

[SMÍCH]