>> [Přehrávání hudby]
>> David J. Malan: Tak to je CS50 a to je začátek týdne pět.
Takže dnes, pod svým sedáků, nenajdete nic.
Ale především, měli byste si najít to, malý projev našeho uznání za
všechny práce, které jste vložili do hry patnácti.
Jednoduše odstraňte malý kruh na Spodní začít hrát
Zbytek třídy.
>> Takže připomínám, že ani vědět, že nastavení problém čtyři, který vyšel tento víkend,
zahrnuje psát další hru.
Ale tentokrát to zahrnuje použití Aktuální grafické uživatelské rozhraní, a to
textové rozhraní, jako Hra Fifteen.
A hra, která leží před vámi, pokud jste ještě neviděl to dál,
Vypadá trochu něco takového.
Chystám se jít do mého terminálu okna tady v GDB.
A já jdu dopředu a spusťte personál řešení, které můžete přistupovat
Po spuštění aktualizace 50 jako obvykle.
>> Ale já jdu dát do trochu tajný režim, trochu velikonoční vajíčko,
tzv. nesmrtelnost, by uvedení Boha argv1.
A musím řídit své vlastní pokyny, běží to v mé vlastní
problém nastavit adresář.
Takže teď vidíte kompletní verzi ze hry Breakout.
Ve skutečnosti je to ne-ruce režim.
Takže je to vlastně -
ohromeni když může být -
docela triviální realizovat Boha režim, ve Breakout, na rozdíl od hry patnácti,
které někteří z vás mohli řešit pro hackera vydání.
>> V Breakout postačuje v Boha Režim prostě dělat to, co,
intuitivně s pádlem?
Jen se to rovná bez ohledu na vodorovná poloha je míč.
A tak dlouho, jak si to jako jeden muž se míč v pohybu tato hra
Nikdy, nikdy, nikdy ujít míč a budete pokaždé vyhrát.
>> Ale v tomto týdnu hacker vydání je to víc než jen režim Boha.
K dispozici je celá řada dalších funkcí.
Mezi nimi, lasery.
Takže pokud jste opravdu netrpělivý si může začít sestřelení cihly
a několik dalších.
A pro ty z vás, kteří by chtěli kalibraci standardu oproti Hacker
vydání, vidím, že tento týden hacker vydání záměrně je
trochu proveditelné, řekněme, než Bůh Režim byl s Game of Fifteen.
>> Takže pokud hledáte úseku a hledáte nějakou další zábavu
vlastnosti se potápět v případě zájmu.
Nyní více prakticky, dovolte mi připomenout, na jednu věc stejně.
GDB, který někteří z vás nemusí mít ještě dotkla osobně, což je v pořádku.
Ale teď je opravdu čas si zvyknout na to a pohodlně s tímto nástrojem
, protože to bude vaše životy mnohem jednodušší, opravdu.
>> Na přednášce Roba o GDB pár týdny, vzpomínám
že GDB je debugger.
Je to nástroj, který vám umožní spouštět vaše Program ale nechte ji krok za krokem, řádek
po řádku, takže můžete hrabat kolem sebe, takže vidíte, co se děje, a tak
které si můžete vytisknout hodnoty proměnných.
Stručně řečeno, to vám dává mnohem víc energie než printDef dělá.
>> Nyní sice rozhraní je dost tajemný.
Černá a bílá textové rozhraní z větší části.
Příkazy jsou poněkud těžké pamatovat na prvním místě.
Ale i když to může trvat do poloviny hodina, hodina, aby to předem
investice času na to, věř mi.
Jistě by semestru nakonec ušetří jste řádově více
času než to.
>> Takže na začátku týdne ponoru palců
A co se týče Breakout, vím, že jste může to tak dlouho, dokud budete mít
distribuce kód nebo vlastní kód Probíhá ve vaší Pst4 adresáře.
Vězte, že můžete spustit gdb. / Breakout.
>> To bude otevírat okno takhle.
Dovolte mi, abych sám sebe více z terminálu.
A co pak budu pokračovat a dělat, že to není jen spustit.
Chystám se nejprve nastavit bod přerušení Připomeňme, který umožňuje pozastavit
provedení na určitém místě.
>> Jen aby to jednoduché jdu rozbít na lince jedna pouhým zadáním
číslo jedna.
Dovolte mi, abych vlastně znovu otevřít toto okno protože je to stále
malý malý tam.
Takže to, co jsem teď dělat je zde když otevřou své okno terminálu.
Pojď, jdeme na to.
>> Takže teď, pokud se vrátím do Dropbox, Pst4 a spustit gdb. / breakout vstoupit, všimněte si,
Chystám se zlomit jeden pro nastavení bod zlomu na lince jedna.
A teď jdu dopředu a typ spuštění.
A když se mi to, všimněte si, nic Zdá se, že se stalo.
>> Neexistuje žádný pop-up.
Neexistuje žádný grafický uživatelské rozhraní ještě.
Ale to je pochopitelné, protože jsem doslova na lince jedna v mém programu.
A všimněte si, že jsem se rychle předána, konkrétně se na 62, protože všechny
věci v horní části tohoto souboru je věci jako připomínky a konstant a
nezajímavé věci pro teď.
>> Takže teď jsem uvnitř hlavní, Zdá se, že na řádku 62.
A to je jen rozdělení kód odvolání.
Když otevřu můžete jít, podobně, do mého rozevíracího seznamu adresáře do Pst4,
do breakout.c.
A kdybych přejděte dolů a dolů a dolů, a nech mě jít dopředu a zapnout
moje čísla řádků.
>> Co uvidím, jestli bych přejděte na linka 62 je přesně ten řádek, který
jsme se zastavil na.
Takže tento řádek zde, 62, je kde se chystáme být.
Takže teď v GDB, když půjdu napřed a zadejte teď další, zadejte, že to bude
provedení tohoto řádku.
A voila, máme tzv. g okno.
Pokud obeznámeni s tím, co GWindow je, ne se bát.
Spec vás seznámí s tím, jak stejně jako počet Walkthrough videa
vložené do spec.
>> Ale teď pojďme udělat to trochu zajímavější.
Dovolte mi, abych přesunout okno na na stranu trochu.
Dovolte mi, abych oknu trochu větší, takže vidím víc.
>> A teď mi dovolte pokračovat a dál znovu.
A tam jsou mé cihly.
Když píšu další zase teď vidím míč.
A když píšu další zase teď vidím, pádlo.
>> A naštěstí to gedit není Opravdu spolupráci tím, že ukazuje mi
všechno, co chci.
Ale teď když mám dělat dál znovu, další zase, já jsem jen
deklarování některé proměnné.
A mohu vytisknout jednu z těchto kluků.
Tisk cihly, tisky životech.
>> A teď když jsem v tom pokračovat další, všimněte si, že budu
Uvnitř této smyčky.
Ale kód bude provádět přesně tak, jak jsem čekat.
Takže když jsem narazila tuto funkci, počkejte Pro Click, že to bude dělat
doslova, že.
Tak jsem zřejmě ztratil kontrolu na programu.
>> GDB není, že mi další řádek.
Ale ne se bát.
Přejděte na svou hru, klepněte kamkoli.
>> A voila, nyní pokračuje na linku 86.
Takže znovu, je to neocenitelná, nakonec, pro ladění problémů.
Protože můžete doslova procházet Váš kód, tiskové věci a mnohem,
mnohem více.
Ale teď, tyto nástroje samy o sobě by vám dost daleko.
>> Takže jsme, samozřejmě, že pohled Grafika na teď, všichni najednou.
A teď náš svět je trochu zajímavější.
A víš, možná z některých Videa online, které máme tyto
šortky, které jste sledovali jako součást základní problémové okruhy.
>> A že jsem byl zastřelen, a to úmyslně, proti bílému pozadí.
A některé z nich mají výuku Fellows kreslení nějaký text na
Obrazovka, která je překryta na jejich vnitřní straně.
Ale samozřejmě, je to, že ne všechny zajímavé, v reálném světě.
To je jen přednáškový sál s velká bílá obrazovka a pozadí.
A náš úžasný produkční tým třídění ze je všechno sluší
po faktu oříznutí z nebo překrývání nic
děláme, nebo nechceme.
>> Teď už jen stačí motivovat tento týden Opravdu, kam můžete jít, nakonec,
s informatice.
Nejen po problému nastavit čtyři.
Ale po jiném kurzu nebo celého Kurikulum je to úžasné, co všechno můžete
dělat v těchto dnech, pokud jde o grafika zvláště.
>> Někteří z vás možná viděli toto teče kolem on-line.
Ale myslel jsem, že ukážu, jen za pár minut, letmý pohled na to, co
výpočetní techniky a co CGI, počítačová grafika může dělat v těchto dnech
se známým píseň a možná i film.
>> [MUSIC - LANA DEL RAY, "Mladá a krásná]
>> SPEAKER 1: Je to jen trochu úžasný, snad, jak
všudypřítomný -
>> [APPLAUSE]
>> SPEAKER 1: Stáhnul jsem si to.
Ale je to opravdu úžasné, myslím, že právě jak všudypřítomný software a kód a
nástroje, jako je to ve skutečnosti.
Takže je to chuť směru ve kterém můžete jít.
Oh, ne více zařízení dnes.
No, to je skutečně tragická načasování vzhledem k bodu jsem se snažil udělat.
>> Dobře, tak se pojďme spustit Fusion znovu.
Připomenout později.
Dobře, a měli byste se dostali email jako stranou, pokud jste si
Všimněte si takhle.
Dobře, takže připomínám, že minulý týden jsme začali oloupejte to
později známý jako řetězec.
>> string připomíná datový typ, který je prohlásil v CS50 knihovně.
A to je část koleček že nyní začne vzlétnout.
Byl to užitečný koncept brzy.
Ale teď to bude získat více zajímavější a silný
skutečně vidět, že pod kapotou řetězec je právě to, co, to jsme si řekli?
>> Jo, je to tzv. char *.
A * se označuje, že je nějaký druh adresu zapojit.
A tak, když říkáte, char * stačí říct proměnná jejíž datový typ je
ukazatel teď.
Skutečnost, že je hvězda zde prostě znamená, že prohašuješ
tzv. ukazatel.
A že ukazatel bude zřejmě uložit adresu, na
Samozřejmě, char.
>> A teď, proč to smysl?
No, a co je řetězec pod kapotou?
No, nějakou dobu jsme říkali že řetězec je pod kapotou
jen h-e-l-l-o, například.
>> Ale my jsme o tom mluvili jako je v podstatě pole.
A pole by pak vypadat trochu další podobné, přičemž každá z nich
nástupu do sousto.
A pak jsme řekli, že je tu něco zvláštního sem,
zpětné lomítko 0 nebo null terminátor.
>> Takže celou tu dobu, tohle je řetězec.
Ale ve skutečnosti je řetězec vlastně adresu.
A adresy, jak uvidíme, jsou často s předponou 0x konvencí.
Co 0x naznačovat?
Ví to někdo?
>> Tak to prostě znamená, šestnáctkové.
Takže si možná pamatujete, vlastně od PST 1. Věřím, že jedním z warm-up
otázky vlastně ptal hexadecimální zápis kromě
binární a desítkové.
A motivace je, že s hexadecimální máte 16
číslice k dispozici.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, po od a, b, c, d, e, f.
>> A pokud budete počítat všechny ty nahoru, získáte celkem 16.
Tak to je v rozporu s desetinné číslo, kde máme 10
číslice, 0 až devět.
Je to v rozporu s binárním kde jsme jen 0 a 1.
>> Ale na konci dne si můžete jen představují stejná čísla, ale
poněkud jinak.
A hexadecimální je časté, protože jako to dopadá - a uvidíme to
později v průběhu - i když jsme se na webové programování v rámci
HTML a barevné kódy, hexadecimální je pěkná.
Protože každá číslice, ukazuje, představuje čtyři bity dokonale.
Tak to tak nějak linek pěkně jak budeme nakonec vidět.
Takže to může být Ox123 nebo tak něco jako to, že označuje adresa 123
někde uvnitř mého paměti počítače.
>> Samozřejmě, některé problémy vznikají protože toto základní
implementace.
A připomínám, že jsem nahodil na provádění funkce, jako je tento -
porovnat palubní 0 dot c minulý týden, že i když to vypadalo, že to bylo
Dobře, to prostě není v porovnání dva řetězce správně.
>> Jsem zahodil hlavní, a já jsem hodil pryč připomínky jen zaměřit se na
kód, který je v zájmu zde.
A to je v červené barvě, protože je to kočárek.
Z jakého důvodu?
>> No, nahoře tam, když jsem prohlásil, řetězec, co se opravdu děje
pod kapotou?
No, dovolte mi přejít na obrazovky, a kreslit to.
Tak jsem prohlásil znovu, řetězce s GetString.
>> Takže budu pokračovat a nyní kreslit s pro co to vlastně je.
To bude čtverec tady.
A budu tvrdit, , že to je 32 bitů.
Alespoň to obvykle je, alespoň na CS50
spotřebič v mnoha počítačů.
Budu říkat to.
>> Ale teď vzpomínám, že jsme volal GetString.
Takže GetString vrací, Samozřejmě, řetězec.
V případě, že uživatel zadá h-e-l-l-o zadání řetězec ahoj dostane se vrátil.
A to řetězec, jak jsme právě řekl, končí někde v paměti počítače
s lomítkem 0 na konci.
Budu kreslit to jako pole - nebo souvislý blok znaků -
že to vlastně je.
>> A teď, co je getString vlastně vrací?
Co GetString vracejí celou dobu?
No, řekněme, v týdnech před, vrátí řetězec.
Ale technicky, co dělá GetString návrat zdánlivě?
>> Diváků: adresa.
>> SPEAKER 1: adresa.
Konkrétně se vrátí adresu první sousto, ať je to cokoliv.
Jen jsem nadále používat jednu, dvě, tři protože je to pohodlnější.
>> Vrací adresu první znak v řetězci.
A my jsme minulý týden uvedl, že , že je dostačující.
Vzhledem k tomu můžeme vždy přijít na to, kde konec řetězce jen tím, že
iterace, možná se pro smyčka nebo while, nebo něco takového
, že jen hledá "lomítkem 0", speciální sentinel charakter.
>> A pak víme, že řetězec se stane, že délky -
V tomto případě -
pět.
Takže technicky to, co dělá GetString je vrátí Ox123 v tomto případě.
A technicky co se stane, je pak že budeme ukládat, uvnitř s, Ox123.
Na konci dne, i když to je nový koncept, ukazatele, jsou
jen proměnné.
Ale stalo ukládat bity dohromady představují adresu.
Takže technicky vše, co dostane uložené v s je Ox123.
>> Ale my jako lidé -
včetně dnes dál -
opravdu nebude starat, typicky, co je skutečná adresa
nějakého kusu paměti.
Je to jen na nízké úrovni detailu být intelektuálně zajímavé.
Takže jdu vrátit zpět.
A místo, více na vysoké úrovni, stačí říct že když mluvíme o ukazatele
Budu jen kreslit více uživatelsky příjemný šipka, která vyjadřuje
Stejný nápad a abstrakty daleko, že údaje, jaké jsou skutečné
základní adresa.
>> Nyní, když se vrátíme do kódu, co se stalo minulý týden, máme-li řetězec t
rovná GetString?
No, kdybych znovu zadejte ahoj Tentokrát budu mít
další kus paměti.
h-e-l-l-o zpětné lomítko 0.
>> Ale protože jsem volal getString podruhé -
a vím, že to z pohledu na Zdrojový kód getString - i
i když je to náhodou, že byl ahoj zadali dvakrát, GetString není
bude snažit optimalizovat a být chytrý.
Je to prostě dostane další kus paměť z počítače, který je
bude na jiné adrese.
Pojďme libovolně stačí říct 456.
>> A potom, co se to děje vrátit?
Bude to návrat 456 a uložte jej na t.
Takže to, co se opravdu děje, na levá strana je mám jiný kus
paměti, typicky 32 bitů.
A tam se chystá jít Ox456.
Ale znovu opakuji, nemám zájem v těchto konkrétní čísla ještě.
Já jsem prostě jít abstraktně kreslit jako šíp.
>> Tak to je nyní nová vysvětlení.
Ale je to přesně stejný názor, že je dělo celou tu dobu.
A tak důvod se tedy, že tento první verze Compare byl kočárek
minulý týden se proč?
Když to uděláte, pokud je rovná rovná t, co se opravdu
pod pokličku srovnání?
>> Ty porovnáním adresy.
A jen intuitivně, jasně, Ox123 nebude stejné Ox456.
Tato čísla, tyto bity jsou prostě jiné.
>> A tak důsledně, minulý týden řekl, Zadáte různé věci, a to i v případě, že
slova doslovně stejná.
Tak jsme se opravit.
Laicky řečeno, co je oprava?
>> DIVÁKŮ: Použijte funkci.
>> SPEAKER 1: Použijte funkci.
Nebo hvězdy jsou rozhodně účastní, ale použít funkci dělat co?
>> DIVÁKŮ: Pro porovnání řetězců.
>> SPEAKER 1: Pro porovnání řetězců.
Takže zásadní problém zde byl že jsem se právě s ohledem na
Kvalita řetězců, které budou definovány srovnání jejich adresy.
A samozřejmě to je jen hloupý nyní jednou abyste pochopili, co se děje
pod kapotou.
Chcete-li opravdu porovnání řetězců, zda jsou rovné tím způsobem, že lidské
by za dva řetězce se rovná musíme porovnat jim postavu
znak pro znak.
>> Teď jsem mohl udělat Jedná se o velmi zdlouhavě.
Ale důvěrně, jsme pomocí smyčky for.
A stačí porovnat s. držák i proti t držáku i.
Držák je i plus 1 proti t držáku i a 1, a tak dále, v
nějaké smyčky.
A když jsem se zjistit jakékoliv dva znaky, které se liší, nebo pokud si uvědomuji, že ooh, s je
kratší než T nebo delší než t Já mohu okamžitě říci nepravdivé,
že to není to samé.
>> Ale když jsem se projít na S a T a řekl stejný, stejný, stejný, stejný, stejný, konec
oba řetězce, mohu říci, Je pravda, že jsou stejné.
No, naštěstí, před lety někdo napsal, že kód pro nás.
>> A oni říkali StrComp pro řetězec porovnání.
A i když je to trochu proti intuitivní, StrComp vrátí 0, pokud jsou
dva řetězce, s a t jsou stejné.
Ale vrátí zápornou hodnotu, pokud je by měla přijít před t abecedně nebo
kladná hodnota, pokud by měla přijít po t abecedně.
>> Takže pokud jste někdy chtěli uspořádat něco, ukázalo se, že je užitečné StrComp.
Protože to není jen říct, ano nebo ne, která se rovná nebo ne.
To vám dává pocit objednávání podobně jako ve slovníku sílu.
Takže StrComp, s čárka t se rovná 0 znamená, že se rovná
Řetězce jsou opravdu stejné.
Protože ten, kdo napsal tuto funkci lety pravděpodobně použita pro smyčce
nebo while, nebo něco takového integrovat nad znaky znovu
a znovu a znovu.
>> Ale problém dvě století zde vyrostla.
To bylo copy0.c.
A dva červeně je protože to je chybný.
A co tady děláme?
No, nejdřív jsem volal getString.
A já uložena návratovou hodnotu v sekundách.
Tak to je skoro stejné jako tato horní část obrazu.
>> Ale to, co přijde potom?
No, dovolte mi jít dopředu a zbavit z celé banda to.
Budeme dozadu v čase, kdy jsme právě mají s, který je nyní v souladu s
linka jeden tam.
>> I zkontrolovat.
Pokud je rovná rovná 0.
Teď rychle okrajová poznámka, když může vrátit GetString 0?
K dispozici je dostatek paměti.
Je to tak?
>> Je to vzácné, že se to stane, Určitě na počítači, který je
mám stovky megs nebo dokonce giga RAM.
Ale mohlo by, teoreticky, vrátí 0, a to zejména v případě, že
uživatel nespolupracuje.
Existuje způsob, jak předstírat, že nemáte Zadaný cokoliv a trik
GetString k návratu 0 efektivně.
>> Takže to bude kontrolovat, že.
Protože pokud někdo z vás začaly se již, segmentace poruchy -
který byl pravděpodobně zdrojem nějaké frustrace -
ty jsou téměř vždy výsledkem paměti související chyby.
Nějak si zpackal s ohledem na ukazatel, i když jste si neuvědomil,
byl ukazatel.
Takže můžete mít vyvolané segmentaci chyby jsou již první týden pomocí
něco jako pro smyčce nebo ve stavu smyčka a pole tím, že jde příliš daleko
kolem hranice některých pole, které jste deklarovali v týdnu dva v
zvláště.
>> Můžete to udělat i problém nastavit čtyři s Breakout.
I když jste možná ještě neviděli všechny hvězdy v distribuční kódu pro
Breakout, se ukazuje, že ti, GRect a GOval a jiné takové věci,
ty jsou vlastně ukazatele pod kapotou.
>> Ale Stanford, stejně jako my, tak nějak kůží který podrobně uvede přinejmenším pro knihovny
účely, stejně jako my řetězce a char *.
Ale GRect a GOval a všechny z nich co vy jste, nebo bude používat
Tento týden jsou nakonec adresy paměti.
Prostě to nevím.
>> Takže to není divu, snad, že byste mohli zakopnout některé
segmentace chyby.
Ale co je zajímavé, tady, pokud poté, co zkontrolovat, co děláme 0
string t dostane s.
No, dovolte mi prohlásit t.
Chystám se kreslit jako čtverec, 32 bitů, říkají t.
A pak budu dělat, dostane s.
>> No, co to znamená?
No, je to trochu těžké, že o tom si představit moudré.
Ale pojďme přemýšlet o tom, to, co je uvnitř X?
Co je doslova uvnitř této proměnné?
Hodnota Ox123.
>> Takže když řeknu, string t dostane s, že právě doslovně znamená vzít číslo
v s, což je Ox123 a dát to Ox123.
Nebo obrazově, když jsem trochu abstraktní od toho, že má informaci
Vliv doslova dělat to také.
>> Takže teď, myslím, že zpět do minulého týdne, kdy jsme přistoupili k kapitalistického T. I
to T držák 0.
No, T držák 0, i když je to ukazatel, můžete zacházet, jako by
je to pole, s náměstí držák notace.
>> Tak kde je T držák 0?
No, je to h.
A tak když jsme se použít tento řádek kódu, dvě horní, která je v tomto c type.h
hlavičkový soubor, to je místo, kde to prohlásil.
Jste vydělávání tuto H. Ale Samozřejmě, že je to přesně stejný h to
uvnitř s, abych tak řekl.
A tak teď jste změnili nebo Aktivace původní i
tzv. kopie.
Protože jste neudělali kopii v způsobem, že člověk by chtěl, aby to bylo.
>> Takže to, co bylo tady fix, v copy1.c minulý týden?
Funkce, takže jsme mohli vlastně kopírovat řetězec.
A v podstatě, co musíme udělat, aby se kopírovat řetězec?
>> No, v tomto zeleném provedení zde jsem dělat to poměrně nízké úrovni.
Tam jsou vlastně funkce by mohly pomoci s tímto.
Ale ty základní, a nejvíce zná jeden, alespoň bude brzy
známe, je následující -
takže je na prvním řádku kódu v zeleném teď.
>> Jen jsem přepsal s jako char *.
Není funkční rozdíl tam.
Jen jsem zahodil CS50 knihovny a Volám to, co je, char *.
>> Nyní tečka, tečka, tečka, protože tam byly některé kontrola chyb, že to není
zajímavé povídání o znovu.
Takže teď t je deklarována.
To je také char *.
Tak jsem vytáhl malý čtverec na obrazovka jako předtím.
>> Ale na pravé straně, malloc, jsme si řekli, je paměť alokovat.
Takže přidělit nějaký kus paměti.
A kolik bajtů my vlastně chcete vyhradit, to vypadá?
>> No, délka řetězce s.
Takže pokud je to ahoj to je bude pět.
Řekneme, že h-e-l-l-o.
Takže pět bajtů.
>> Ale pak navíc 1, proč jeden?
0 charakteru.
Nebudeme-li ponechat prostor pro toho chlapa jsme může náhodně vytvořit situaci,
kde řetězec je h-e-l-l-o.
A pak příště GetString je volal a já zadejte například
David, D-a-v-i-d, který počítač bude myslet si, že to je vlastně
h-e-l-l-o-d-a-v-i-d, protože tam bez přerušení mezi těmito slovy.
>> Takže musíme tu pauzu.
Takže nechceme pět.
Chceme šest bajtů.
>> A bajtů říkám.
Ale je to opravdu čas velikost char.
Technicky char je téměř vždy jeden byte.
>> Ale jen proto, aby náš kód přenosné, abych tak řekl, tak, že to funguje na
různých počítačů, i když by mohli být poněkud odlišný pod
kapuce, budu obecně říci velikost char, aby
můj kód vždy funguje.
A nemám překompilovat to jen protože jsem upgradovat svůj počítač nebo pomocí
nějaké jiné platformě.
>> Tak jsem dostal 6 krát velikost char, který se stane být jeden.
Takže to znamená, že by malloc Dejte mi šest bajtů.
Co je to vlastně dělá?
No, dovolte mi vrátit se zpět v čase zde tam, kde jsme v příběhu.
>> Takže když se vracím domů, jsem prohlásil, char * s názvem t.
Já jsem teď volal malloc šest bajtů.
A teď budu kreslit těchto šesti bytech stejně jako pole dříve.
Ale já vlastně nevím, co je to uvnitř tohoto pole.
>> Pokud se alokovat paměť se ukáže, že nemůžete věřit, že tam je nějaký
známá hodnota tam.
To by byly použity něčím jinak, jiné funkce, jiné
řádek kódu, který jste napsal.
Takže budeme obecně nazývali odpadky hodnoty a kreslit, snad, jak
otazníky, jen naznačuje, že jsme Nevím, co to vlastně je.
A to není žádný velký problém, tak dlouho, jak jsme jsou dost chytří na to přepsat ty
odpadky hodnoty s čísly nebo znaky, které se starají o.
>> Takže v tomto případě to, co budu dělat?
No, moje řádek kódu další, mám čtyři.
int i dostat 0, n dostane délka řetězce s.
Takže známý pro smyčce.
I je menší než nebo rovno n, která je obvykle vyšší.
>> Ale tentokrát je to úmyslné.
I + +, a pak jsem prostě dělat t i držák dostane s.
Protože můj obrázek vypadá to na Tento moment, uložené v t je
adresa tohoto náhodného kusu paměti jejichž hodnoty nejsou známy.
Ale jakmile jsem se do t držák 0, která staví mě sem.
>> A co skončí dobývání vyvodit?
Jsme skončili uvedení h.
Protože to je to, co je v držáku s 0.
A pak totéž pro e a l a l, a o.
>> n, proč jsem jít nahoru přes rovnat k n?
Vzhledem k charakteru 0..
Tak aby bylo jasno, pak když jsem vlastně vymazat, co ty odpadky
hodnoty a pak vlastně kreslit to, co očekávám, je to držák s 1, 2,
3, 4, a to je koncové nová postava.
>> A tak teď, pokud jsme pokračovali kolem bodu, tečka, tečka v tomto správnou verzi
a kapitalizované t držák 0 bych, ze Samozřejmě, bude vydělávat právě tento
chlap tady, které koncepčně, byl nakonec cíl.
Tak to je vše, je ukazatel.
>> A vy jste používali je již několik týdnů se v souvislosti s řetězce.
Ale pod kapotou jsou trochu složitější.
Ale pokud si myslíte, že o nich v této obrazová forma navrhuji, aby to
zřejmě není všechno, že děsivé jako oni mohlo na první pohled zdát na první pohled,
zejména s takovou novou syntaxi.
Jakékoliv dotazy týkající se ukazatelů, řetězce, nebo chars?
Jo?
>> Diváků: můžete se vrátit zpět na [neslyšitelné]?
>> SPEAKER 1: Jistě.
>> Publikum: Tak jak to, že ve vašem úplně poslední linka, nemusíte mít * T linku
a * s v řadě?
Ještě nemáte odkaz na -
>> SPEAKER 1: Ach, je opravdu dobrá otázka.
Proč mám * T a A * S?
Protože krátce, minulý týden, stejně jako v našem zaměnit funkci, řekl jsem, že když
máš ukazatel prostředků, které se tam jako my
fyzicky na jevišti, byl skutečně použijte hvězdy operátora.
>> Ukazuje se, že toto náměstí-držák notace je to, co budeme říkat syntaktická
cukr, který je jen způsob, jak sexy říká, že je to zkrácený zápis pro
přesně to, co popisujete.
Ale je to trochu více intuitivní.
A na nebezpečí, že by to vypadat více složitější, než je třeba, aby se,
co se opravdu děje je následující -
Když řeknu, * t to znamená, že jít do adresa uložená v t.
>> Tak doslova, jestliže t je ukládání adresa, že H
zpočátku, * t znamená jít sem.
A teď, co se t držák 0 znamená?
Přesně stejnou věc.
Je to jen o málo více uživateli přátelský psát.
>> Ale já jsem neskončil.
Nemůžu jen tak říct * t * S dostane.
Vzhledem k tomu, co bych měla dělat pak?
Já bych dávat h, h, h, h, h v celé věci.
Je to tak?
>> Vzhledem k tomu * t, je jít na adresu vt.
Ale my jsme uvnitř smyčky.
A jakou hodnotu mám zvyšování, Samozřejmě, že při každém opakování?
i.
>> Ale je tu možnost tady, že jo?
I když tento pocit, je to čím dál trochu sofistikovanější
než čtvercového držáku zápisu jsme použili nějakou dobu -
dovolte mi vrátit mou h změnu zde -
I když je to dnes už trochu milovník, základní myšlenka, je-li t *
zde znamená a * t jen přejděte na adresu vt.
>> Ale co se adresa v t?
Počet držíme používáte?
Jako Ox456, vraťme to zpátky jen kvůli diskuse.
No, když chci se dostat na e do t řetězec, jen chci jít,
v podstatě, 456.
>> Nebo spíš, 457.
Jen chci přidat.
Ale můžu dělat, že jo?
Vzhledem k tomu, t, i když pořád výkres nyní jako šíp, je to jen
číslo, Ox456.
A když přidám jednu k tomu, nebo více Obecně platí, že když přidám já k tomu mohu
skutečně dostat přesně tam, kde chci.
Takže když jsem vlastně to -
a to je to, co se nyní nazývá ukazatel aritmetika -
Nemohu odstranit tento řádek.
Což je, upřímně řečeno, myslím, že jasnější a trochu více uživatelsky přívětivé pro čtení.
Jedná se však o méně správné.
>> Tento řádek kódu se používá ukazatel aritmetika.
Je to řeč jdi do následující adresu -
bez ohledu na začátek T, který je t a i, která zpočátku
je 0, což je skvělé.
Protože to znamená, že začátek t. plus 1 plus 2 plus 3, a tak dále.
A totéž se zabývají s.
>> Takže syntaktický cukr pro toto.
Ale pochopení toho, co se opravdu děje pod kapotou, řekl bych,
ve skutečnosti užitečné samo o sobě.
Protože to znamená, že teď už to není mnohem více magie děje
pod kapotou.
Nejsou zde bude mnohem více vrstvy, které můžeme Sloupněte pro vás.
To je cca.
A to je programování.
Opravdu dobrá otázka.
>> Tak jo, bylo to, že kočárek program, který jsem měl na mysli dříve.
odkládací byla vadná.
Pokud se zdá, že práce.
Připomeňme, že stejně jako s mlékem a pomerančový džus - což jsem začal
pití dnešní demonstraci.
Takže stejně jako s pomerančovým džusem a mléko, jsme muset použít
dočasné proměnné, tmp, držet dočasně tak, že bychom mohli
změňte jeho hodnotu a poté aktualizovat b.
>> Ale tato funkce, jsme si řekli, a to program, v němž byla tato funkce
napsal, byla špatně a vadný, proč?
Ano?
>> DIVÁKŮ: [neslyšitelné].
>> SPEAKER 1: Přesně tak, když zavoláte odkládací -
nebo obecněji, když zavolejte nejvíce jakoukoli funkci -
pokud jsou argumenty této funkce jsou primitivní, abych tak řekl, ints a chars
a dvoulůžkové a plováky, věci bez hvězdy, jste kolemjdoucí v kopii
argument.
Takže pokud je x 1 a y 2 byl, bude na 1 a b bude 2.
Ale oni se chystáte být různé kusy bitů, různé kousky
paměti, že stalo, že se ukládání stejné hodnoty.
>> Takže tento kód je super perfektní na odkládání a a b.
Je to k ničemu swapping -
minulý týden například -
x a y.
Vzhledem k tomu znovu, že jsou v nesprávném rozsahu.
>> Teď, jak jsme jít o stanovení tohle?
Museli jsme funkci vypadat trochu ošklivější.
Ale znovu, zvažte, co to znamená jen.
>> A vlastně, nech mě, konzistence, změnit jednu věc, takže je to stejné
co jsme právě udělali.
Jak jsem již zmínil minulý týden, to není na tom, kde to jde.
Ve skutečnosti, obvykle byste dal hvězdy vedle názvu proměnné.
Ale myslím, že to bude trochu jednodušší zvážit * vedle
datový typ v tom smyslu, že je to ukazatel na int v tomto případě.
>> Takže to, co tu vlastně dělám?
Říkám, že mi nedáš int následuje další int,
volat je a, b.
Dejte mi adresu int.
Dej mi adresu jiného int.
Zavolejte ty adresy a a b.
>> A pak pomocí * notaci dolů níže, jít do každé z těchto adres
V případě potřeby se buď získat nebo nastavit jeho hodnotu.
Ale je tu výjimka zde.
Proč nemohu mít * vedle tmp?
Proč to dělat, například?
Mám pocit, jako bych měl jít all ven a opravit celou věc.
Jo?
>> DIVÁKŮ: [neslyšitelné].
>> SPEAKER 1: já jsem prohlásil, tmp jako řetězec.
Takže by to vyhlásit, v tomto případě, tmp být adresa int.
Ale to není to, co chci, na několika důvodů.
>> DIVÁKŮ: Nechcete vyměnit je.
>> SPEAKER 1: Přesně tak, já nechci vyměnit cokoliv s tmp. tmp je jen
týden jedna věc.
Všechno, co chci je proměnná uložit určitý počet.
Nemám ani starat o adresách v tomto okamžiku.
>> Potřebuju jen 32 bitů nebo takže k uložení int.
A já chci, aby v těchto 32 bitů co není, abych tak řekl, ale
co je, jen proto, aby byl přesnější.
Vzhledem k tomu, pokud je adresa, * znamená jít a získat hodnotu 1.
Například minulý týden například nebo v případě B je, získat hodnotu 2.
>> Takže to, co se opravdu děje?
Dovolte mi, abych zde nakreslit obrázek, který bude jen šprýmaři odděleně část dnes.
Ale tento trend bude pokračovat, aby se pro docela nějaký čas.
>> To tvrdím, je to, co počítač je Paměť vypadá při spuštění
programu, každý program.
Při spuštění programu na samém vrcholu z paměti RAM vašeho počítače - takže myslet
Tento obdélník, opravdu, jako váš počítače RAM nebo paměti, všechny 101
miliarda bajtů, to vše dvě miliardy bajtů, celé dva gigabajty tom,
bez ohledu na množství, které mají, je, Pojďme nakreslit například obdélník.
A tvrdím, že při spuštění programu jako je Microsoft Word nebo Chrome
nebo něco podobného, ​​bity, které Microsoft nebo že Google psal -
V případě těchto programů -
jsou načteny do paměti počítače kde mohou být provedeny další
rychle a dodal do procesoru, který je mozek počítače.
>> A TAM oni jsou skladovány při velmi horní část programu, abych tak řekl.
Jinými slovy, pokud je to kus paměť, při poklepání na
Microsoft Word, bity přicházejí vypnutí pevného disku.
Dostanou načten do paměti RAM.
A budeme strkat je do úplně nahoře tohoto obdélníku koncepčně.
>> No, zbytek paměti je použít pro různé věci.
Na samém vrcholu vidíte inicializovat dat a inicializaci dat.
To souvisí, z větší části, s konstanty nebo globální proměnné
které mají hodnoty.
Ale o těch jindy.
>> Pak máte hromadu, která vrátíme se.
Ale ve spodní části, je ta část, která je zejména Germaine právě teď.
Je to tzv. stack.
Takže stejně jako ve většině jakékoli D haly zde kampus, máte ty zásobníky, které
jen zásobník na sebe, na kterém si můžete dát jídlo a kdo ví co ještě.
Zásobník v počítačovém systému je velmi podobný.
Kromě zatímco zásobníku, jak je používáme v jídelna, samozřejmě, je třeba
nést věci zásobníky nebo rámy -
jak budeme nazývat - v počítači je paměť se používá pro zastavení
proměnné a hodnoty.
>> Takže to, co se opravdu děje pod kapotou?
No, dovolte mi otočit na obrazovku zde.
A pojďme zaměřit pouze na spodní část na chvíli.
Pokud se jedná o spodní část z mých paměti počítače to dopadá, když jsem
volání funkce main - což se stává, upřímně řečeno,
automaticky pro mě -
Mám kus paměti na Spodní část mé paměti, abych tak řekl.
A to je místo, kde je hlavní lokální proměnné jít.
To je místo, kde argc a argv možná jít, a všechny proměnné I
prohlásit uvnitř hlavní.
Skončí na dně mé paměti RAM počítače.
>> Nyní předpokládejme, že hlavní výzvy funkce jako odkládací prostor, jako to udělal minulý týden?
No, jsme v podstatě dát nový zásobník nový snímek, na mém kusu paměti.
A budu popisovat to jako patřící do swap.
>> Teď, co je uvnitř swapu?
No, na základě minulého týdne a programu ta, kterou jsme právě viděli ukázku z,
uvnitř swapových rámu, nebo na swapu zásobník, jsou to proměnné?
No, a, b.
Protože to byly jeho místní argumenty, a za třetí, tmp.
Takže opravdu, mohl bych nakreslit to trochu čistěji.
Nech mě jít dopředu a zpět štítku.
A dovolte mi tvrdit, že víte, co?
>> pravděpodobně skončí tady.
B skončí tady.
A tmp skončí tady.
Nyní, možná uspořádání být trochu jinak.
Ale koncepčně to je nápad.
>> A jen společně, to je to, co zavoláme swapu rámu, nebo
jídelní sál zásobník.
A totéž se zabývají hlavní.
Ale nebudu překreslovat, že.
Ale to je místo, kde argc a argv a jakékoli svých lokálních proměnných, jako je x a y
může být také.
>> Takže nyní zvažuje, co se skutečně děje když zavoláte swapu.
Voláte-li do swapu, spuštění kódu jako to, že jste předáním, v
buggy verze A a B jako kopie x a y.
Takže když jsem se teď kreslit to na displeji -
se dostat lepší na to -
tak příběh říkal jsem si pro sebe bylo v této verzi kočárku, když
zavolejte vyměnit předáním doslova a a b jako celá čísla, co se skutečně děje?
>> No, co se opravdu děje, je to.
Nech mě jít dopředu a zpět jen uklidit nějaký prostor zde.
Tak tohle je moje paměť počítače.
>> Takže pokud mám například -
vlastně uděláme to takhle -
když tvrdí, že je to x, skladování hodnota 1, stejně jako minulý týden.
A to je y, uložení hodnoty 2 stejně jako minulý týden.
A to je hlavní, když volám swapu, čímž sám přístup a
b a tmp, budu tvrdit, že to je, a to je 1.
>> To je b.
To je 2.
To se nazývá tmp.
>> A zpočátku, to má určitou hodnotu, odpadky dokud jsem vlastně ukládat v něm,
což je 1.
Pak jsem se do toho pusťte a změnit být co?
B je hodnota.
>> A tak teď mám dva tady.
A pak jsme si řekli, b dostane tmp.
Opět, stejně jako zdravý rozum zkontrolujte, třetí řádek kódu je zde prostě toto
jeden, b dostane tmp.
>> A tak nakonec, co mám dělat?
Jdu do toho a změňte b jako něco, co hodnota TMP je, což je 1.
Já se nedotýkejte tmp znovu.
>> Ale teď, problém je, jakmile odkládací vrací, protože není rozdávají
zpět nějakou hodnotu, není návratu prohlášení výslovně v něm.
Co se vlastně děje?
No, v podstatě vše paměť -
OK, zřejmě guma líbí jen jedním prstem najednou -
prostě zmizí.
>> Nyní ve skutečnosti to není nejdu.
Ale můžete si ji nyní jako otazníky.
Protože je to již v současné době používají.
A nic se provádí s těmito hodnotami.
>> Takže v případě zeleného verze tento kód, co místo toho je, že
přecházel do swapu?
Tak řeší.
Takže adresa xa adresa y.
Takže když znovu říct tento příběh ještě poslední čas, a já jsem vlastně kreslit odkládací znovu,
ale s ukazateli, což je, to b je, a to je tmp, co je
ve skutečnosti uloženy v této zelené verze mého kódu, kde jsem kolem
na adresách?
>> To bude ukazatel na x.
Takže jsem mohl nakreslit šipku.
Ale pojďme používají stejné libovolná například jako předtím.
Řekněme, že je to něco jako Ox123.
A to bude, protože Ox127 je to čtyři byty pryč, protože je to
int, takže Ox127.
>> A opět, beru nějaké svobody s čísly.
Jsou mnohem menší, než by ve skutečnosti být, a v jiném pořadí.
Ale to je, jak se obraz je nyní jiný.
>> Ale když jsem se použít tuto zelenou kód a já int tmp dostat *.
* Prostředek provést následující kroky, se řešení, které je v a jít k ní,
což je 1.
A to je to, co jsem pak dal do tmp.
Mezitím se na dalším řádku kódu zde * dostane b, co to znamená?
>> No, *, tak jděte sem dostane * b, což znamená, že se tam.
A to znamená, dát hodnotu tam.
Konečně, poslední řádek kódu jednoduše řečeno b * dostane tmp.
>> Tak b říká, že tam a přepsat ji tmp, které je v tomto případě, bude
se opět, 1.
A to je důvod, proč zelená verze Náš kodex práce, zatímco červená
verze nikdy.
To vše jen se scvrkává na tom, jak paměť je řízena a kde je to
ve skutečnosti uložena do počítače RAM.
A teď, to je jedna z věcí, že zásobník se používá.
>> Otázky týkající se rozvržení?
Na ukazateli?
Nebo o swapu?
>> Dobře, takže malloc, odvolání, udělal něco takového.
To byl výborný jednoduchý příklad.
A to byl ten, že Binky nám představil, i když zcela
rychle, na konci hodiny.
Sakra, tam zase.
>> Takže připomenout, že to byl příklad, který Binky nám představil, i když
poněkud rychle na konci hodiny.
A tady jsme opravdu malloc podruhé.
Vzhledem k tomu, poprvé jsme ho vytvořit dostatek paměti RAM, přidělit dostatek paměti RAM
pro uložení řetězce.
>> Tentokrát Binky držel to jednoduché.
Takže je to jen k ukládání int, zřejmě.
A to je úplně v pohodě.
Je to trochu divné, upřímně řečeno, na používat malloc alokovat jeden int.
Ale bod claymation Nick byl opravdu jen vyprávět příběh o tom, co
se stane nebo nestane, když můžete týrat paměti.
>> Takže v tomto případě, tento program Udělal pár věcí.
V prvním případě se zde, se prohlašuje ukazatel s názvem x na int.
To pak deklaruje ukazatel volal y na int.
To pak uloží do x, co?
Někdo teď.
Co je uložena v X podle Třetí řádek tohoto programu?
>> DIVÁKŮ: [neslyšitelné].
>> SPEAKER 1: No, ne tak docela bajtů, za říkají.
Být přesnější teď.
Co je uložena v X?
Adresa, myslím, že jsem to slyšel.
>> Takže co malloc vrátí?
malloc behaviorálně přiděluje kus paměti.
Ale jak to umožňují přístup k ní?
Vrací co?
Adresa prvního bajtu v bloku paměti.
>> Nyní, to je super jednoduchý.
Je to jen jeden bajt, což znamená, že zabývat se dostáváme zpět je
adresa z toho všeho.
Skladovat tak v X, pak je adresa tohoto bloku paměti.
Mezitím, co se stane dál?
Takže vlastně, pojďme dál a čerpat z tohoto opravdu rychle.
>> Takže pokud projdeme na obrazovku a tady budeme hrát na to int * x a int * y
bude dělat to, co pro mě?
Tvrdím, že je to jen bude dělat něco takového a nazývat to x a
to a říkají y.
Mezitím, třetí řádek kódu je bude alokovat velikost int,
který se stane být - Omlouvám se, jestli jsem řekl, jeden předtím, než jsem chtěl jeden int -
čtyři byty na typickém počítači.
Alespoň se CS50 spotřebiče.
>> Takže to bude přidělovat to, kdo ví?
Někde tady.
A tato je uložena na některé Adresa Ox, kdo ví?
Ale to, co se děje, aby se vrátil je ta adresa.
Ale budeme kreslit to obrazově jen jako šipka takhle.
>> Nyní v dalším řádku * x dostane 42.
Co * x znamená laicky řečeno?
Jen tam.
Přejděte na tuto adresu.
Nebo jinými slovy, postupujte šipka a dát tam 42.
Ale pak se něco špatného stalo na Binky, že jo?
>> Připomeňme, že linku pět tady, * y dostane 13, opravdu nešťastné číslo,
co udělal pro nás?
No, * y znamená jít.
No, nebyla tato možnost dána hodnota ještě, že jo?
Kód nemá y je inicializován na cokoliv.
Měli jsme x inicializovány na adresu.
Ale y byl vyhlášen až vrchol.
Ale pak středník, žádná hodnota byl vlastně do něj.
Takže je to fér nazývat odpadky hodnota.
Kdo ví, co je to?
Jsou to zbytky bitů, které byly použity nějakým předchozím řádku kódu v
můj program.
>> Takže když řeknu, tam jít, je to jako, Nemám tušení, kde to je šipka
Skončím.
A to je, když se obvykle dostanete segmentation fault.
Pokud jste omylem dereference, tak mluvit, nebo přejděte na adresu, že to není
vlastně legitimní adresa, špatné věci se stávají.
>> A to je přesně to, co se stalo myslet Binky.
Takže připomenout, že příběh, který je Nick vyprávění zde byl stejný nápad jako to, co
Jsem se vypracován s iluzí křída na tabuli tam.
X a Y jsou deklarovány.
>> Pak jsme přiděleno velikost int a uložit jej do x.
Pak další řádek jsme * x.
To byl Nickův kouzelná hůlka z dereferencing.
To dal 42 do paměti poukázal x.
>> Ale to je místo, kde se věci šel strašně špatně.
Je to tak?
Snažili jsme se dereferencování y.
Ale y měl nějakou fiktivní hodnotu, ne?
>> To Šipka v levém dolním roh, není
ve skutečnosti ukazuje na cokoliv.
Je to něco, co jsem dělal jsem tady na palubě.
Tak špatné věci se stávají, segmentace chyba, nebo chyba Binky, v tomto případě.
>> Ale když jsme pak opravit, že tím x dostane y, jak ten příběh změnu?
No, když to udělám x y dostane, to je fakticky stejné, jak říká
bez ohledu na to, co Ox- bude stejný zde,
Ox-něco.
Nebo obrazově budeme kreslit šipku.
>> Tak tady na desce s Binky, s další řádek
kód * y znamená jít.
Kde je tam?
To znamená, že tady.
>> A když jsme aktualizaci, že je to 13 to prostě znamená jít a
psaní 13 tady.
Takže možná není úplně jednoduché na první pohled.
Ale shrnout a používat stejný žargon že Binky použil tady, tak
První dvě přidělit ukazatelů, x a y, ale ne pointees.
A pointees není obecně používán termín.
Ale je naprosto ukazatel.
Ale to je to, co je upozornil na podle nomenklatury Binky je.
>> Tato další řada, samozřejmě, přiděluje int pointee.
Takže kus paměti - jak jsem nakreslil více než na pravá strana existuje - a set
x rovno odkázat se na něj.
To dereferences x ukládat 42 v paměti, že je to ukázal na.
A pak, samozřejmě, byla špatná věc.
Vzhledem k tomu, y nebyl ukázal na něco ještě.
To opraví ji.
Takže je to stále buggy programu.
Jen proto, že jsme profouknutí kód řádek po řádku a říká, ach dobře,
nechat to spadnout tam.
To je špatné.
Kurz je program právě chystá přerušit úplně na tomto řádku.
Ale pokud byste chtěli odstranit havaroval linka a nahradit ji poslední dva
řádcích přiřadíte -
pomocí přiřazení ukazatele - y poukázat na x jako bod t..
A pak si dereference y ve velmi bezpečným způsobem.
>> Takže tam, kde to nás?
No, ukázalo se, že pod kapotou v CS50 knihovně ukazatele jsou
používán v celém.
A budeme skutečně začít loupat zpět tato vrstva zanedlouho.
Ale ukazuje se také, že výraz někteří z vás by mohl být znát,
zejména pohodlnější, je ve skutečnosti, že z velmi populární
webové stránky, nebo přetečení zásobníku, v těchto dnech.
>> Ale to ve skutečnosti má velmi technický význam.
Nyní víme, co stack.
Je to jako hromada zásobníků uvnitř jídelně.
>> Nebo uvnitř vašeho počítače Paměť its ty rámy
, které jsou používány funkce.
No, ukázalo se, že z důvodu, že velmi jednoduchá implementace
paměť a rámy na tzv. stack, můžete skutečně převzít kontrolu
z počítačového systému poměrně snadno.
Můžete se proniknout do systému, pokud lidé jako my nenapsal náš kód
velmi dobře.
>> Pokud se lidé jako my používají kusy paměťových nebo použití polí -
ještě častěji -
ale někdy nezapomeňte zkontrolovat Hranice naší nabídku, jak si můžete
Nechat se někdy, a opakoval příliš daleko za koncem pole.
V nejlepším případě je váš program může jen pád.
Segmentation fault, druh trapné.
Nic moc, ale není to nezbytně velmi špatné.
>> Ale pokud váš program je vlastně v reálném počítače uživatelů, pokud je to běh
na internetových stránkách, že skutečné náhodné občany, na internetu se bít, pronájem
lidí vyvolat špatné věci ve vašem kódu obecně není dobrá věc, protože
to znamená, že příležitost k ovládání z počítače.
A to bude vypadat trochu záhadný.
Ale já jsem myslel, že bych tě vyděsit se Tento poslední příklad zde.
>> Zde je příklad kódu.
A je to dobrý Wikipedia článek, který prochází
to podrobněji.
Mám hlavní na spodní povolání foo, procházející v argv dne 1..
A to jen proto, že můžete spustit program a předat
libovolný vstup.
>> A pak foo oznámeny až nahoře jak přijímat řetězec, nebo více
přesně, char *.
To pak deklaruje pole znaků.
Nazvěme to buffer, obecněji, o velikosti 12.
Takže 12 znaků vejde dovnitř tohoto pole s názvem C.
>> A pak se to používá tuto novou funkci, který je nový, ale není těžké
Rozumím, paměti kopii.
To zkopíruje paměť z baru, který byl proměnná n minulosti, bez ohledu na
uživatel zadat do argv 1 do cca.
Kolik bajtů?
Délka řetězce baru.
>> Takže jinými slovy, v případě, že uživatel zadá h-e-l-l-o enter, délka řetězce
z ahoj je pět.
Takže pět z těchto bytů bude mít zkopírovány do pole s názvem C, což
je o velikosti 12.
Ale to, co uživatel zadá mnohem déle Slovo, které je 13 znaků nebo 14
znaků nebo 100 nebo více znaků?
>> Kam se chystají jít?
No, to rám, že je zásobník v jídelně zásobníku,
jdou tam jít.
A je to jen začnou přepisovat další věci, které už
na tomto zásobníku, přetékající zásobník, abych tak řekl.
>> Takže obrazně, myslím, že to takhle.
To je jen barevné verze obrázek jsme byli kreslení.
V dolní části, řekněme, je hlavní.
A na vrcholu, co vidíte teď Rám je, barevně značená nyní, pro
volána funkce foo.
Ale co je zajímavé, o foo je, že tady je jeho rám.
Takže je vypracován tak jako já udělal, ale ve světle modré barvě.
A teď to je místo, kde c držák 0 jde.
A to je místo, kde c držák 11 se chystá skončit.
>> Jinými slovy, to se stane může být reprezentován jako čtverce.
Ale pokud si jen udržet plopping bajtů dolů - nebo znaky - jdou až do konce
se na místě 0 až nahoru na 11, protože je to 0 indexovány.
>> Ale kde je 13. znak Skončím?
Kde je 14?
Kde je 50. znak Skončím?
>> Bude to dál dolů.
Protože i když jsme vypracovány obraz s zásobníku vyrůstal,
adresy, to dopadá, jít od malé adresy, malé
ukazatele, na velkých adresy.
Tak to prostě pořád jít výš a výš.
>> Takže v případě, že uživatel zadá Dobrý den, to je skvělé.
Žádný problém, žádný problém, každý je v bezpečí.
Ale v případě, že uživatel zadá, co budeme zavolejte kontradiktorní kód, zastoupená
druhově jako, útok, útok, Útok, útok, může, co se stalo?
>> No, pokud jsou všechny vstupu, že uživatel zadali není jen nějaký přátelský
nebo urážlivé řetězec znaků.
Je to vlastně posloupnost znaků že pokud si ji pořídil,
to vlastně je kód.
Možná je to kód, který odstraní všechny soubory na vašem pevném disku nebo odesílá spam
nebo něco takového.
Všimněte si, že to, co je klíčové je to, že v případě, že špatný člověk má to štěstí, že
přepsat červený kus paměti -
které jsem nevytáhl na mém obrázku, ale tento obrázek Wikipedia zde má -
jeho tzv. zpáteční adresa.
>> Když jídlo vrací, když swapové přiznání, jak se počítač vědět, jít od
se sem tady dole?
Nebo v tech segmentu nahoře, jak to vím, jít ze swapu
kód - 0 a 1 je , které tvoří odkládací -
Zpět na hlavní stranu?
K dispozici je tzv. zpáteční adresa uloženy ve stejném zásobníku rám, na
stejné jídelna zásobník.
>> Takže v případě, že padouch je natolik chytrý, aby vložte kód útoku, útok kód, útok
kód a získat štěstí -
často prostřednictvím pokusů a omylů - do přepsat červené zpáteční adresu,
s adresou a oznámení na samý vrchol.
Všimněte si, 0835C080.
Je napsán zpět nahoru nahoru pro Důvody budeme snad znovu.
Je to, že číslo.
>> Takže pokud padouch dostane štěstí nebo je dost chytrý, aby přepsat červená
pás z paměti s adresou Kód, který on nebo ona má nějak
vstřikuje do počítače, myslím, jehož kód bude vrácena
jakmile foo se provádí spuštěním?
>> Padoucha v code.
Takže ten útok kódu, AAA, znovu, možná odesílání nevyžádané pošty, může odstranit všechny soubory
na pevném disku.
Ale to je to, co skutečně přetečení zásobníku je, nebo přetečení vyrovnávací paměti, nebo
buffer overflow útok.
>> A je to neuvěřitelně, neuvěřitelně časté k tomuto dni s programy napsané v
C, C + +, a dokonce i některé další jazyky.
Na tomto děsivé vědomí, budeme končí vtip.
>> [Smích]
>> Uvidíme se ve středu.
Na další CS50 -
Takže jsem vše z disku lamp, ale dnes počkejte, odtučněné mléko, polovina telefon
kniha, pomerančový džus že jsem pil dnes.
USB kabel, klíč.
>> [Přehrávání hudby]