1 00:00:00,000 --> 00:00:11,242 >> [Přehrávání hudby] 2 00:00:11,242 --> 00:00:16,630 >> David J. Malan: Tak to je CS50 a to je začátek týdne pět. 3 00:00:16,630 --> 00:00:21,480 Takže dnes, pod svým sedáků, nenajdete nic. 4 00:00:21,480 --> 00:00:24,790 Ale především, měli byste si najít to, malý projev našeho uznání za 5 00:00:24,790 --> 00:00:26,970 všechny práce, které jste vložili do hry patnácti. 6 00:00:26,970 --> 00:00:30,290 Jednoduše odstraňte malý kruh na Spodní začít hrát 7 00:00:30,290 --> 00:00:31,680 Zbytek třídy. 8 00:00:31,680 --> 00:00:38,930 >> Takže připomínám, že ani vědět, že nastavení problém čtyři, který vyšel tento víkend, 9 00:00:38,930 --> 00:00:40,340 zahrnuje psát další hru. 10 00:00:40,340 --> 00:00:43,740 Ale tentokrát to zahrnuje použití Aktuální grafické uživatelské rozhraní, a to 11 00:00:43,740 --> 00:00:46,310 textové rozhraní, jako Hra Fifteen. 12 00:00:46,310 --> 00:00:50,210 A hra, která leží před vámi, pokud jste ještě neviděl to dál, 13 00:00:50,210 --> 00:00:52,310 Vypadá trochu něco takového. 14 00:00:52,310 --> 00:00:55,170 Chystám se jít do mého terminálu okna tady v GDB. 15 00:00:55,170 --> 00:00:58,600 A já jdu dopředu a spusťte personál řešení, které můžete přistupovat 16 00:00:58,600 --> 00:01:01,010 Po spuštění aktualizace 50 jako obvykle. 17 00:01:01,010 --> 00:01:04,090 >> Ale já jdu dát do trochu tajný režim, trochu velikonoční vajíčko, 18 00:01:04,090 --> 00:01:08,480 tzv. nesmrtelnost, by uvedení Boha argv1. 19 00:01:08,480 --> 00:01:12,920 A musím řídit své vlastní pokyny, běží to v mé vlastní 20 00:01:12,920 --> 00:01:14,220 problém nastavit adresář. 21 00:01:14,220 --> 00:01:19,190 Takže teď vidíte kompletní verzi ze hry Breakout. 22 00:01:19,190 --> 00:01:21,090 Ve skutečnosti je to ne-ruce režim. 23 00:01:21,090 --> 00:01:24,850 Takže je to vlastně - 24 00:01:24,850 --> 00:01:26,470 ohromeni když může být - 25 00:01:26,470 --> 00:01:30,850 docela triviální realizovat Boha režim, ve Breakout, na rozdíl od hry patnácti, 26 00:01:30,850 --> 00:01:33,590 které někteří z vás mohli řešit pro hackera vydání. 27 00:01:33,590 --> 00:01:37,890 >> V Breakout postačuje v Boha Režim prostě dělat to, co, 28 00:01:37,890 --> 00:01:41,220 intuitivně s pádlem? 29 00:01:41,220 --> 00:01:45,630 Jen se to rovná bez ohledu na vodorovná poloha je míč. 30 00:01:45,630 --> 00:01:49,220 A tak dlouho, jak si to jako jeden muž se míč v pohybu tato hra 31 00:01:49,220 --> 00:01:53,100 Nikdy, nikdy, nikdy ujít míč a budete pokaždé vyhrát. 32 00:01:53,100 --> 00:01:55,430 >> Ale v tomto týdnu hacker vydání je to víc než jen režim Boha. 33 00:01:55,430 --> 00:01:56,720 K dispozici je celá řada dalších funkcí. 34 00:01:56,720 --> 00:01:58,140 Mezi nimi, lasery. 35 00:01:58,140 --> 00:02:01,070 Takže pokud jste opravdu netrpělivý si může začít sestřelení cihly 36 00:02:01,070 --> 00:02:02,120 a několik dalších. 37 00:02:02,120 --> 00:02:04,560 A pro ty z vás, kteří by chtěli kalibraci standardu oproti Hacker 38 00:02:04,560 --> 00:02:08,750 vydání, vidím, že tento týden hacker vydání záměrně je 39 00:02:08,750 --> 00:02:12,830 trochu proveditelné, řekněme, než Bůh Režim byl s Game of Fifteen. 40 00:02:12,830 --> 00:02:15,300 >> Takže pokud hledáte úseku a hledáte nějakou další zábavu 41 00:02:15,300 --> 00:02:18,400 vlastnosti se potápět v případě zájmu. 42 00:02:18,400 --> 00:02:21,280 Nyní více prakticky, dovolte mi připomenout, na jednu věc stejně. 43 00:02:21,280 --> 00:02:24,780 GDB, který někteří z vás nemusí mít ještě dotkla osobně, což je v pořádku. 44 00:02:24,780 --> 00:02:28,530 Ale teď je opravdu čas si zvyknout na to a pohodlně s tímto nástrojem 45 00:02:28,530 --> 00:02:31,510 , protože to bude vaše životy mnohem jednodušší, opravdu. 46 00:02:31,510 --> 00:02:34,900 >> Na přednášce Roba o GDB pár týdny, vzpomínám 47 00:02:34,900 --> 00:02:36,810 že GDB je debugger. 48 00:02:36,810 --> 00:02:41,230 Je to nástroj, který vám umožní spouštět vaše Program ale nechte ji krok za krokem, řádek 49 00:02:41,230 --> 00:02:45,680 po řádku, takže můžete hrabat kolem sebe, takže vidíte, co se děje, a tak 50 00:02:45,680 --> 00:02:47,310 které si můžete vytisknout hodnoty proměnných. 51 00:02:47,310 --> 00:02:50,580 Stručně řečeno, to vám dává mnohem víc energie než printDef dělá. 52 00:02:50,580 --> 00:02:52,900 >> Nyní sice rozhraní je dost tajemný. 53 00:02:52,900 --> 00:02:55,180 Černá a bílá textové rozhraní z větší části. 54 00:02:55,180 --> 00:02:57,400 Příkazy jsou poněkud těžké pamatovat na prvním místě. 55 00:02:57,400 --> 00:03:01,230 Ale i když to může trvat do poloviny hodina, hodina, aby to předem 56 00:03:01,230 --> 00:03:02,940 investice času na to, věř mi. 57 00:03:02,940 --> 00:03:06,440 Jistě by semestru nakonec ušetří jste řádově více 58 00:03:06,440 --> 00:03:07,600 času než to. 59 00:03:07,600 --> 00:03:09,200 >> Takže na začátku týdne ponoru palců 60 00:03:09,200 --> 00:03:13,200 A co se týče Breakout, vím, že jste může to tak dlouho, dokud budete mít 61 00:03:13,200 --> 00:03:18,230 distribuce kód nebo vlastní kód Probíhá ve vaší Pst4 adresáře. 62 00:03:18,230 --> 00:03:21,680 Vězte, že můžete spustit gdb. / Breakout. 63 00:03:21,680 --> 00:03:23,490 >> To bude otevírat okno takhle. 64 00:03:23,490 --> 00:03:25,530 Dovolte mi, abych sám sebe více z terminálu. 65 00:03:25,530 --> 00:03:27,770 A co pak budu pokračovat a dělat, že to není jen spustit. 66 00:03:27,770 --> 00:03:30,690 Chystám se nejprve nastavit bod přerušení Připomeňme, který umožňuje pozastavit 67 00:03:30,690 --> 00:03:32,500 provedení na určitém místě. 68 00:03:32,500 --> 00:03:35,750 >> Jen aby to jednoduché jdu rozbít na lince jedna pouhým zadáním 69 00:03:35,750 --> 00:03:37,000 číslo jedna. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Dovolte mi, abych vlastně znovu otevřít toto okno protože je to stále 72 00:03:43,250 --> 00:03:45,700 malý malý tam. 73 00:03:45,700 --> 00:03:53,270 Takže to, co jsem teď dělat je zde když otevřou své okno terminálu. 74 00:03:53,270 --> 00:03:53,910 Pojď, jdeme na to. 75 00:03:53,910 --> 00:03:59,850 >> Takže teď, pokud se vrátím do Dropbox, Pst4 a spustit gdb. / breakout vstoupit, všimněte si, 76 00:03:59,850 --> 00:04:02,600 Chystám se zlomit jeden pro nastavení bod zlomu na lince jedna. 77 00:04:02,600 --> 00:04:04,840 A teď jdu dopředu a typ spuštění. 78 00:04:04,840 --> 00:04:07,370 A když se mi to, všimněte si, nic Zdá se, že se stalo. 79 00:04:07,370 --> 00:04:08,120 >> Neexistuje žádný pop-up. 80 00:04:08,120 --> 00:04:09,790 Neexistuje žádný grafický uživatelské rozhraní ještě. 81 00:04:09,790 --> 00:04:13,340 Ale to je pochopitelné, protože jsem doslova na lince jedna v mém programu. 82 00:04:13,340 --> 00:04:17,110 A všimněte si, že jsem se rychle předána, konkrétně se na 62, protože všechny 83 00:04:17,110 --> 00:04:20,600 věci v horní části tohoto souboru je věci jako připomínky a konstant a 84 00:04:20,600 --> 00:04:22,460 nezajímavé věci pro teď. 85 00:04:22,460 --> 00:04:25,840 >> Takže teď jsem uvnitř hlavní, Zdá se, že na řádku 62. 86 00:04:25,840 --> 00:04:27,960 A to je jen rozdělení kód odvolání. 87 00:04:27,960 --> 00:04:33,810 Když otevřu můžete jít, podobně, do mého rozevíracího seznamu adresáře do Pst4, 88 00:04:33,810 --> 00:04:35,450 do breakout.c. 89 00:04:35,450 --> 00:04:40,670 A kdybych přejděte dolů a dolů a dolů, a nech mě jít dopředu a zapnout 90 00:04:40,670 --> 00:04:44,990 moje čísla řádků. 91 00:04:44,990 --> 00:04:50,300 >> Co uvidím, jestli bych přejděte na linka 62 je přesně ten řádek, který 92 00:04:50,300 --> 00:04:50,910 jsme se zastavil na. 93 00:04:50,910 --> 00:04:53,720 Takže tento řádek zde, 62, je kde se chystáme být. 94 00:04:53,720 --> 00:04:57,470 Takže teď v GDB, když půjdu napřed a zadejte teď další, zadejte, že to bude 95 00:04:57,470 --> 00:04:58,450 provedení tohoto řádku. 96 00:04:58,450 --> 00:05:00,610 A voila, máme tzv. g okno. 97 00:05:00,610 --> 00:05:02,800 Pokud obeznámeni s tím, co GWindow je, ne se bát. 98 00:05:02,800 --> 00:05:05,740 Spec vás seznámí s tím, jak stejně jako počet Walkthrough videa 99 00:05:05,740 --> 00:05:06,830 vložené do spec. 100 00:05:06,830 --> 00:05:08,610 >> Ale teď pojďme udělat to trochu zajímavější. 101 00:05:08,610 --> 00:05:10,960 Dovolte mi, abych přesunout okno na na stranu trochu. 102 00:05:10,960 --> 00:05:13,480 Dovolte mi, abych oknu trochu větší, takže vidím víc. 103 00:05:13,480 --> 00:05:16,140 >> A teď mi dovolte pokračovat a dál znovu. 104 00:05:16,140 --> 00:05:17,550 A tam jsou mé cihly. 105 00:05:17,550 --> 00:05:20,490 Když píšu další zase teď vidím míč. 106 00:05:20,490 --> 00:05:23,520 A když píšu další zase teď vidím, pádlo. 107 00:05:23,520 --> 00:05:26,690 >> A naštěstí to gedit není Opravdu spolupráci tím, že ukazuje mi 108 00:05:26,690 --> 00:05:27,660 všechno, co chci. 109 00:05:27,660 --> 00:05:30,820 Ale teď když mám dělat dál znovu, další zase, já jsem jen 110 00:05:30,820 --> 00:05:32,260 deklarování některé proměnné. 111 00:05:32,260 --> 00:05:34,750 A mohu vytisknout jednu z těchto kluků. 112 00:05:34,750 --> 00:05:37,170 Tisk cihly, tisky životech. 113 00:05:37,170 --> 00:05:39,910 >> A teď když jsem v tom pokračovat další, všimněte si, že budu 114 00:05:39,910 --> 00:05:40,870 Uvnitř této smyčky. 115 00:05:40,870 --> 00:05:43,380 Ale kód bude provádět přesně tak, jak jsem čekat. 116 00:05:43,380 --> 00:05:45,810 Takže když jsem narazila tuto funkci, počkejte Pro Click, že to bude dělat 117 00:05:45,810 --> 00:05:46,830 doslova, že. 118 00:05:46,830 --> 00:05:48,870 Tak jsem zřejmě ztratil kontrolu na programu. 119 00:05:48,870 --> 00:05:50,480 >> GDB není, že mi další řádek. 120 00:05:50,480 --> 00:05:51,500 Ale ne se bát. 121 00:05:51,500 --> 00:05:53,720 Přejděte na svou hru, klepněte kamkoli. 122 00:05:53,720 --> 00:05:56,270 >> A voila, nyní pokračuje na linku 86. 123 00:05:56,270 --> 00:05:59,460 Takže znovu, je to neocenitelná, nakonec, pro ladění problémů. 124 00:05:59,460 --> 00:06:03,050 Protože můžete doslova procházet Váš kód, tiskové věci a mnohem, 125 00:06:03,050 --> 00:06:03,640 mnohem více. 126 00:06:03,640 --> 00:06:07,210 Ale teď, tyto nástroje samy o sobě by vám dost daleko. 127 00:06:07,210 --> 00:06:10,050 >> Takže jsme, samozřejmě, že pohled Grafika na teď, všichni najednou. 128 00:06:10,050 --> 00:06:12,350 A teď náš svět je trochu zajímavější. 129 00:06:12,350 --> 00:06:15,680 A víš, možná z některých Videa online, které máme tyto 130 00:06:15,680 --> 00:06:18,280 šortky, které jste sledovali jako součást základní problémové okruhy. 131 00:06:18,280 --> 00:06:20,460 >> A že jsem byl zastřelen, a to úmyslně, proti bílému pozadí. 132 00:06:20,460 --> 00:06:23,380 A některé z nich mají výuku Fellows kreslení nějaký text na 133 00:06:23,380 --> 00:06:25,490 Obrazovka, která je překryta na jejich vnitřní straně. 134 00:06:25,490 --> 00:06:27,760 Ale samozřejmě, je to, že ne všechny zajímavé, v reálném světě. 135 00:06:27,760 --> 00:06:30,520 To je jen přednáškový sál s velká bílá obrazovka a pozadí. 136 00:06:30,520 --> 00:06:33,330 A náš úžasný produkční tým třídění ze je všechno sluší 137 00:06:33,330 --> 00:06:36,620 po faktu oříznutí z nebo překrývání nic 138 00:06:36,620 --> 00:06:37,840 děláme, nebo nechceme. 139 00:06:37,840 --> 00:06:41,560 >> Teď už jen stačí motivovat tento týden Opravdu, kam můžete jít, nakonec, 140 00:06:41,560 --> 00:06:42,560 s informatice. 141 00:06:42,560 --> 00:06:44,260 Nejen po problému nastavit čtyři. 142 00:06:44,260 --> 00:06:48,240 Ale po jiném kurzu nebo celého Kurikulum je to úžasné, co všechno můžete 143 00:06:48,240 --> 00:06:51,090 dělat v těchto dnech, pokud jde o grafika zvláště. 144 00:06:51,090 --> 00:06:53,440 >> Někteří z vás možná viděli toto teče kolem on-line. 145 00:06:53,440 --> 00:06:56,240 Ale myslel jsem, že ukážu, jen za pár minut, letmý pohled na to, co 146 00:06:56,240 --> 00:07:01,890 výpočetní techniky a co CGI, počítačová grafika může dělat v těchto dnech 147 00:07:01,890 --> 00:07:04,510 se známým píseň a možná i film. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LANA DEL RAY, "Mladá a krásná] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: Je to jen trochu úžasný, snad, jak 151 00:10:52,470 --> 00:10:52,857 všudypřítomný - 152 00:10:52,857 --> 00:10:57,040 >> [APPLAUSE] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Stáhnul jsem si to. 154 00:10:59,230 --> 00:11:02,920 Ale je to opravdu úžasné, myslím, že právě jak všudypřítomný software a kód a 155 00:11:02,920 --> 00:11:04,230 nástroje, jako je to ve skutečnosti. 156 00:11:04,230 --> 00:11:07,685 Takže je to chuť směru ve kterém můžete jít. 157 00:11:07,685 --> 00:11:10,620 Oh, ne více zařízení dnes. 158 00:11:10,620 --> 00:11:14,640 No, to je skutečně tragická načasování vzhledem k bodu jsem se snažil udělat. 159 00:11:14,640 --> 00:11:18,670 >> Dobře, tak se pojďme spustit Fusion znovu. 160 00:11:18,670 --> 00:11:20,800 Připomenout později. 161 00:11:20,800 --> 00:11:24,190 Dobře, a měli byste se dostali email jako stranou, pokud jste si 162 00:11:24,190 --> 00:11:25,460 Všimněte si takhle. 163 00:11:25,460 --> 00:11:29,940 Dobře, takže připomínám, že minulý týden jsme začali oloupejte to 164 00:11:29,940 --> 00:11:31,380 později známý jako řetězec. 165 00:11:31,380 --> 00:11:34,700 >> string připomíná datový typ, který je prohlásil v CS50 knihovně. 166 00:11:34,700 --> 00:11:37,740 A to je část koleček že nyní začne vzlétnout. 167 00:11:37,740 --> 00:11:41,280 Byl to užitečný koncept brzy. 168 00:11:41,280 --> 00:11:43,750 Ale teď to bude získat více zajímavější a silný 169 00:11:43,750 --> 00:11:48,330 skutečně vidět, že pod kapotou řetězec je právě to, co, to jsme si řekli? 170 00:11:48,330 --> 00:11:50,500 >> Jo, je to tzv. char *. 171 00:11:50,500 --> 00:11:53,860 A * se označuje, že je nějaký druh adresu zapojit. 172 00:11:53,860 --> 00:11:58,690 A tak, když říkáte, char * stačí říct proměnná jejíž datový typ je 173 00:11:58,690 --> 00:11:59,290 ukazatel teď. 174 00:11:59,290 --> 00:12:01,770 Skutečnost, že je hvězda zde prostě znamená, že prohašuješ 175 00:12:01,770 --> 00:12:03,020 tzv. ukazatel. 176 00:12:03,020 --> 00:12:06,220 A že ukazatel bude zřejmě uložit adresu, na 177 00:12:06,220 --> 00:12:07,810 Samozřejmě, char. 178 00:12:07,810 --> 00:12:08,960 >> A teď, proč to smysl? 179 00:12:08,960 --> 00:12:11,200 No, a co je řetězec pod kapotou? 180 00:12:11,200 --> 00:12:15,130 No, nějakou dobu jsme říkali že řetězec je pod kapotou 181 00:12:15,130 --> 00:12:18,460 jen h-e-l-l-o, například. 182 00:12:18,460 --> 00:12:21,585 >> Ale my jsme o tom mluvili jako je v podstatě pole. 183 00:12:21,585 --> 00:12:25,410 A pole by pak vypadat trochu další podobné, přičemž každá z nich 184 00:12:25,410 --> 00:12:26,460 nástupu do sousto. 185 00:12:26,460 --> 00:12:28,710 A pak jsme řekli, že je tu něco zvláštního sem, 186 00:12:28,710 --> 00:12:31,270 zpětné lomítko 0 nebo null terminátor. 187 00:12:31,270 --> 00:12:35,230 >> Takže celou tu dobu, tohle je řetězec. 188 00:12:35,230 --> 00:12:38,320 Ale ve skutečnosti je řetězec vlastně adresu. 189 00:12:38,320 --> 00:12:43,210 A adresy, jak uvidíme, jsou často s předponou 0x konvencí. 190 00:12:43,210 --> 00:12:44,540 Co 0x naznačovat? 191 00:12:44,540 --> 00:12:45,970 Ví to někdo? 192 00:12:45,970 --> 00:12:47,320 >> Tak to prostě znamená, šestnáctkové. 193 00:12:47,320 --> 00:12:52,360 Takže si možná pamatujete, vlastně od PST 1. Věřím, že jedním z warm-up 194 00:12:52,360 --> 00:12:55,740 otázky vlastně ptal hexadecimální zápis kromě 195 00:12:55,740 --> 00:12:57,100 binární a desítkové. 196 00:12:57,100 --> 00:13:00,460 A motivace je, že s hexadecimální máte 16 197 00:13:00,460 --> 00:13:01,770 číslice k dispozici. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, po od a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> A pokud budete počítat všechny ty nahoru, získáte celkem 16. 200 00:13:10,430 --> 00:13:13,200 Tak to je v rozporu s desetinné číslo, kde máme 10 201 00:13:13,200 --> 00:13:14,690 číslice, 0 až devět. 202 00:13:14,690 --> 00:13:17,750 Je to v rozporu s binárním kde jsme jen 0 a 1. 203 00:13:17,750 --> 00:13:21,450 >> Ale na konci dne si můžete jen představují stejná čísla, ale 204 00:13:21,450 --> 00:13:22,500 poněkud jinak. 205 00:13:22,500 --> 00:13:25,840 A hexadecimální je časté, protože jako to dopadá - a uvidíme to 206 00:13:25,840 --> 00:13:28,790 později v průběhu - i když jsme se na webové programování v rámci 207 00:13:28,790 --> 00:13:32,100 HTML a barevné kódy, hexadecimální je pěkná. 208 00:13:32,100 --> 00:13:36,390 Protože každá číslice, ukazuje, představuje čtyři bity dokonale. 209 00:13:36,390 --> 00:13:39,280 Tak to tak nějak linek pěkně jak budeme nakonec vidět. 210 00:13:39,280 --> 00:13:44,720 Takže to může být Ox123 nebo tak něco jako to, že označuje adresa 123 211 00:13:44,720 --> 00:13:47,050 někde uvnitř mého paměti počítače. 212 00:13:47,050 --> 00:13:50,600 >> Samozřejmě, některé problémy vznikají protože toto základní 213 00:13:50,600 --> 00:13:51,520 implementace. 214 00:13:51,520 --> 00:13:55,930 A připomínám, že jsem nahodil na provádění funkce, jako je tento - 215 00:13:55,930 --> 00:14:00,260 porovnat palubní 0 dot c minulý týden, že i když to vypadalo, že to bylo 216 00:14:00,260 --> 00:14:04,270 Dobře, to prostě není v porovnání dva řetězce správně. 217 00:14:04,270 --> 00:14:07,470 >> Jsem zahodil hlavní, a já jsem hodil pryč připomínky jen zaměřit se na 218 00:14:07,470 --> 00:14:08,970 kód, který je v zájmu zde. 219 00:14:08,970 --> 00:14:10,660 A to je v červené barvě, protože je to kočárek. 220 00:14:10,660 --> 00:14:11,670 Z jakého důvodu? 221 00:14:11,670 --> 00:14:15,890 >> No, nahoře tam, když jsem prohlásil, řetězec, co se opravdu děje 222 00:14:15,890 --> 00:14:17,260 pod kapotou? 223 00:14:17,260 --> 00:14:19,530 No, dovolte mi přejít na obrazovky, a kreslit to. 224 00:14:19,530 --> 00:14:23,230 Tak jsem prohlásil znovu, řetězce s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Takže budu pokračovat a nyní kreslit s pro co to vlastně je. 226 00:14:26,640 --> 00:14:28,590 To bude čtverec tady. 227 00:14:28,590 --> 00:14:30,490 A budu tvrdit, , že to je 32 bitů. 228 00:14:30,490 --> 00:14:32,890 Alespoň to obvykle je, alespoň na CS50 229 00:14:32,890 --> 00:14:34,520 spotřebič v mnoha počítačů. 230 00:14:34,520 --> 00:14:35,980 Budu říkat to. 231 00:14:35,980 --> 00:14:39,070 >> Ale teď vzpomínám, že jsme volal GetString. 232 00:14:39,070 --> 00:14:41,430 Takže GetString vrací, Samozřejmě, řetězec. 233 00:14:41,430 --> 00:14:45,790 V případě, že uživatel zadá h-e-l-l-o zadání řetězec ahoj dostane se vrátil. 234 00:14:45,790 --> 00:14:51,010 A to řetězec, jak jsme právě řekl, končí někde v paměti počítače 235 00:14:51,010 --> 00:14:53,240 s lomítkem 0 na konci. 236 00:14:53,240 --> 00:14:56,650 Budu kreslit to jako pole - nebo souvislý blok znaků - 237 00:14:56,650 --> 00:14:58,330 že to vlastně je. 238 00:14:58,330 --> 00:15:01,790 >> A teď, co je getString vlastně vrací? 239 00:15:01,790 --> 00:15:04,340 Co GetString vracejí celou dobu? 240 00:15:04,340 --> 00:15:07,520 No, řekněme, v týdnech před, vrátí řetězec. 241 00:15:07,520 --> 00:15:10,250 Ale technicky, co dělá GetString návrat zdánlivě? 242 00:15:10,250 --> 00:15:11,610 >> Diváků: adresa. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: adresa. 244 00:15:12,600 --> 00:15:16,630 Konkrétně se vrátí adresu první sousto, ať je to cokoliv. 245 00:15:16,630 --> 00:15:18,830 Jen jsem nadále používat jednu, dvě, tři protože je to pohodlnější. 246 00:15:18,830 --> 00:15:21,380 >> Vrací adresu první znak v řetězci. 247 00:15:21,380 --> 00:15:23,510 A my jsme minulý týden uvedl, že , že je dostačující. 248 00:15:23,510 --> 00:15:26,710 Vzhledem k tomu můžeme vždy přijít na to, kde konec řetězce jen tím, že 249 00:15:26,710 --> 00:15:30,150 iterace, možná se pro smyčka nebo while, nebo něco takového 250 00:15:30,150 --> 00:15:34,990 , že jen hledá "lomítkem 0", speciální sentinel charakter. 251 00:15:34,990 --> 00:15:37,220 >> A pak víme, že řetězec se stane, že délky - 252 00:15:37,220 --> 00:15:37,980 V tomto případě - 253 00:15:37,980 --> 00:15:38,670 pět. 254 00:15:38,670 --> 00:15:43,800 Takže technicky to, co dělá GetString je vrátí Ox123 v tomto případě. 255 00:15:43,800 --> 00:15:53,670 A technicky co se stane, je pak že budeme ukládat, uvnitř s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Na konci dne, i když to je nový koncept, ukazatele, jsou 257 00:15:56,460 --> 00:15:57,350 jen proměnné. 258 00:15:57,350 --> 00:16:00,440 Ale stalo ukládat bity dohromady představují adresu. 259 00:16:00,440 --> 00:16:03,700 Takže technicky vše, co dostane uložené v s je Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Ale my jako lidé - 261 00:16:04,680 --> 00:16:06,020 včetně dnes dál - 262 00:16:06,020 --> 00:16:09,290 opravdu nebude starat, typicky, co je skutečná adresa 263 00:16:09,290 --> 00:16:10,520 nějakého kusu paměti. 264 00:16:10,520 --> 00:16:14,040 Je to jen na nízké úrovni detailu být intelektuálně zajímavé. 265 00:16:14,040 --> 00:16:15,440 Takže jdu vrátit zpět. 266 00:16:15,440 --> 00:16:19,810 A místo, více na vysoké úrovni, stačí říct že když mluvíme o ukazatele 267 00:16:19,810 --> 00:16:22,170 Budu jen kreslit více uživatelsky příjemný šipka, která vyjadřuje 268 00:16:22,170 --> 00:16:26,060 Stejný nápad a abstrakty daleko, že údaje, jaké jsou skutečné 269 00:16:26,060 --> 00:16:27,700 základní adresa. 270 00:16:27,700 --> 00:16:33,290 >> Nyní, když se vrátíme do kódu, co se stalo minulý týden, máme-li řetězec t 271 00:16:33,290 --> 00:16:34,510 rovná GetString? 272 00:16:34,510 --> 00:16:38,630 No, kdybych znovu zadejte ahoj Tentokrát budu mít 273 00:16:38,630 --> 00:16:40,460 další kus paměti. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o zpětné lomítko 0. 275 00:16:44,820 --> 00:16:48,320 >> Ale protože jsem volal getString podruhé - 276 00:16:48,320 --> 00:16:51,100 a vím, že to z pohledu na Zdrojový kód getString - i 277 00:16:51,100 --> 00:16:54,350 i když je to náhodou, že byl ahoj zadali dvakrát, GetString není 278 00:16:54,350 --> 00:16:55,890 bude snažit optimalizovat a být chytrý. 279 00:16:55,890 --> 00:16:58,550 Je to prostě dostane další kus paměť z počítače, který je 280 00:16:58,550 --> 00:16:59,640 bude na jiné adrese. 281 00:16:59,640 --> 00:17:02,330 Pojďme libovolně stačí říct 456. 282 00:17:02,330 --> 00:17:04,079 >> A potom, co se to děje vrátit? 283 00:17:04,079 --> 00:17:08,030 Bude to návrat 456 a uložte jej na t. 284 00:17:08,030 --> 00:17:12,010 Takže to, co se opravdu děje, na levá strana je mám jiný kus 285 00:17:12,010 --> 00:17:14,260 paměti, typicky 32 bitů. 286 00:17:14,260 --> 00:17:16,720 A tam se chystá jít Ox456. 287 00:17:16,720 --> 00:17:20,140 Ale znovu opakuji, nemám zájem v těchto konkrétní čísla ještě. 288 00:17:20,140 --> 00:17:23,069 Já jsem prostě jít abstraktně kreslit jako šíp. 289 00:17:23,069 --> 00:17:25,202 >> Tak to je nyní nová vysvětlení. 290 00:17:25,202 --> 00:17:28,735 Ale je to přesně stejný názor, že je dělo celou tu dobu. 291 00:17:28,735 --> 00:17:33,150 A tak důvod se tedy, že tento první verze Compare byl kočárek 292 00:17:33,150 --> 00:17:34,480 minulý týden se proč? 293 00:17:34,480 --> 00:17:38,000 Když to uděláte, pokud je rovná rovná t, co se opravdu 294 00:17:38,000 --> 00:17:40,550 pod pokličku srovnání? 295 00:17:40,550 --> 00:17:41,910 >> Ty porovnáním adresy. 296 00:17:41,910 --> 00:17:47,950 A jen intuitivně, jasně, Ox123 nebude stejné Ox456. 297 00:17:47,950 --> 00:17:49,380 Tato čísla, tyto bity jsou prostě jiné. 298 00:17:49,380 --> 00:17:53,220 >> A tak důsledně, minulý týden řekl, Zadáte různé věci, a to i v případě, že 299 00:17:53,220 --> 00:17:55,360 slova doslovně stejná. 300 00:17:55,360 --> 00:17:58,770 Tak jsme se opravit. 301 00:17:58,770 --> 00:18:00,120 Laicky řečeno, co je oprava? 302 00:18:00,120 --> 00:18:02,110 >> DIVÁKŮ: Použijte funkci. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: Použijte funkci. 304 00:18:02,870 --> 00:18:05,190 Nebo hvězdy jsou rozhodně účastní, ale použít funkci dělat co? 305 00:18:05,190 --> 00:18:05,962 >> DIVÁKŮ: Pro porovnání řetězců. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: Pro porovnání řetězců. 307 00:18:07,390 --> 00:18:11,030 Takže zásadní problém zde byl že jsem se právě s ohledem na 308 00:18:11,030 --> 00:18:15,870 Kvalita řetězců, které budou definovány srovnání jejich adresy. 309 00:18:15,870 --> 00:18:18,540 A samozřejmě to je jen hloupý nyní jednou abyste pochopili, co se děje 310 00:18:18,540 --> 00:18:19,510 pod kapotou. 311 00:18:19,510 --> 00:18:23,270 Chcete-li opravdu porovnání řetězců, zda jsou rovné tím způsobem, že lidské 312 00:18:23,270 --> 00:18:26,680 by za dva řetězce se rovná musíme porovnat jim postavu 313 00:18:26,680 --> 00:18:28,070 znak pro znak. 314 00:18:28,070 --> 00:18:30,020 >> Teď jsem mohl udělat Jedná se o velmi zdlouhavě. 315 00:18:30,020 --> 00:18:32,240 Ale důvěrně, jsme pomocí smyčky for. 316 00:18:32,240 --> 00:18:36,050 A stačí porovnat s. držák i proti t držáku i. 317 00:18:36,050 --> 00:18:39,590 Držák je i plus 1 proti t držáku i a 1, a tak dále, v 318 00:18:39,590 --> 00:18:40,580 nějaké smyčky. 319 00:18:40,580 --> 00:18:44,950 A když jsem se zjistit jakékoliv dva znaky, které se liší, nebo pokud si uvědomuji, že ooh, s je 320 00:18:44,950 --> 00:18:48,410 kratší než T nebo delší než t Já mohu okamžitě říci nepravdivé, 321 00:18:48,410 --> 00:18:49,390 že to není to samé. 322 00:18:49,390 --> 00:18:55,370 >> Ale když jsem se projít na S a T a řekl stejný, stejný, stejný, stejný, stejný, konec 323 00:18:55,370 --> 00:18:58,520 oba řetězce, mohu říci, Je pravda, že jsou stejné. 324 00:18:58,520 --> 00:19:01,040 No, naštěstí, před lety někdo napsal, že kód pro nás. 325 00:19:01,040 --> 00:19:03,790 >> A oni říkali StrComp pro řetězec porovnání. 326 00:19:03,790 --> 00:19:11,900 A i když je to trochu proti intuitivní, StrComp vrátí 0, pokud jsou 327 00:19:11,900 --> 00:19:14,520 dva řetězce, s a t jsou stejné. 328 00:19:14,520 --> 00:19:18,090 Ale vrátí zápornou hodnotu, pokud je by měla přijít před t abecedně nebo 329 00:19:18,090 --> 00:19:20,610 kladná hodnota, pokud by měla přijít po t abecedně. 330 00:19:20,610 --> 00:19:24,030 >> Takže pokud jste někdy chtěli uspořádat něco, ukázalo se, že je užitečné StrComp. 331 00:19:24,030 --> 00:19:26,660 Protože to není jen říct, ano nebo ne, která se rovná nebo ne. 332 00:19:26,660 --> 00:19:30,440 To vám dává pocit objednávání podobně jako ve slovníku sílu. 333 00:19:30,440 --> 00:19:33,770 Takže StrComp, s čárka t se rovná 0 znamená, že se rovná 334 00:19:33,770 --> 00:19:35,200 Řetězce jsou opravdu stejné. 335 00:19:35,200 --> 00:19:38,680 Protože ten, kdo napsal tuto funkci lety pravděpodobně použita pro smyčce 336 00:19:38,680 --> 00:19:42,840 nebo while, nebo něco takového integrovat nad znaky znovu 337 00:19:42,840 --> 00:19:45,270 a znovu a znovu. 338 00:19:45,270 --> 00:19:47,300 >> Ale problém dvě století zde vyrostla. 339 00:19:47,300 --> 00:19:48,750 To bylo copy0.c. 340 00:19:48,750 --> 00:19:51,680 A dva červeně je protože to je chybný. 341 00:19:51,680 --> 00:19:52,800 A co tady děláme? 342 00:19:52,800 --> 00:19:54,310 No, nejdřív jsem volal getString. 343 00:19:54,310 --> 00:19:56,255 A já uložena návratovou hodnotu v sekundách. 344 00:19:56,255 --> 00:20:00,260 Tak to je skoro stejné jako tato horní část obrazu. 345 00:20:00,260 --> 00:20:01,490 >> Ale to, co přijde potom? 346 00:20:01,490 --> 00:20:04,980 No, dovolte mi jít dopředu a zbavit z celé banda to. 347 00:20:04,980 --> 00:20:09,650 Budeme dozadu v čase, kdy jsme právě mají s, který je nyní v souladu s 348 00:20:09,650 --> 00:20:10,940 linka jeden tam. 349 00:20:10,940 --> 00:20:11,400 >> I zkontrolovat. 350 00:20:11,400 --> 00:20:13,450 Pokud je rovná rovná 0. 351 00:20:13,450 --> 00:20:18,670 Teď rychle okrajová poznámka, když může vrátit GetString 0? 352 00:20:18,670 --> 00:20:19,580 K dispozici je dostatek paměti. 353 00:20:19,580 --> 00:20:19,880 Je to tak? 354 00:20:19,880 --> 00:20:22,310 >> Je to vzácné, že se to stane, Určitě na počítači, který je 355 00:20:22,310 --> 00:20:24,740 mám stovky megs nebo dokonce giga RAM. 356 00:20:24,740 --> 00:20:27,080 Ale mohlo by, teoreticky, vrátí 0, a to zejména v případě, že 357 00:20:27,080 --> 00:20:28,080 uživatel nespolupracuje. 358 00:20:28,080 --> 00:20:31,640 Existuje způsob, jak předstírat, že nemáte Zadaný cokoliv a trik 359 00:20:31,640 --> 00:20:34,100 GetString k návratu 0 efektivně. 360 00:20:34,100 --> 00:20:35,470 >> Takže to bude kontrolovat, že. 361 00:20:35,470 --> 00:20:39,430 Protože pokud někdo z vás začaly se již, segmentace poruchy - 362 00:20:39,430 --> 00:20:42,280 který byl pravděpodobně zdrojem nějaké frustrace - 363 00:20:42,280 --> 00:20:46,150 ty jsou téměř vždy výsledkem paměti související chyby. 364 00:20:46,150 --> 00:20:50,440 Nějak si zpackal s ohledem na ukazatel, i když jste si neuvědomil, 365 00:20:50,440 --> 00:20:51,530 byl ukazatel. 366 00:20:51,530 --> 00:20:55,260 Takže můžete mít vyvolané segmentaci chyby jsou již první týden pomocí 367 00:20:55,260 --> 00:21:02,100 něco jako pro smyčce nebo ve stavu smyčka a pole tím, že jde příliš daleko 368 00:21:02,100 --> 00:21:05,900 kolem hranice některých pole, které jste deklarovali v týdnu dva v 369 00:21:05,900 --> 00:21:06,690 zvláště. 370 00:21:06,690 --> 00:21:09,220 >> Můžete to udělat i problém nastavit čtyři s Breakout. 371 00:21:09,220 --> 00:21:12,910 I když jste možná ještě neviděli všechny hvězdy v distribuční kódu pro 372 00:21:12,910 --> 00:21:17,410 Breakout, se ukazuje, že ti, GRect a GOval a jiné takové věci, 373 00:21:17,410 --> 00:21:19,650 ty jsou vlastně ukazatele pod kapotou. 374 00:21:19,650 --> 00:21:23,430 >> Ale Stanford, stejně jako my, tak nějak kůží který podrobně uvede přinejmenším pro knihovny 375 00:21:23,430 --> 00:21:26,540 účely, stejně jako my řetězce a char *. 376 00:21:26,540 --> 00:21:30,060 Ale GRect a GOval a všechny z nich co vy jste, nebo bude používat 377 00:21:30,060 --> 00:21:32,630 Tento týden jsou nakonec adresy paměti. 378 00:21:32,630 --> 00:21:33,650 Prostě to nevím. 379 00:21:33,650 --> 00:21:37,240 >> Takže to není divu, snad, že byste mohli zakopnout některé 380 00:21:37,240 --> 00:21:38,580 segmentace chyby. 381 00:21:38,580 --> 00:21:41,290 Ale co je zajímavé, tady, pokud poté, co zkontrolovat, co děláme 0 382 00:21:41,290 --> 00:21:43,460 string t dostane s. 383 00:21:43,460 --> 00:21:44,690 No, dovolte mi prohlásit t. 384 00:21:44,690 --> 00:21:47,730 Chystám se kreslit jako čtverec, 32 bitů, říkají t. 385 00:21:47,730 --> 00:21:49,740 A pak budu dělat, dostane s. 386 00:21:49,740 --> 00:21:51,130 >> No, co to znamená? 387 00:21:51,130 --> 00:21:53,280 No, je to trochu těžké, že o tom si představit moudré. 388 00:21:53,280 --> 00:21:55,025 Ale pojďme přemýšlet o tom, to, co je uvnitř X? 389 00:21:55,025 --> 00:21:59,430 Co je doslova uvnitř této proměnné? 390 00:21:59,430 --> 00:22:01,500 Hodnota Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Takže když řeknu, string t dostane s, že právě doslovně znamená vzít číslo 392 00:22:05,815 --> 00:22:10,070 v s, což je Ox123 a dát to Ox123. 393 00:22:10,070 --> 00:22:13,740 Nebo obrazově, když jsem trochu abstraktní od toho, že má informaci 394 00:22:13,740 --> 00:22:16,600 Vliv doslova dělat to také. 395 00:22:16,600 --> 00:22:22,110 >> Takže teď, myslím, že zpět do minulého týdne, kdy jsme přistoupili k kapitalistického T. I 396 00:22:22,110 --> 00:22:23,800 to T držák 0. 397 00:22:23,800 --> 00:22:27,150 No, T držák 0, i když je to ukazatel, můžete zacházet, jako by 398 00:22:27,150 --> 00:22:29,220 je to pole, s náměstí držák notace. 399 00:22:29,220 --> 00:22:31,550 >> Tak kde je T držák 0? 400 00:22:31,550 --> 00:22:32,990 No, je to h. 401 00:22:32,990 --> 00:22:36,800 A tak když jsme se použít tento řádek kódu, dvě horní, která je v tomto c type.h 402 00:22:36,800 --> 00:22:38,460 hlavičkový soubor, to je místo, kde to prohlásil. 403 00:22:38,460 --> 00:22:44,410 Jste vydělávání tuto H. Ale Samozřejmě, že je to přesně stejný h to 404 00:22:44,410 --> 00:22:46,540 uvnitř s, abych tak řekl. 405 00:22:46,540 --> 00:22:51,930 A tak teď jste změnili nebo Aktivace původní i 406 00:22:51,930 --> 00:22:53,120 tzv. kopie. 407 00:22:53,120 --> 00:22:56,620 Protože jste neudělali kopii v způsobem, že člověk by chtěl, aby to bylo. 408 00:22:56,620 --> 00:22:59,710 >> Takže to, co bylo tady fix, v copy1.c minulý týden? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funkce, takže jsme mohli vlastně kopírovat řetězec. 411 00:23:05,580 --> 00:23:08,700 A v podstatě, co musíme udělat, aby se kopírovat řetězec? 412 00:23:08,700 --> 00:23:12,070 >> No, v tomto zeleném provedení zde jsem dělat to poměrně nízké úrovni. 413 00:23:12,070 --> 00:23:14,260 Tam jsou vlastně funkce by mohly pomoci s tímto. 414 00:23:14,260 --> 00:23:17,710 Ale ty základní, a nejvíce zná jeden, alespoň bude brzy 415 00:23:17,710 --> 00:23:19,600 známe, je následující - 416 00:23:19,600 --> 00:23:21,910 takže je na prvním řádku kódu v zeleném teď. 417 00:23:21,910 --> 00:23:23,970 >> Jen jsem přepsal s jako char *. 418 00:23:23,970 --> 00:23:25,250 Není funkční rozdíl tam. 419 00:23:25,250 --> 00:23:28,790 Jen jsem zahodil CS50 knihovny a Volám to, co je, char *. 420 00:23:28,790 --> 00:23:31,640 >> Nyní tečka, tečka, tečka, protože tam byly některé kontrola chyb, že to není 421 00:23:31,640 --> 00:23:33,200 zajímavé povídání o znovu. 422 00:23:33,200 --> 00:23:34,710 Takže teď t je deklarována. 423 00:23:34,710 --> 00:23:35,780 To je také char *. 424 00:23:35,780 --> 00:23:38,280 Tak jsem vytáhl malý čtverec na obrazovka jako předtím. 425 00:23:38,280 --> 00:23:41,870 >> Ale na pravé straně, malloc, jsme si řekli, je paměť alokovat. 426 00:23:41,870 --> 00:23:44,130 Takže přidělit nějaký kus paměti. 427 00:23:44,130 --> 00:23:48,830 A kolik bajtů my vlastně chcete vyhradit, to vypadá? 428 00:23:48,830 --> 00:23:50,340 >> No, délka řetězce s. 429 00:23:50,340 --> 00:23:52,310 Takže pokud je to ahoj to je bude pět. 430 00:23:52,310 --> 00:23:53,950 Řekneme, že h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Takže pět bajtů. 432 00:23:55,090 --> 00:23:57,960 >> Ale pak navíc 1, proč jeden? 433 00:23:57,960 --> 00:23:58,830 0 charakteru. 434 00:23:58,830 --> 00:24:03,640 Nebudeme-li ponechat prostor pro toho chlapa jsme může náhodně vytvořit situaci, 435 00:24:03,640 --> 00:24:05,600 kde řetězec je h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 A pak příště GetString je volal a já zadejte například 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, který počítač bude myslet si, že to je vlastně 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d, protože tam bez přerušení mezi těmito slovy. 439 00:24:18,900 --> 00:24:19,810 >> Takže musíme tu pauzu. 440 00:24:19,810 --> 00:24:20,720 Takže nechceme pět. 441 00:24:20,720 --> 00:24:22,100 Chceme šest bajtů. 442 00:24:22,100 --> 00:24:23,110 >> A bajtů říkám. 443 00:24:23,110 --> 00:24:25,220 Ale je to opravdu čas velikost char. 444 00:24:25,220 --> 00:24:28,040 Technicky char je téměř vždy jeden byte. 445 00:24:28,040 --> 00:24:31,030 >> Ale jen proto, aby náš kód přenosné, abych tak řekl, tak, že to funguje na 446 00:24:31,030 --> 00:24:33,750 různých počítačů, i když by mohli být poněkud odlišný pod 447 00:24:33,750 --> 00:24:36,590 kapuce, budu obecně říci velikost char, aby 448 00:24:36,590 --> 00:24:37,660 můj kód vždy funguje. 449 00:24:37,660 --> 00:24:40,610 A nemám překompilovat to jen protože jsem upgradovat svůj počítač nebo pomocí 450 00:24:40,610 --> 00:24:42,140 nějaké jiné platformě. 451 00:24:42,140 --> 00:24:45,300 >> Tak jsem dostal 6 krát velikost char, který se stane být jeden. 452 00:24:45,300 --> 00:24:47,440 Takže to znamená, že by malloc Dejte mi šest bajtů. 453 00:24:47,440 --> 00:24:49,140 Co je to vlastně dělá? 454 00:24:49,140 --> 00:24:52,810 No, dovolte mi vrátit se zpět v čase zde tam, kde jsme v příběhu. 455 00:24:52,810 --> 00:24:57,620 >> Takže když se vracím domů, jsem prohlásil, char * s názvem t. 456 00:24:57,620 --> 00:25:00,280 Já jsem teď volal malloc šest bajtů. 457 00:25:00,280 --> 00:25:06,400 A teď budu kreslit těchto šesti bytech stejně jako pole dříve. 458 00:25:06,400 --> 00:25:10,570 Ale já vlastně nevím, co je to uvnitř tohoto pole. 459 00:25:10,570 --> 00:25:14,640 >> Pokud se alokovat paměť se ukáže, že nemůžete věřit, že tam je nějaký 460 00:25:14,640 --> 00:25:15,810 známá hodnota tam. 461 00:25:15,810 --> 00:25:18,400 To by byly použity něčím jinak, jiné funkce, jiné 462 00:25:18,400 --> 00:25:19,630 řádek kódu, který jste napsal. 463 00:25:19,630 --> 00:25:22,870 Takže budeme obecně nazývali odpadky hodnoty a kreslit, snad, jak 464 00:25:22,870 --> 00:25:26,170 otazníky, jen naznačuje, že jsme Nevím, co to vlastně je. 465 00:25:26,170 --> 00:25:30,390 A to není žádný velký problém, tak dlouho, jak jsme jsou dost chytří na to přepsat ty 466 00:25:30,390 --> 00:25:34,550 odpadky hodnoty s čísly nebo znaky, které se starají o. 467 00:25:34,550 --> 00:25:36,340 >> Takže v tomto případě to, co budu dělat? 468 00:25:36,340 --> 00:25:38,670 No, moje řádek kódu další, mám čtyři. 469 00:25:38,670 --> 00:25:41,350 int i dostat 0, n dostane délka řetězce s. 470 00:25:41,350 --> 00:25:42,750 Takže známý pro smyčce. 471 00:25:42,750 --> 00:25:45,875 I je menší než nebo rovno n, která je obvykle vyšší. 472 00:25:45,875 --> 00:25:47,500 >> Ale tentokrát je to úmyslné. 473 00:25:47,500 --> 00:25:51,890 I + +, a pak jsem prostě dělat t i držák dostane s. 474 00:25:51,890 --> 00:25:56,320 Protože můj obrázek vypadá to na Tento moment, uložené v t je 475 00:25:56,320 --> 00:25:59,530 adresa tohoto náhodného kusu paměti jejichž hodnoty nejsou známy. 476 00:25:59,530 --> 00:26:03,030 Ale jakmile jsem se do t držák 0, která staví mě sem. 477 00:26:03,030 --> 00:26:07,430 >> A co skončí dobývání vyvodit? 478 00:26:07,430 --> 00:26:08,740 Jsme skončili uvedení h. 479 00:26:08,740 --> 00:26:11,170 Protože to je to, co je v držáku s 0. 480 00:26:11,170 --> 00:26:14,300 A pak totéž pro e a l a l, a o. 481 00:26:14,300 --> 00:26:17,930 >> n, proč jsem jít nahoru přes rovnat k n? 482 00:26:17,930 --> 00:26:19,200 Vzhledem k charakteru 0.. 483 00:26:19,200 --> 00:26:23,580 Tak aby bylo jasno, pak když jsem vlastně vymazat, co ty odpadky 484 00:26:23,580 --> 00:26:28,870 hodnoty a pak vlastně kreslit to, co očekávám, je to držák s 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, a to je koncové nová postava. 486 00:26:32,440 --> 00:26:36,080 >> A tak teď, pokud jsme pokračovali kolem bodu, tečka, tečka v tomto správnou verzi 487 00:26:36,080 --> 00:26:41,930 a kapitalizované t držák 0 bych, ze Samozřejmě, bude vydělávat právě tento 488 00:26:41,930 --> 00:26:47,050 chlap tady, které koncepčně, byl nakonec cíl. 489 00:26:47,050 --> 00:26:48,040 Tak to je vše, je ukazatel. 490 00:26:48,040 --> 00:26:51,430 >> A vy jste používali je již několik týdnů se v souvislosti s řetězce. 491 00:26:51,430 --> 00:26:53,530 Ale pod kapotou jsou trochu složitější. 492 00:26:53,530 --> 00:26:57,520 Ale pokud si myslíte, že o nich v této obrazová forma navrhuji, aby to 493 00:26:57,520 --> 00:27:01,720 zřejmě není všechno, že děsivé jako oni mohlo na první pohled zdát na první pohled, 494 00:27:01,720 --> 00:27:04,730 zejména s takovou novou syntaxi. 495 00:27:04,730 --> 00:27:07,290 Jakékoliv dotazy týkající se ukazatelů, řetězce, nebo chars? 496 00:27:07,290 --> 00:27:07,580 Jo? 497 00:27:07,580 --> 00:27:09,252 >> Diváků: můžete se vrátit zpět na [neslyšitelné]? 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Jistě. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> Publikum: Tak jak to, že ve vašem úplně poslední linka, nemusíte mít * T linku 501 00:27:19,525 --> 00:27:21,513 a * s v řadě? 502 00:27:21,513 --> 00:27:23,004 Ještě nemáte odkaz na - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ach, je opravdu dobrá otázka. 504 00:27:24,640 --> 00:27:26,800 Proč mám * T a A * S? 505 00:27:26,800 --> 00:27:30,340 Protože krátce, minulý týden, stejně jako v našem zaměnit funkci, řekl jsem, že když 506 00:27:30,340 --> 00:27:33,350 máš ukazatel prostředků, které se tam jako my 507 00:27:33,350 --> 00:27:36,590 fyzicky na jevišti, byl skutečně použijte hvězdy operátora. 508 00:27:36,590 --> 00:27:40,570 >> Ukazuje se, že toto náměstí-držák notace je to, co budeme říkat syntaktická 509 00:27:40,570 --> 00:27:44,190 cukr, který je jen způsob, jak sexy říká, že je to zkrácený zápis pro 510 00:27:44,190 --> 00:27:45,950 přesně to, co popisujete. 511 00:27:45,950 --> 00:27:49,385 Ale je to trochu více intuitivní. 512 00:27:49,385 --> 00:27:53,510 A na nebezpečí, že by to vypadat více složitější, než je třeba, aby se, 513 00:27:53,510 --> 00:27:56,990 co se opravdu děje je následující - 514 00:27:56,990 --> 00:28:01,450 Když řeknu, * t to znamená, že jít do adresa uložená v t. 515 00:28:01,450 --> 00:28:04,350 >> Tak doslova, jestliže t je ukládání adresa, že H 516 00:28:04,350 --> 00:28:07,300 zpočátku, * t znamená jít sem. 517 00:28:07,300 --> 00:28:10,730 A teď, co se t držák 0 znamená? 518 00:28:10,730 --> 00:28:11,560 Přesně stejnou věc. 519 00:28:11,560 --> 00:28:13,510 Je to jen o málo více uživateli přátelský psát. 520 00:28:13,510 --> 00:28:14,430 >> Ale já jsem neskončil. 521 00:28:14,430 --> 00:28:17,800 Nemůžu jen tak říct * t * S dostane. 522 00:28:17,800 --> 00:28:19,440 Vzhledem k tomu, co bych měla dělat pak? 523 00:28:19,440 --> 00:28:22,950 Já bych dávat h, h, h, h, h v celé věci. 524 00:28:22,950 --> 00:28:22,995 Je to tak? 525 00:28:22,995 --> 00:28:26,020 >> Vzhledem k tomu * t, je jít na adresu vt. 526 00:28:26,020 --> 00:28:27,580 Ale my jsme uvnitř smyčky. 527 00:28:27,580 --> 00:28:32,150 A jakou hodnotu mám zvyšování, Samozřejmě, že při každém opakování? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Ale je tu možnost tady, že jo? 530 00:28:34,590 --> 00:28:37,870 I když tento pocit, je to čím dál trochu sofistikovanější 531 00:28:37,870 --> 00:28:40,730 než čtvercového držáku zápisu jsme použili nějakou dobu - 532 00:28:40,730 --> 00:28:43,840 dovolte mi vrátit mou h změnu zde - 533 00:28:43,840 --> 00:28:48,870 I když je to dnes už trochu milovník, základní myšlenka, je-li t * 534 00:28:48,870 --> 00:28:53,630 zde znamená a * t jen přejděte na adresu vt. 535 00:28:53,630 --> 00:28:54,990 >> Ale co se adresa v t? 536 00:28:54,990 --> 00:28:56,850 Počet držíme používáte? 537 00:28:56,850 --> 00:29:00,540 Jako Ox456, vraťme to zpátky jen kvůli diskuse. 538 00:29:00,540 --> 00:29:05,380 No, když chci se dostat na e do t řetězec, jen chci jít, 539 00:29:05,380 --> 00:29:06,460 v podstatě, 456. 540 00:29:06,460 --> 00:29:09,230 >> Nebo spíš, 457. 541 00:29:09,230 --> 00:29:10,590 Jen chci přidat. 542 00:29:10,590 --> 00:29:11,790 Ale můžu dělat, že jo? 543 00:29:11,790 --> 00:29:14,680 Vzhledem k tomu, t, i když pořád výkres nyní jako šíp, je to jen 544 00:29:14,680 --> 00:29:16,570 číslo, Ox456. 545 00:29:16,570 --> 00:29:21,400 A když přidám jednu k tomu, nebo více Obecně platí, že když přidám já k tomu mohu 546 00:29:21,400 --> 00:29:24,350 skutečně dostat přesně tam, kde chci. 547 00:29:24,350 --> 00:29:26,260 Takže když jsem vlastně to - 548 00:29:26,260 --> 00:29:28,970 a to je to, co se nyní nazývá ukazatel aritmetika - 549 00:29:28,970 --> 00:29:30,375 Nemohu odstranit tento řádek. 550 00:29:30,375 --> 00:29:33,550 Což je, upřímně řečeno, myslím, že jasnější a trochu více uživatelsky přívětivé pro čtení. 551 00:29:33,550 --> 00:29:35,970 Jedná se však o méně správné. 552 00:29:35,970 --> 00:29:38,570 >> Tento řádek kódu se používá ukazatel aritmetika. 553 00:29:38,570 --> 00:29:40,920 Je to řeč jdi do následující adresu - 554 00:29:40,920 --> 00:29:44,670 bez ohledu na začátek T, který je t a i, která zpočátku 555 00:29:44,670 --> 00:29:45,730 je 0, což je skvělé. 556 00:29:45,730 --> 00:29:49,280 Protože to znamená, že začátek t. plus 1 plus 2 plus 3, a tak dále. 557 00:29:49,280 --> 00:29:51,030 A totéž se zabývají s. 558 00:29:51,030 --> 00:29:52,750 >> Takže syntaktický cukr pro toto. 559 00:29:52,750 --> 00:29:55,900 Ale pochopení toho, co se opravdu děje pod kapotou, řekl bych, 560 00:29:55,900 --> 00:29:57,410 ve skutečnosti užitečné samo o sobě. 561 00:29:57,410 --> 00:30:00,620 Protože to znamená, že teď už to není mnohem více magie děje 562 00:30:00,620 --> 00:30:01,620 pod kapotou. 563 00:30:01,620 --> 00:30:03,920 Nejsou zde bude mnohem více vrstvy, které můžeme Sloupněte pro vás. 564 00:30:03,920 --> 00:30:04,810 To je cca. 565 00:30:04,810 --> 00:30:06,410 A to je programování. 566 00:30:06,410 --> 00:30:08,002 Opravdu dobrá otázka. 567 00:30:08,002 --> 00:30:11,570 >> Tak jo, bylo to, že kočárek program, který jsem měl na mysli dříve. 568 00:30:11,570 --> 00:30:12,650 odkládací byla vadná. 569 00:30:12,650 --> 00:30:14,070 Pokud se zdá, že práce. 570 00:30:14,070 --> 00:30:17,390 Připomeňme, že stejně jako s mlékem a pomerančový džus - což jsem začal 571 00:30:17,390 --> 00:30:18,660 pití dnešní demonstraci. 572 00:30:18,660 --> 00:30:22,220 Takže stejně jako s pomerančovým džusem a mléko, jsme muset použít 573 00:30:22,220 --> 00:30:26,200 dočasné proměnné, tmp, držet dočasně tak, že bychom mohli 574 00:30:26,200 --> 00:30:28,820 změňte jeho hodnotu a poté aktualizovat b. 575 00:30:28,820 --> 00:30:32,870 >> Ale tato funkce, jsme si řekli, a to program, v němž byla tato funkce 576 00:30:32,870 --> 00:30:35,670 napsal, byla špatně a vadný, proč? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Ano? 579 00:30:39,090 --> 00:30:42,471 >> DIVÁKŮ: [neslyšitelné]. 580 00:30:42,471 --> 00:30:44,940 >> SPEAKER 1: Přesně tak, když zavoláte odkládací - 581 00:30:44,940 --> 00:30:47,820 nebo obecněji, když zavolejte nejvíce jakoukoli funkci - 582 00:30:47,820 --> 00:30:51,210 pokud jsou argumenty této funkce jsou primitivní, abych tak řekl, ints a chars 583 00:30:51,210 --> 00:30:56,740 a dvoulůžkové a plováky, věci bez hvězdy, jste kolemjdoucí v kopii 584 00:30:56,740 --> 00:30:57,540 argument. 585 00:30:57,540 --> 00:31:01,580 Takže pokud je x 1 a y 2 byl, bude na 1 a b bude 2. 586 00:31:01,580 --> 00:31:05,250 Ale oni se chystáte být různé kusy bitů, různé kousky 587 00:31:05,250 --> 00:31:07,540 paměti, že stalo, že se ukládání stejné hodnoty. 588 00:31:07,540 --> 00:31:12,160 >> Takže tento kód je super perfektní na odkládání a a b. 589 00:31:12,160 --> 00:31:13,850 Je to k ničemu swapping - 590 00:31:13,850 --> 00:31:15,290 minulý týden například - 591 00:31:15,290 --> 00:31:16,390 x a y. 592 00:31:16,390 --> 00:31:18,780 Vzhledem k tomu znovu, že jsou v nesprávném rozsahu. 593 00:31:18,780 --> 00:31:21,310 >> Teď, jak jsme jít o stanovení tohle? 594 00:31:21,310 --> 00:31:23,140 Museli jsme funkci vypadat trochu ošklivější. 595 00:31:23,140 --> 00:31:25,250 Ale znovu, zvažte, co to znamená jen. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> A vlastně, nech mě, konzistence, změnit jednu věc, takže je to stejné 598 00:31:31,500 --> 00:31:33,200 co jsme právě udělali. 599 00:31:33,200 --> 00:31:35,690 Jak jsem již zmínil minulý týden, to není na tom, kde to jde. 600 00:31:35,690 --> 00:31:38,120 Ve skutečnosti, obvykle byste dal hvězdy vedle názvu proměnné. 601 00:31:38,120 --> 00:31:40,750 Ale myslím, že to bude trochu jednodušší zvážit * vedle 602 00:31:40,750 --> 00:31:44,910 datový typ v tom smyslu, že je to ukazatel na int v tomto případě. 603 00:31:44,910 --> 00:31:46,270 >> Takže to, co tu vlastně dělám? 604 00:31:46,270 --> 00:31:49,590 Říkám, že mi nedáš int následuje další int, 605 00:31:49,590 --> 00:31:50,810 volat je a, b. 606 00:31:50,810 --> 00:31:52,460 Dejte mi adresu int. 607 00:31:52,460 --> 00:31:53,960 Dej mi adresu jiného int. 608 00:31:53,960 --> 00:31:56,330 Zavolejte ty adresy a a b. 609 00:31:56,330 --> 00:32:00,860 >> A pak pomocí * notaci dolů níže, jít do každé z těchto adres 610 00:32:00,860 --> 00:32:05,290 V případě potřeby se buď získat nebo nastavit jeho hodnotu. 611 00:32:05,290 --> 00:32:07,400 Ale je tu výjimka zde. 612 00:32:07,400 --> 00:32:11,130 Proč nemohu mít * vedle tmp? 613 00:32:11,130 --> 00:32:15,070 Proč to dělat, například? 614 00:32:15,070 --> 00:32:19,370 Mám pocit, jako bych měl jít all ven a opravit celou věc. 615 00:32:19,370 --> 00:32:19,752 Jo? 616 00:32:19,752 --> 00:32:21,002 >> DIVÁKŮ: [neslyšitelné]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> SPEAKER 1: já jsem prohlásil, tmp jako řetězec. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Takže by to vyhlásit, v tomto případě, tmp být adresa int. 621 00:32:34,950 --> 00:32:37,380 Ale to není to, co chci, na několika důvodů. 622 00:32:37,380 --> 00:32:38,616 >> DIVÁKŮ: Nechcete vyměnit je. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Přesně tak, já nechci vyměnit cokoliv s tmp. tmp je jen 624 00:32:41,800 --> 00:32:42,790 týden jedna věc. 625 00:32:42,790 --> 00:32:45,150 Všechno, co chci je proměnná uložit určitý počet. 626 00:32:45,150 --> 00:32:47,330 Nemám ani starat o adresách v tomto okamžiku. 627 00:32:47,330 --> 00:32:50,530 >> Potřebuju jen 32 bitů nebo takže k uložení int. 628 00:32:50,530 --> 00:32:56,690 A já chci, aby v těchto 32 bitů co není, abych tak řekl, ale 629 00:32:56,690 --> 00:33:01,260 co je, jen proto, aby byl přesnější. 630 00:33:01,260 --> 00:33:06,420 Vzhledem k tomu, pokud je adresa, * znamená jít a získat hodnotu 1. 631 00:33:06,420 --> 00:33:10,560 Například minulý týden například nebo v případě B je, získat hodnotu 2. 632 00:33:10,560 --> 00:33:11,750 >> Takže to, co se opravdu děje? 633 00:33:11,750 --> 00:33:15,070 Dovolte mi, abych zde nakreslit obrázek, který bude jen šprýmaři odděleně část dnes. 634 00:33:15,070 --> 00:33:18,580 Ale tento trend bude pokračovat, aby se pro docela nějaký čas. 635 00:33:18,580 --> 00:33:22,430 >> To tvrdím, je to, co počítač je Paměť vypadá při spuštění 636 00:33:22,430 --> 00:33:24,060 programu, každý program. 637 00:33:24,060 --> 00:33:28,340 Při spuštění programu na samém vrcholu z paměti RAM vašeho počítače - takže myslet 638 00:33:28,340 --> 00:33:33,530 Tento obdélník, opravdu, jako váš počítače RAM nebo paměti, všechny 101 639 00:33:33,530 --> 00:33:36,920 miliarda bajtů, to vše dvě miliardy bajtů, celé dva gigabajty tom, 640 00:33:36,920 --> 00:33:39,910 bez ohledu na množství, které mají, je, Pojďme nakreslit například obdélník. 641 00:33:39,910 --> 00:33:43,260 A tvrdím, že při spuštění programu jako je Microsoft Word nebo Chrome 642 00:33:43,260 --> 00:33:49,220 nebo něco podobného, ​​bity, které Microsoft nebo že Google psal - 643 00:33:49,220 --> 00:33:50,910 V případě těchto programů - 644 00:33:50,910 --> 00:33:54,490 jsou načteny do paměti počítače kde mohou být provedeny další 645 00:33:54,490 --> 00:33:57,520 rychle a dodal do procesoru, který je mozek počítače. 646 00:33:57,520 --> 00:34:00,940 >> A TAM oni jsou skladovány při velmi horní část programu, abych tak řekl. 647 00:34:00,940 --> 00:34:03,300 Jinými slovy, pokud je to kus paměť, při poklepání na 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, bity přicházejí vypnutí pevného disku. 649 00:34:05,740 --> 00:34:06,680 Dostanou načten do paměti RAM. 650 00:34:06,680 --> 00:34:10,330 A budeme strkat je do úplně nahoře tohoto obdélníku koncepčně. 651 00:34:10,330 --> 00:34:13,010 >> No, zbytek paměti je použít pro různé věci. 652 00:34:13,010 --> 00:34:16,460 Na samém vrcholu vidíte inicializovat dat a inicializaci dat. 653 00:34:16,460 --> 00:34:20,500 To souvisí, z větší části, s konstanty nebo globální proměnné 654 00:34:20,500 --> 00:34:21,340 které mají hodnoty. 655 00:34:21,340 --> 00:34:22,980 Ale o těch jindy. 656 00:34:22,980 --> 00:34:25,150 >> Pak máte hromadu, která vrátíme se. 657 00:34:25,150 --> 00:34:28,420 Ale ve spodní části, je ta část, která je zejména Germaine právě teď. 658 00:34:28,420 --> 00:34:30,210 Je to tzv. stack. 659 00:34:30,210 --> 00:34:33,850 Takže stejně jako ve většině jakékoli D haly zde kampus, máte ty zásobníky, které 660 00:34:33,850 --> 00:34:37,210 jen zásobník na sebe, na kterém si můžete dát jídlo a kdo ví co ještě. 661 00:34:37,210 --> 00:34:40,139 Zásobník v počítačovém systému je velmi podobný. 662 00:34:40,139 --> 00:34:42,679 Kromě zatímco zásobníku, jak je používáme v jídelna, samozřejmě, je třeba 663 00:34:42,679 --> 00:34:45,710 nést věci zásobníky nebo rámy - 664 00:34:45,710 --> 00:34:49,469 jak budeme nazývat - v počítači je paměť se používá pro zastavení 665 00:34:49,469 --> 00:34:51,610 proměnné a hodnoty. 666 00:34:51,610 --> 00:34:53,929 >> Takže to, co se opravdu děje pod kapotou? 667 00:34:53,929 --> 00:34:55,820 No, dovolte mi otočit na obrazovku zde. 668 00:34:55,820 --> 00:34:58,370 A pojďme zaměřit pouze na spodní část na chvíli. 669 00:34:58,370 --> 00:35:02,770 Pokud se jedná o spodní část z mých paměti počítače to dopadá, když jsem 670 00:35:02,770 --> 00:35:05,350 volání funkce main - což se stává, upřímně řečeno, 671 00:35:05,350 --> 00:35:06,950 automaticky pro mě - 672 00:35:06,950 --> 00:35:10,510 Mám kus paměti na Spodní část mé paměti, abych tak řekl. 673 00:35:10,510 --> 00:35:13,390 A to je místo, kde je hlavní lokální proměnné jít. 674 00:35:13,390 --> 00:35:16,770 To je místo, kde argc a argv možná jít, a všechny proměnné I 675 00:35:16,770 --> 00:35:18,170 prohlásit uvnitř hlavní. 676 00:35:18,170 --> 00:35:20,260 Skončí na dně mé paměti RAM počítače. 677 00:35:20,260 --> 00:35:25,040 >> Nyní předpokládejme, že hlavní výzvy funkce jako odkládací prostor, jako to udělal minulý týden? 678 00:35:25,040 --> 00:35:30,620 No, jsme v podstatě dát nový zásobník nový snímek, na mém kusu paměti. 679 00:35:30,620 --> 00:35:34,160 A budu popisovat to jako patřící do swap. 680 00:35:34,160 --> 00:35:35,770 >> Teď, co je uvnitř swapu? 681 00:35:35,770 --> 00:35:39,240 No, na základě minulého týdne a programu ta, kterou jsme právě viděli ukázku z, 682 00:35:39,240 --> 00:35:46,590 uvnitř swapových rámu, nebo na swapu zásobník, jsou to proměnné? 683 00:35:46,590 --> 00:35:47,970 No, a, b. 684 00:35:47,970 --> 00:35:51,850 Protože to byly jeho místní argumenty, a za třetí, tmp. 685 00:35:51,850 --> 00:35:54,470 Takže opravdu, mohl bych nakreslit to trochu čistěji. 686 00:35:54,470 --> 00:35:56,680 Nech mě jít dopředu a zpět štítku. 687 00:35:56,680 --> 00:35:58,520 A dovolte mi tvrdit, že víte, co? 688 00:35:58,520 --> 00:36:00,560 >> pravděpodobně skončí tady. 689 00:36:00,560 --> 00:36:02,160 B skončí tady. 690 00:36:02,160 --> 00:36:03,810 A tmp skončí tady. 691 00:36:03,810 --> 00:36:05,160 Nyní, možná uspořádání být trochu jinak. 692 00:36:05,160 --> 00:36:06,840 Ale koncepčně to je nápad. 693 00:36:06,840 --> 00:36:11,490 >> A jen společně, to je to, co zavoláme swapu rámu, nebo 694 00:36:11,490 --> 00:36:12,136 jídelní sál zásobník. 695 00:36:12,136 --> 00:36:13,150 A totéž se zabývají hlavní. 696 00:36:13,150 --> 00:36:14,040 Ale nebudu překreslovat, že. 697 00:36:14,040 --> 00:36:17,810 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 698 00:36:17,810 --> 00:36:18,940 může být také. 699 00:36:18,940 --> 00:36:22,170 >> Takže nyní zvažuje, co se skutečně děje když zavoláte swapu. 700 00:36:22,170 --> 00:36:26,370 Voláte-li do swapu, spuštění kódu jako to, že jste předáním, v 701 00:36:26,370 --> 00:36:30,670 buggy verze A a B jako kopie x a y. 702 00:36:30,670 --> 00:36:34,300 Takže když jsem se teď kreslit to na displeji - 703 00:36:34,300 --> 00:36:36,700 se dostat lepší na to - 704 00:36:36,700 --> 00:36:40,850 tak příběh říkal jsem si pro sebe bylo v této verzi kočárku, když 705 00:36:40,850 --> 00:36:46,130 zavolejte vyměnit předáním doslova a a b jako celá čísla, co se skutečně děje? 706 00:36:46,130 --> 00:36:48,250 >> No, co se opravdu děje, je to. 707 00:36:48,250 --> 00:36:52,850 Nech mě jít dopředu a zpět jen uklidit nějaký prostor zde. 708 00:36:52,850 --> 00:36:54,720 Tak tohle je moje paměť počítače. 709 00:36:54,720 --> 00:36:57,510 >> Takže pokud mám například - 710 00:36:57,510 --> 00:36:58,910 vlastně uděláme to takhle - 711 00:36:58,910 --> 00:37:02,690 když tvrdí, že je to x, skladování hodnota 1, stejně jako minulý týden. 712 00:37:02,690 --> 00:37:05,930 A to je y, uložení hodnoty 2 stejně jako minulý týden. 713 00:37:05,930 --> 00:37:11,370 A to je hlavní, když volám swapu, čímž sám přístup a 714 00:37:11,370 --> 00:37:15,150 b a tmp, budu tvrdit, že to je, a to je 1. 715 00:37:15,150 --> 00:37:16,080 >> To je b. 716 00:37:16,080 --> 00:37:17,010 To je 2. 717 00:37:17,010 --> 00:37:18,370 To se nazývá tmp. 718 00:37:18,370 --> 00:37:23,360 >> A zpočátku, to má určitou hodnotu, odpadky dokud jsem vlastně ukládat v něm, 719 00:37:23,360 --> 00:37:24,450 což je 1. 720 00:37:24,450 --> 00:37:28,320 Pak jsem se do toho pusťte a změnit být co? 721 00:37:28,320 --> 00:37:29,720 B je hodnota. 722 00:37:29,720 --> 00:37:31,980 >> A tak teď mám dva tady. 723 00:37:31,980 --> 00:37:34,050 A pak jsme si řekli, b dostane tmp. 724 00:37:34,050 --> 00:37:37,670 Opět, stejně jako zdravý rozum zkontrolujte, třetí řádek kódu je zde prostě toto 725 00:37:37,670 --> 00:37:39,440 jeden, b dostane tmp. 726 00:37:39,440 --> 00:37:41,730 >> A tak nakonec, co mám dělat? 727 00:37:41,730 --> 00:37:46,800 Jdu do toho a změňte b jako něco, co hodnota TMP je, což je 1. 728 00:37:46,800 --> 00:37:48,390 Já se nedotýkejte tmp znovu. 729 00:37:48,390 --> 00:37:54,100 >> Ale teď, problém je, jakmile odkládací vrací, protože není rozdávají 730 00:37:54,100 --> 00:37:57,540 zpět nějakou hodnotu, není návratu prohlášení výslovně v něm. 731 00:37:57,540 --> 00:37:59,080 Co se vlastně děje? 732 00:37:59,080 --> 00:38:03,480 No, v podstatě vše paměť - 733 00:38:03,480 --> 00:38:07,410 OK, zřejmě guma líbí jen jedním prstem najednou - 734 00:38:07,410 --> 00:38:08,180 prostě zmizí. 735 00:38:08,180 --> 00:38:10,070 >> Nyní ve skutečnosti to není nejdu. 736 00:38:10,070 --> 00:38:11,810 Ale můžete si ji nyní jako otazníky. 737 00:38:11,810 --> 00:38:14,040 Protože je to již v současné době používají. 738 00:38:14,040 --> 00:38:17,470 A nic se provádí s těmito hodnotami. 739 00:38:17,470 --> 00:38:21,920 >> Takže v případě zeleného verze tento kód, co místo toho je, že 740 00:38:21,920 --> 00:38:24,640 přecházel do swapu? 741 00:38:24,640 --> 00:38:25,770 Tak řeší. 742 00:38:25,770 --> 00:38:28,520 Takže adresa xa adresa y. 743 00:38:28,520 --> 00:38:35,790 Takže když znovu říct tento příběh ještě poslední čas, a já jsem vlastně kreslit odkládací znovu, 744 00:38:35,790 --> 00:38:44,620 ale s ukazateli, což je, to b je, a to je tmp, co je 745 00:38:44,620 --> 00:38:49,080 ve skutečnosti uloženy v této zelené verze mého kódu, kde jsem kolem 746 00:38:49,080 --> 00:38:52,110 na adresách? 747 00:38:52,110 --> 00:38:53,780 >> To bude ukazatel na x. 748 00:38:53,780 --> 00:38:54,890 Takže jsem mohl nakreslit šipku. 749 00:38:54,890 --> 00:38:57,310 Ale pojďme používají stejné libovolná například jako předtím. 750 00:38:57,310 --> 00:39:01,220 Řekněme, že je to něco jako Ox123. 751 00:39:01,220 --> 00:39:04,970 A to bude, protože Ox127 je to čtyři byty pryč, protože je to 752 00:39:04,970 --> 00:39:07,370 int, takže Ox127. 753 00:39:07,370 --> 00:39:09,080 >> A opět, beru nějaké svobody s čísly. 754 00:39:09,080 --> 00:39:11,430 Jsou mnohem menší, než by ve skutečnosti být, a v jiném pořadí. 755 00:39:11,430 --> 00:39:14,350 Ale to je, jak se obraz je nyní jiný. 756 00:39:14,350 --> 00:39:19,060 >> Ale když jsem se použít tuto zelenou kód a já int tmp dostat *. 757 00:39:19,060 --> 00:39:25,010 * Prostředek provést následující kroky, se řešení, které je v a jít k ní, 758 00:39:25,010 --> 00:39:26,190 což je 1. 759 00:39:26,190 --> 00:39:28,480 A to je to, co jsem pak dal do tmp. 760 00:39:28,480 --> 00:39:32,480 Mezitím se na dalším řádku kódu zde * dostane b, co to znamená? 761 00:39:32,480 --> 00:39:36,910 >> No, *, tak jděte sem dostane * b, což znamená, že se tam. 762 00:39:36,910 --> 00:39:39,310 A to znamená, dát hodnotu tam. 763 00:39:39,310 --> 00:39:43,670 Konečně, poslední řádek kódu jednoduše řečeno b * dostane tmp. 764 00:39:43,670 --> 00:39:48,900 >> Tak b říká, že tam a přepsat ji tmp, které je v tomto případě, bude 765 00:39:48,900 --> 00:39:51,520 se opět, 1. 766 00:39:51,520 --> 00:39:54,920 A to je důvod, proč zelená verze Náš kodex práce, zatímco červená 767 00:39:54,920 --> 00:39:56,010 verze nikdy. 768 00:39:56,010 --> 00:39:59,020 To vše jen se scvrkává na tom, jak paměť je řízena a kde je to 769 00:39:59,020 --> 00:40:02,580 ve skutečnosti uložena do počítače RAM. 770 00:40:02,580 --> 00:40:07,270 A teď, to je jedna z věcí, že zásobník se používá. 771 00:40:07,270 --> 00:40:09,225 >> Otázky týkající se rozvržení? 772 00:40:09,225 --> 00:40:10,380 Na ukazateli? 773 00:40:10,380 --> 00:40:11,630 Nebo o swapu? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Dobře, takže malloc, odvolání, udělal něco takového. 776 00:40:17,043 --> 00:40:18,260 To byl výborný jednoduchý příklad. 777 00:40:18,260 --> 00:40:20,550 A to byl ten, že Binky nám představil, i když zcela 778 00:40:20,550 --> 00:40:21,870 rychle, na konci hodiny. 779 00:40:21,870 --> 00:40:24,480 Sakra, tam zase. 780 00:40:24,480 --> 00:40:28,780 >> Takže připomenout, že to byl příklad, který Binky nám představil, i když 781 00:40:28,780 --> 00:40:30,360 poněkud rychle na konci hodiny. 782 00:40:30,360 --> 00:40:33,640 A tady jsme opravdu malloc podruhé. 783 00:40:33,640 --> 00:40:37,330 Vzhledem k tomu, poprvé jsme ho vytvořit dostatek paměti RAM, přidělit dostatek paměti RAM 784 00:40:37,330 --> 00:40:38,340 pro uložení řetězce. 785 00:40:38,340 --> 00:40:40,250 >> Tentokrát Binky držel to jednoduché. 786 00:40:40,250 --> 00:40:42,465 Takže je to jen k ukládání int, zřejmě. 787 00:40:42,465 --> 00:40:43,510 A to je úplně v pohodě. 788 00:40:43,510 --> 00:40:46,560 Je to trochu divné, upřímně řečeno, na používat malloc alokovat jeden int. 789 00:40:46,560 --> 00:40:50,650 Ale bod claymation Nick byl opravdu jen vyprávět příběh o tom, co 790 00:40:50,650 --> 00:40:53,830 se stane nebo nestane, když můžete týrat paměti. 791 00:40:53,830 --> 00:40:56,520 >> Takže v tomto případě, tento program Udělal pár věcí. 792 00:40:56,520 --> 00:41:01,580 V prvním případě se zde, se prohlašuje ukazatel s názvem x na int. 793 00:41:01,580 --> 00:41:04,480 To pak deklaruje ukazatel volal y na int. 794 00:41:04,480 --> 00:41:06,150 To pak uloží do x, co? 795 00:41:06,150 --> 00:41:07,110 Někdo teď. 796 00:41:07,110 --> 00:41:09,685 Co je uložena v X podle Třetí řádek tohoto programu? 797 00:41:09,685 --> 00:41:12,380 >> DIVÁKŮ: [neslyšitelné]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: No, ne tak docela bajtů, za říkají. 799 00:41:14,130 --> 00:41:16,760 Být přesnější teď. 800 00:41:16,760 --> 00:41:18,325 Co je uložena v X? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Adresa, myslím, že jsem to slyšel. 803 00:41:22,060 --> 00:41:23,570 >> Takže co malloc vrátí? 804 00:41:23,570 --> 00:41:26,030 malloc behaviorálně přiděluje kus paměti. 805 00:41:26,030 --> 00:41:27,850 Ale jak to umožňují přístup k ní? 806 00:41:27,850 --> 00:41:29,460 Vrací co? 807 00:41:29,460 --> 00:41:32,000 Adresa prvního bajtu v bloku paměti. 808 00:41:32,000 --> 00:41:33,020 >> Nyní, to je super jednoduchý. 809 00:41:33,020 --> 00:41:35,380 Je to jen jeden bajt, což znamená, že zabývat se dostáváme zpět je 810 00:41:35,380 --> 00:41:37,300 adresa z toho všeho. 811 00:41:37,300 --> 00:41:42,070 Skladovat tak v X, pak je adresa tohoto bloku paměti. 812 00:41:42,070 --> 00:41:43,400 Mezitím, co se stane dál? 813 00:41:43,400 --> 00:41:45,890 Takže vlastně, pojďme dál a čerpat z tohoto opravdu rychle. 814 00:41:45,890 --> 00:41:52,490 >> Takže pokud projdeme na obrazovku a tady budeme hrát na to int * x a int * y 815 00:41:52,490 --> 00:41:53,740 bude dělat to, co pro mě? 816 00:41:53,740 --> 00:41:58,280 Tvrdím, že je to jen bude dělat něco takového a nazývat to x a 817 00:41:58,280 --> 00:42:00,010 to a říkají y. 818 00:42:00,010 --> 00:42:03,110 Mezitím, třetí řádek kódu je bude alokovat velikost int, 819 00:42:03,110 --> 00:42:06,160 který se stane být - Omlouvám se, jestli jsem řekl, jeden předtím, než jsem chtěl jeden int - 820 00:42:06,160 --> 00:42:08,280 čtyři byty na typickém počítači. 821 00:42:08,280 --> 00:42:09,720 Alespoň se CS50 spotřebiče. 822 00:42:09,720 --> 00:42:11,490 >> Takže to bude přidělovat to, kdo ví? 823 00:42:11,490 --> 00:42:12,800 Někde tady. 824 00:42:12,800 --> 00:42:15,780 A tato je uložena na některé Adresa Ox, kdo ví? 825 00:42:15,780 --> 00:42:18,330 Ale to, co se děje, aby se vrátil je ta adresa. 826 00:42:18,330 --> 00:42:22,270 Ale budeme kreslit to obrazově jen jako šipka takhle. 827 00:42:22,270 --> 00:42:25,430 >> Nyní v dalším řádku * x dostane 42. 828 00:42:25,430 --> 00:42:29,400 Co * x znamená laicky řečeno? 829 00:42:29,400 --> 00:42:30,040 Jen tam. 830 00:42:30,040 --> 00:42:30,960 Přejděte na tuto adresu. 831 00:42:30,960 --> 00:42:35,900 Nebo jinými slovy, postupujte šipka a dát tam 42. 832 00:42:35,900 --> 00:42:38,140 Ale pak se něco špatného stalo na Binky, že jo? 833 00:42:38,140 --> 00:42:43,950 >> Připomeňme, že linku pět tady, * y dostane 13, opravdu nešťastné číslo, 834 00:42:43,950 --> 00:42:44,760 co udělal pro nás? 835 00:42:44,760 --> 00:42:47,320 No, * y znamená jít. 836 00:42:47,320 --> 00:42:50,460 No, nebyla tato možnost dána hodnota ještě, že jo? 837 00:42:50,460 --> 00:42:54,090 Kód nemá y je inicializován na cokoliv. 838 00:42:54,090 --> 00:42:56,120 Měli jsme x inicializovány na adresu. 839 00:42:56,120 --> 00:42:57,640 Ale y byl vyhlášen až vrchol. 840 00:42:57,640 --> 00:43:00,250 Ale pak středník, žádná hodnota byl vlastně do něj. 841 00:43:00,250 --> 00:43:02,330 Takže je to fér nazývat odpadky hodnota. 842 00:43:02,330 --> 00:43:03,430 Kdo ví, co je to? 843 00:43:03,430 --> 00:43:07,160 Jsou to zbytky bitů, které byly použity nějakým předchozím řádku kódu v 844 00:43:07,160 --> 00:43:08,300 můj program. 845 00:43:08,300 --> 00:43:13,250 >> Takže když řeknu, tam jít, je to jako, Nemám tušení, kde to je šipka 846 00:43:13,250 --> 00:43:14,490 Skončím. 847 00:43:14,490 --> 00:43:17,720 A to je, když se obvykle dostanete segmentation fault. 848 00:43:17,720 --> 00:43:22,430 Pokud jste omylem dereference, tak mluvit, nebo přejděte na adresu, že to není 849 00:43:22,430 --> 00:43:25,400 vlastně legitimní adresa, špatné věci se stávají. 850 00:43:25,400 --> 00:43:27,550 >> A to je přesně to, co se stalo myslet Binky. 851 00:43:27,550 --> 00:43:31,060 Takže připomenout, že příběh, který je Nick vyprávění zde byl stejný nápad jako to, co 852 00:43:31,060 --> 00:43:34,050 Jsem se vypracován s iluzí křída na tabuli tam. 853 00:43:34,050 --> 00:43:35,960 X a Y jsou deklarovány. 854 00:43:35,960 --> 00:43:39,690 >> Pak jsme přiděleno velikost int a uložit jej do x. 855 00:43:39,690 --> 00:43:42,130 Pak další řádek jsme * x. 856 00:43:42,130 --> 00:43:46,070 To byl Nickův kouzelná hůlka z dereferencing. 857 00:43:46,070 --> 00:43:49,780 To dal 42 do paměti poukázal x. 858 00:43:49,780 --> 00:43:51,600 >> Ale to je místo, kde se věci šel strašně špatně. 859 00:43:51,600 --> 00:43:51,820 Je to tak? 860 00:43:51,820 --> 00:43:53,550 Snažili jsme se dereferencování y. 861 00:43:53,550 --> 00:43:55,620 Ale y měl nějakou fiktivní hodnotu, ne? 862 00:43:55,620 --> 00:43:57,720 >> To Šipka v levém dolním roh, není 863 00:43:57,720 --> 00:43:58,950 ve skutečnosti ukazuje na cokoliv. 864 00:43:58,950 --> 00:44:01,520 Je to něco, co jsem dělal jsem tady na palubě. 865 00:44:01,520 --> 00:44:05,900 Tak špatné věci se stávají, segmentace chyba, nebo chyba Binky, v tomto případě. 866 00:44:05,900 --> 00:44:10,800 >> Ale když jsme pak opravit, že tím x dostane y, jak ten příběh změnu? 867 00:44:10,800 --> 00:44:15,760 No, když to udělám x y dostane, to je fakticky stejné, jak říká 868 00:44:15,760 --> 00:44:19,235 bez ohledu na to, co Ox- bude stejný zde, 869 00:44:19,235 --> 00:44:20,080 Ox-něco. 870 00:44:20,080 --> 00:44:22,970 Nebo obrazově budeme kreslit šipku. 871 00:44:22,970 --> 00:44:25,530 >> Tak tady na desce s Binky, s další řádek 872 00:44:25,530 --> 00:44:28,350 kód * y znamená jít. 873 00:44:28,350 --> 00:44:29,400 Kde je tam? 874 00:44:29,400 --> 00:44:30,820 To znamená, že tady. 875 00:44:30,820 --> 00:44:36,050 >> A když jsme aktualizaci, že je to 13 to prostě znamená jít a 876 00:44:36,050 --> 00:44:39,470 psaní 13 tady. 877 00:44:39,470 --> 00:44:44,130 Takže možná není úplně jednoduché na první pohled. 878 00:44:44,130 --> 00:44:47,740 Ale shrnout a používat stejný žargon že Binky použil tady, tak 879 00:44:47,740 --> 00:44:50,485 První dvě přidělit ukazatelů, x a y, ale ne pointees. 880 00:44:50,485 --> 00:44:54,750 A pointees není obecně používán termín. 881 00:44:54,750 --> 00:44:56,120 Ale je naprosto ukazatel. 882 00:44:56,120 --> 00:44:59,200 Ale to je to, co je upozornil na podle nomenklatury Binky je. 883 00:44:59,200 --> 00:45:01,660 >> Tato další řada, samozřejmě, přiděluje int pointee. 884 00:45:01,660 --> 00:45:04,840 Takže kus paměti - jak jsem nakreslil více než na pravá strana existuje - a set 885 00:45:04,840 --> 00:45:06,470 x rovno odkázat se na něj. 886 00:45:06,470 --> 00:45:11,350 To dereferences x ukládat 42 v paměti, že je to ukázal na. 887 00:45:11,350 --> 00:45:13,380 A pak, samozřejmě, byla špatná věc. 888 00:45:13,380 --> 00:45:15,600 Vzhledem k tomu, y nebyl ukázal na něco ještě. 889 00:45:15,600 --> 00:45:16,530 To opraví ji. 890 00:45:16,530 --> 00:45:18,240 Takže je to stále buggy programu. 891 00:45:18,240 --> 00:45:21,580 Jen proto, že jsme profouknutí kód řádek po řádku a říká, ach dobře, 892 00:45:21,580 --> 00:45:22,690 nechat to spadnout tam. 893 00:45:22,690 --> 00:45:23,420 To je špatné. 894 00:45:23,420 --> 00:45:26,790 Kurz je program právě chystá přerušit úplně na tomto řádku. 895 00:45:26,790 --> 00:45:30,550 Ale pokud byste chtěli odstranit havaroval linka a nahradit ji poslední dva 896 00:45:30,550 --> 00:45:32,470 řádcích přiřadíte - 897 00:45:32,470 --> 00:45:35,310 pomocí přiřazení ukazatele - y poukázat na x jako bod t.. 898 00:45:35,310 --> 00:45:39,280 A pak si dereference y ve velmi bezpečným způsobem. 899 00:45:39,280 --> 00:45:41,520 >> Takže tam, kde to nás? 900 00:45:41,520 --> 00:45:45,350 No, ukázalo se, že pod kapotou v CS50 knihovně ukazatele jsou 901 00:45:45,350 --> 00:45:46,320 používán v celém. 902 00:45:46,320 --> 00:45:48,910 A budeme skutečně začít loupat zpět tato vrstva zanedlouho. 903 00:45:48,910 --> 00:45:51,740 Ale ukazuje se také, že výraz někteří z vás by mohl být znát, 904 00:45:51,740 --> 00:45:54,580 zejména pohodlnější, je ve skutečnosti, že z velmi populární 905 00:45:54,580 --> 00:45:56,390 webové stránky, nebo přetečení zásobníku, v těchto dnech. 906 00:45:56,390 --> 00:45:58,720 >> Ale to ve skutečnosti má velmi technický význam. 907 00:45:58,720 --> 00:46:00,160 Nyní víme, co stack. 908 00:46:00,160 --> 00:46:02,550 Je to jako hromada zásobníků uvnitř jídelně. 909 00:46:02,550 --> 00:46:05,140 >> Nebo uvnitř vašeho počítače Paměť its ty rámy 910 00:46:05,140 --> 00:46:06,900 , které jsou používány funkce. 911 00:46:06,900 --> 00:46:10,760 No, ukázalo se, že z důvodu, že velmi jednoduchá implementace 912 00:46:10,760 --> 00:46:14,970 paměť a rámy na tzv. stack, můžete skutečně převzít kontrolu 913 00:46:14,970 --> 00:46:17,050 z počítačového systému poměrně snadno. 914 00:46:17,050 --> 00:46:22,180 Můžete se proniknout do systému, pokud lidé jako my nenapsal náš kód 915 00:46:22,180 --> 00:46:23,300 velmi dobře. 916 00:46:23,300 --> 00:46:26,670 >> Pokud se lidé jako my používají kusy paměťových nebo použití polí - 917 00:46:26,670 --> 00:46:27,810 ještě častěji - 918 00:46:27,810 --> 00:46:31,800 ale někdy nezapomeňte zkontrolovat Hranice naší nabídku, jak si můžete 919 00:46:31,800 --> 00:46:38,470 Nechat se někdy, a opakoval příliš daleko za koncem pole. 920 00:46:38,470 --> 00:46:40,520 V nejlepším případě je váš program může jen pád. 921 00:46:40,520 --> 00:46:42,280 Segmentation fault, druh trapné. 922 00:46:42,280 --> 00:46:45,480 Nic moc, ale není to nezbytně velmi špatné. 923 00:46:45,480 --> 00:46:49,480 >> Ale pokud váš program je vlastně v reálném počítače uživatelů, pokud je to běh 924 00:46:49,480 --> 00:46:53,070 na internetových stránkách, že skutečné náhodné občany, na internetu se bít, pronájem 925 00:46:53,070 --> 00:46:56,690 lidí vyvolat špatné věci ve vašem kódu obecně není dobrá věc, protože 926 00:46:56,690 --> 00:46:59,930 to znamená, že příležitost k ovládání z počítače. 927 00:46:59,930 --> 00:47:01,350 A to bude vypadat trochu záhadný. 928 00:47:01,350 --> 00:47:04,570 Ale já jsem myslel, že bych tě vyděsit se Tento poslední příklad zde. 929 00:47:04,570 --> 00:47:05,650 >> Zde je příklad kódu. 930 00:47:05,650 --> 00:47:07,370 A je to dobrý Wikipedia článek, který prochází 931 00:47:07,370 --> 00:47:08,530 to podrobněji. 932 00:47:08,530 --> 00:47:13,890 Mám hlavní na spodní povolání foo, procházející v argv dne 1.. 933 00:47:13,890 --> 00:47:15,750 A to jen proto, že můžete spustit program a předat 934 00:47:15,750 --> 00:47:17,080 libovolný vstup. 935 00:47:17,080 --> 00:47:20,180 >> A pak foo oznámeny až nahoře jak přijímat řetězec, nebo více 936 00:47:20,180 --> 00:47:21,700 přesně, char *. 937 00:47:21,700 --> 00:47:23,860 To pak deklaruje pole znaků. 938 00:47:23,860 --> 00:47:27,130 Nazvěme to buffer, obecněji, o velikosti 12. 939 00:47:27,130 --> 00:47:30,900 Takže 12 znaků vejde dovnitř tohoto pole s názvem C. 940 00:47:30,900 --> 00:47:33,510 >> A pak se to používá tuto novou funkci, který je nový, ale není těžké 941 00:47:33,510 --> 00:47:34,930 Rozumím, paměti kopii. 942 00:47:34,930 --> 00:47:39,290 To zkopíruje paměť z baru, který byl proměnná n minulosti, bez ohledu na 943 00:47:39,290 --> 00:47:42,080 uživatel zadat do argv 1 do cca. 944 00:47:42,080 --> 00:47:43,090 Kolik bajtů? 945 00:47:43,090 --> 00:47:44,260 Délka řetězce baru. 946 00:47:44,260 --> 00:47:48,380 >> Takže jinými slovy, v případě, že uživatel zadá h-e-l-l-o enter, délka řetězce 947 00:47:48,380 --> 00:47:49,260 z ahoj je pět. 948 00:47:49,260 --> 00:47:52,790 Takže pět z těchto bytů bude mít zkopírovány do pole s názvem C, což 949 00:47:52,790 --> 00:47:54,110 je o velikosti 12. 950 00:47:54,110 --> 00:47:58,710 Ale to, co uživatel zadá mnohem déle Slovo, které je 13 znaků nebo 14 951 00:47:58,710 --> 00:48:01,250 znaků nebo 100 nebo více znaků? 952 00:48:01,250 --> 00:48:02,660 >> Kam se chystají jít? 953 00:48:02,660 --> 00:48:06,090 No, to rám, že je zásobník v jídelně zásobníku, 954 00:48:06,090 --> 00:48:06,930 jdou tam jít. 955 00:48:06,930 --> 00:48:10,080 A je to jen začnou přepisovat další věci, které už 956 00:48:10,080 --> 00:48:12,880 na tomto zásobníku, přetékající zásobník, abych tak řekl. 957 00:48:12,880 --> 00:48:14,780 >> Takže obrazně, myslím, že to takhle. 958 00:48:14,780 --> 00:48:17,970 To je jen barevné verze obrázek jsme byli kreslení. 959 00:48:17,970 --> 00:48:20,060 V dolní části, řekněme, je hlavní. 960 00:48:20,060 --> 00:48:24,690 A na vrcholu, co vidíte teď Rám je, barevně značená nyní, pro 961 00:48:24,690 --> 00:48:26,090 volána funkce foo. 962 00:48:26,090 --> 00:48:30,170 Ale co je zajímavé, o foo je, že tady je jeho rám. 963 00:48:30,170 --> 00:48:32,860 Takže je vypracován tak jako já udělal, ale ve světle modré barvě. 964 00:48:32,860 --> 00:48:35,220 A teď to je místo, kde c držák 0 jde. 965 00:48:35,220 --> 00:48:37,410 A to je místo, kde c držák 11 se chystá skončit. 966 00:48:37,410 --> 00:48:39,670 >> Jinými slovy, to se stane může být reprezentován jako čtverce. 967 00:48:39,670 --> 00:48:42,320 Ale pokud si jen udržet plopping bajtů dolů - nebo znaky - jdou až do konce 968 00:48:42,320 --> 00:48:46,070 se na místě 0 až nahoru na 11, protože je to 0 indexovány. 969 00:48:46,070 --> 00:48:49,170 >> Ale kde je 13. znak Skončím? 970 00:48:49,170 --> 00:48:50,310 Kde je 14? 971 00:48:50,310 --> 00:48:52,430 Kde je 50. znak Skončím? 972 00:48:52,430 --> 00:48:54,070 >> Bude to dál dolů. 973 00:48:54,070 --> 00:48:57,350 Protože i když jsme vypracovány obraz s zásobníku vyrůstal, 974 00:48:57,350 --> 00:48:59,920 adresy, to dopadá, jít od malé adresy, malé 975 00:48:59,920 --> 00:49:01,830 ukazatele, na velkých adresy. 976 00:49:01,830 --> 00:49:03,540 Tak to prostě pořád jít výš a výš. 977 00:49:03,540 --> 00:49:05,660 >> Takže v případě, že uživatel zadá Dobrý den, to je skvělé. 978 00:49:05,660 --> 00:49:08,650 Žádný problém, žádný problém, každý je v bezpečí. 979 00:49:08,650 --> 00:49:11,940 Ale v případě, že uživatel zadá, co budeme zavolejte kontradiktorní kód, zastoupená 980 00:49:11,940 --> 00:49:16,040 druhově jako, útok, útok, Útok, útok, může, co se stalo? 981 00:49:16,040 --> 00:49:19,760 >> No, pokud jsou všechny vstupu, že uživatel zadali není jen nějaký přátelský 982 00:49:19,760 --> 00:49:21,540 nebo urážlivé řetězec znaků. 983 00:49:21,540 --> 00:49:24,050 Je to vlastně posloupnost znaků že pokud si ji pořídil, 984 00:49:24,050 --> 00:49:26,050 to vlastně je kód. 985 00:49:26,050 --> 00:49:29,570 Možná je to kód, který odstraní všechny soubory na vašem pevném disku nebo odesílá spam 986 00:49:29,570 --> 00:49:30,810 nebo něco takového. 987 00:49:30,810 --> 00:49:35,110 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 988 00:49:35,110 --> 00:49:37,830 přepsat červený kus paměti - 989 00:49:37,830 --> 00:49:41,080 které jsem nevytáhl na mém obrázku, ale tento obrázek Wikipedia zde má - 990 00:49:41,080 --> 00:49:42,890 jeho tzv. zpáteční adresa. 991 00:49:42,890 --> 00:49:47,470 >> Když jídlo vrací, když swapové přiznání, jak se počítač vědět, jít od 992 00:49:47,470 --> 00:49:49,790 se sem tady dole? 993 00:49:49,790 --> 00:49:52,920 Nebo v tech segmentu nahoře, jak to vím, jít ze swapu 994 00:49:52,920 --> 00:49:54,870 kód - 0 a 1 je , které tvoří odkládací - 995 00:49:54,870 --> 00:49:56,020 Zpět na hlavní stranu? 996 00:49:56,020 --> 00:50:00,450 K dispozici je tzv. zpáteční adresa uloženy ve stejném zásobníku rám, na 997 00:50:00,450 --> 00:50:02,140 stejné jídelna zásobník. 998 00:50:02,140 --> 00:50:06,080 >> Takže v případě, že padouch je natolik chytrý, aby vložte kód útoku, útok kód, útok 999 00:50:06,080 --> 00:50:07,960 kód a získat štěstí - 1000 00:50:07,960 --> 00:50:11,630 často prostřednictvím pokusů a omylů - do přepsat červené zpáteční adresu, 1001 00:50:11,630 --> 00:50:14,360 s adresou a oznámení na samý vrchol. 1002 00:50:14,360 --> 00:50:16,830 Všimněte si, 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Je napsán zpět nahoru nahoru pro Důvody budeme snad znovu. 1004 00:50:20,650 --> 00:50:22,050 Je to, že číslo. 1005 00:50:22,050 --> 00:50:25,790 >> Takže pokud padouch dostane štěstí nebo je dost chytrý, aby přepsat červená 1006 00:50:25,790 --> 00:50:29,480 pás z paměti s adresou Kód, který on nebo ona má nějak 1007 00:50:29,480 --> 00:50:34,980 vstřikuje do počítače, myslím, jehož kód bude vrácena 1008 00:50:34,980 --> 00:50:38,260 jakmile foo se provádí spuštěním? 1009 00:50:38,260 --> 00:50:39,440 >> Padoucha v code. 1010 00:50:39,440 --> 00:50:43,610 Takže ten útok kódu, AAA, znovu, možná odesílání nevyžádané pošty, může odstranit všechny soubory 1011 00:50:43,610 --> 00:50:44,500 na pevném disku. 1012 00:50:44,500 --> 00:50:48,740 Ale to je to, co skutečně přetečení zásobníku je, nebo přetečení vyrovnávací paměti, nebo 1013 00:50:48,740 --> 00:50:51,060 buffer overflow útok. 1014 00:50:51,060 --> 00:50:54,400 >> A je to neuvěřitelně, neuvěřitelně časté k tomuto dni s programy napsané v 1015 00:50:54,400 --> 00:50:58,220 C, C + +, a dokonce i některé další jazyky. 1016 00:50:58,220 --> 00:51:02,275 Na tomto děsivé vědomí, budeme končí vtip. 1017 00:51:02,275 --> 00:51:03,230 >> [Smích] 1018 00:51:03,230 --> 00:51:04,550 >> Uvidíme se ve středu. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Na další CS50 - 1021 00:51:10,310 --> 00:51:15,920 Takže jsem vše z disku lamp, ale dnes počkejte, odtučněné mléko, polovina telefon 1022 00:51:15,920 --> 00:51:17,850 kniha, pomerančový džus že jsem pil dnes. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB kabel, klíč. 1025 00:51:22,780 --> 00:51:24,800 >> [Přehrávání hudby]