1 00:00:00,000 --> 00:00:10,970 >> [Přehrávání hudby] 2 00:00:10,970 --> 00:00:12,536 >> David J. Malan: Dobře. 3 00:00:12,536 --> 00:00:13,392 >> [Smích] 4 00:00:13,392 --> 00:00:14,240 >> Vítej zpátky. 5 00:00:14,240 --> 00:00:14,990 Toto je CS50. 6 00:00:14,990 --> 00:00:16,890 A to do konce týdne pět. 7 00:00:16,890 --> 00:00:20,020 A až do teď, máme docela hodně bral za samozřejmé, že 8 00:00:20,020 --> 00:00:23,480 existuje tento kompilátor, klap, které jste bylo vyvolání prostřednictvím této 9 00:00:23,480 --> 00:00:27,100 další nástroj s názvem Udělat to nějak jako mávnutím kouzelného proutku změní váš zdrojový kód 10 00:00:27,100 --> 00:00:31,350 do objektového kódu, se nul a jedniček že vaše počítače CPU, centrální 11 00:00:31,350 --> 00:00:33,410 procesorová jednotka, skutečně rozumí. 12 00:00:33,410 --> 00:00:36,770 Ale ukazuje se, že je to číslo, které je děje pod kapotou v 13 00:00:36,770 --> 00:00:38,690 mezi vstupem a výstupem. 14 00:00:38,690 --> 00:00:41,800 >> A já bych chtěl navrhnout, aby se maso že v trochu podrobněji do 15 00:00:41,800 --> 00:00:45,130 Tyto čtyři kroky, mít něco, co nazývá předzpracování, co 16 00:00:45,130 --> 00:00:48,300 tzv. kompilace, které jsme viděli, něco jako montáž a 17 00:00:48,300 --> 00:00:49,420 něco, co nazývá propojení. 18 00:00:49,420 --> 00:00:53,270 Takže až do teď, v některé z našich programy, jsme měli ostré obsahuje. 19 00:00:53,270 --> 00:00:56,650 V poslední době jsme měli nějaké ostré definuje konstant. 20 00:00:56,650 --> 00:01:00,660 Tak to dopadá, že ty věci, které mají před hash symbol nebo 21 00:01:00,660 --> 00:01:04,150 libra symbol jsou pre-procesor směrnice. 22 00:01:04,150 --> 00:01:07,960 To je jen ozdobný způsob, jak říkat, že je to řádek kódu, který je vlastně 23 00:01:07,960 --> 00:01:12,280 převedeny do něčeho jiného, ​​než se Počítač se dokonce pokusit převést své 24 00:01:12,280 --> 00:01:13,800 Program do nul a jedniček. 25 00:01:13,800 --> 00:01:19,000 >> Například, ostrý obsahuje standardní I / O. H, do značné míry prostě znamená jít 26 00:01:19,000 --> 00:01:24,010 dopředu, chytit obsah souborů stdio.h a vložit je přímo tam. 27 00:01:24,010 --> 00:01:25,880 Takže žádné nul a jedniček v tomto bodě ještě. 28 00:01:25,880 --> 00:01:27,470 Je to opravdu jen substituce. 29 00:01:27,470 --> 00:01:30,790 A to se stalo během tzv. pre-fázi zpracování, při 30 00:01:30,790 --> 00:01:34,230 vlastně běží Clang nebo specificky Aby se ve většině případů. 31 00:01:34,230 --> 00:01:36,950 Takže všechno se dělo První automaticky tak daleko. 32 00:01:36,950 --> 00:01:38,800 >> Pak přichází krok kompilace. 33 00:01:38,800 --> 00:01:40,920 Ale byli jsme příliš zjednodušený kompilace. 34 00:01:40,920 --> 00:01:45,060 Kompilace programu opravdu znamená vezměte si ji z něčeho, jako je C, 35 00:01:45,060 --> 00:01:48,430 Zdrojový kód jsme psali, se na něco, co nazývá montáž. 36 00:01:48,430 --> 00:01:52,900 Jazyk symbolických instrukcí je nižší úroveň jazyk, který naštěstí nebudeme 37 00:01:52,900 --> 00:01:55,480 mají hodně příležitostí k napsat tento semestr. 38 00:01:55,480 --> 00:01:59,100 Ale to je na nejnižší úrovni v pocit, že jste doslova začít psát 39 00:01:59,100 --> 00:02:04,270 sčítat a odčítat a násobit a načíst z paměti a uložit do paměti, 40 00:02:04,270 --> 00:02:08,259 velmi základní pokyny, které počítač, pod kapotou, 41 00:02:08,259 --> 00:02:09,639 skutečně rozumí. 42 00:02:09,639 --> 00:02:14,930 >> Konečně, montáž se tento jazyk do nul a jedniček, které jsme byli 43 00:02:14,930 --> 00:02:16,190 popisovat tak daleko. 44 00:02:16,190 --> 00:02:19,270 A opravdu nakonec, je tu tzv. propojení fáze, které použijeme 45 00:02:19,270 --> 00:02:22,360 vidět za chvíli, která spojuje Vaše nul a jedniček s nulami a 46 00:02:22,360 --> 00:02:24,870 ty ostatní lidé před jste vytvořili. 47 00:02:24,870 --> 00:02:26,660 >> Takže zvažte to super jednoduchý program. 48 00:02:26,660 --> 00:02:27,560 To bylo od 1. týdne. 49 00:02:27,560 --> 00:02:29,610 Je to jen řekl, Hello World, na obrazovce. 50 00:02:29,610 --> 00:02:30,920 Běželi jsme to přes Clang. 51 00:02:30,920 --> 00:02:33,200 Nebo jsme běželi, že přes Udělat který běžel Clang. 52 00:02:33,200 --> 00:02:36,170 A výstup v době, kdy některé nul a jedniček. 53 00:02:36,170 --> 00:02:38,100 Ale ukazuje se, že je mezikrok. 54 00:02:38,100 --> 00:02:40,460 Když jdu sem - pardon, ne Chci ho vidět ještě. 55 00:02:40,460 --> 00:02:44,800 Když jdu sem k mému spotřebiče a otevřu hello.c, zde 56 00:02:44,800 --> 00:02:46,160 je to stejný program. 57 00:02:46,160 --> 00:02:48,600 A co budu dělat ve svém terminálu Okno je zde budu 58 00:02:48,600 --> 00:02:51,430 spustit Clang spíše než značka, která automatizuje všechny čtyři 59 00:02:51,430 --> 00:02:52,870 tyto kroky u nás. 60 00:02:52,870 --> 00:02:58,620 A já budu dělat klap-S a pak hello.c a zadejte. 61 00:02:58,620 --> 00:03:00,590 >> A já si blikající výzva znovu, což je dobré. 62 00:03:00,590 --> 00:03:05,280 A nyní v mírně větší okno, Jdu otevřít gedit tady. 63 00:03:05,280 --> 00:03:09,610 A já jdu otevřít soubor, který, Ukázalo se, že je to tzv. hello.s 64 00:03:09,610 --> 00:03:11,870 obsahuje toto jazyk symbolických instrukcí Jsem se zmínil dříve. 65 00:03:11,870 --> 00:03:15,060 A to je to, co se nazývá montáž jazyk, poměrně nízké úrovni 66 00:03:15,060 --> 00:03:18,470 instrukce, že váš procesor Intel nebo co to je, že je uvnitř 67 00:03:18,470 --> 00:03:19,350 chápe. 68 00:03:19,350 --> 00:03:24,480 A mov je k nastěhování. Výzva je určena pro volání, velmi nízkou úroveň funkce. 69 00:03:24,480 --> 00:03:26,380 sub je pro odčítání. 70 00:03:26,380 --> 00:03:30,370 >> Takže když máte konkrétní procesor uvnitř počítače, co je to 71 00:03:30,370 --> 00:03:34,300 odlišné versus ostatní procesorů na trhu, který je instrukce se 72 00:03:34,300 --> 00:03:39,460 chápe a často, jak efektivní je je, jak rychle je na provádění některých 73 00:03:39,460 --> 00:03:40,380 z těchto instrukcí. 74 00:03:40,380 --> 00:03:45,150 Nyní pro více na toto téma, můžete se Další pád CS61 na vysoké škole. 75 00:03:45,150 --> 00:03:48,170 Ale zde se, například, několik identifikátory, které by mohly připadat povědomý. 76 00:03:48,170 --> 00:03:50,150 hello.c je název programu. 77 00:03:50,150 --> 00:03:51,070 >> . Textu - 78 00:03:51,070 --> 00:03:54,190 že to není moc zajímavé, že právě teď, připomínají, že text 79 00:03:54,190 --> 00:03:59,190 segmentu, v pondělí, je místo, kde v Paměť váš program vlastně skončí. 80 00:03:59,190 --> 00:04:01,330 Tak to alespoň mlhavě zná tam. 81 00:04:01,330 --> 00:04:03,730 Zde se samozřejmě, je zmínka naší hlavní funkce. 82 00:04:03,730 --> 00:04:07,220 Rolování dolů, ty naleznete na věci tzv. registry, velmi malé kousky 83 00:04:07,220 --> 00:04:09,190 paměť uvnitř vaší aktuální CPU. 84 00:04:09,190 --> 00:04:12,930 A když jsem se posunout dolů, i dále, vidím nějaký 85 00:04:12,930 --> 00:04:14,240 nepřímé zmínky o ASCII. 86 00:04:14,240 --> 00:04:17,120 A tam, samozřejmě, je to, že řetězec, ahoj, čárka, svět. 87 00:04:17,120 --> 00:04:20,079 >> Tak dlouhý příběh krátký, to bylo děje pro vás, automaticky, 88 00:04:20,079 --> 00:04:22,140 pod kapotou celou tuto dobu. 89 00:04:22,140 --> 00:04:26,450 A to, co se děje ve skutečnosti je jednou co jste spustili Clang, nebo prostřednictvím 90 00:04:26,450 --> 00:04:29,150 Zkontrolujte, že jste stále poprvé, ze zdrojového kódu, 91 00:04:29,150 --> 00:04:30,700 tzv. jazyce symbolických instrukcí. 92 00:04:30,700 --> 00:04:35,210 Pak zvonění je převod tohoto shromáždění jazyk až do nul a jedniček. 93 00:04:35,210 --> 00:04:38,340 A to je snímek, který jsme začali naše diskuse v týdnu 0, o - 94 00:04:38,340 --> 00:04:39,840 a pak týden 1 dále. 95 00:04:39,840 --> 00:04:44,030 A nakonec, ty nuly a jedničky jsou v kombinaci s nulami a jedničkami 96 00:04:44,030 --> 00:04:47,190 z těchto knihoven jsme se při za samozřejmost, jako je Standard I / O nebo 97 00:04:47,190 --> 00:04:50,010 String knihovny, nebo dokonce CS50 knihovna. 98 00:04:50,010 --> 00:04:54,200 >> Takže malovat tento obrázek více vizuálně, máme hello.c. 99 00:04:54,200 --> 00:04:57,220 A, samozřejmě, používá printf fungovat říci, hello world. 100 00:04:57,220 --> 00:05:01,810 Kompilace krok se dolů do tento soubor jsme právě viděli hello.s, a to i 101 00:05:01,810 --> 00:05:04,290 že i když je obvykle odstraněn automaticky za vás. 102 00:05:04,290 --> 00:05:06,050 Ale to je kód assembleru uprostřed kroku. 103 00:05:06,050 --> 00:05:09,750 A pak, když jsme se sestavit sestavy jazyk, abych tak řekl, to je, když jste 104 00:05:09,750 --> 00:05:10,830 dostat ty nul a jedniček. 105 00:05:10,830 --> 00:05:13,920 Takže jsme přiblížili efektivně dnes co jsme užívali jako samozřejmost, 106 00:05:13,920 --> 00:05:16,430 znamená jít zdrojový kód objektového kódu. 107 00:05:16,430 --> 00:05:18,850 >> Ale nakonec, teď ten stejný obrázek - pojďme strčit ji do 108 00:05:18,850 --> 00:05:20,020 na levé straně. 109 00:05:20,020 --> 00:05:22,880 A všimněme si, že ve vrcholu Zmínil jsem se stdio.h. 110 00:05:22,880 --> 00:05:25,030 Je to soubor, který jsme součástí téměř ve všech 111 00:05:25,030 --> 00:05:26,250 programy, psali jsme. 112 00:05:26,250 --> 00:05:28,830 A to je ten soubor, jehož obsah dostat kopii vložit, 113 00:05:28,830 --> 00:05:30,350 účinně vrcholu kódu. 114 00:05:30,350 --> 00:05:34,170 Ale ukazuje se, že na počítači systém někde, tam je pravděpodobně 115 00:05:34,170 --> 00:05:39,150 stdio.c soubor, který někdo napsal let před, který implementuje všechny 116 00:05:39,150 --> 00:05:41,870 funkce, které jsou deklarovány v stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Nyní ve skutečnosti je to asi není na Mac nebo PC, nebo dokonce v 118 00:05:45,465 --> 00:05:47,660 CS50 spotřebič je surový C kód. 119 00:05:47,660 --> 00:05:52,710 Někdo již zkompilovaný a to včetně . O soubor pro cílový kód nebo. 120 00:05:52,710 --> 00:05:56,020 soubor, který odkazuje na sdílené knihovny , který byl předinstalován a 121 00:05:56,020 --> 00:05:57,240 předkompilován pro vás. 122 00:05:57,240 --> 00:06:01,950 Ale předpokládám, že tam skutečně existuje na našem počítači stdio.c v paralelní 123 00:06:01,950 --> 00:06:02,650 s Clang. 124 00:06:02,650 --> 00:06:04,960 Váš kód je zkompilován a smontovány. 125 00:06:04,960 --> 00:06:09,200 stdio.c je kód se kompiluje a sestaveny tak, že právě tato poslední 126 00:06:09,200 --> 00:06:13,730 krok, tady dole, musíme nějak odkaz, abych tak řekl, vaše nul a jedniček 127 00:06:13,730 --> 00:06:18,430 s jeho nebo její nul a jedniček do jednoho jednoduchý program, který v konečném důsledku je 128 00:06:18,430 --> 00:06:20,540 volal jen Hello. 129 00:06:20,540 --> 00:06:23,340 >> Tak to je vše o kouzlu, které je se děje tak daleko. 130 00:06:23,340 --> 00:06:26,430 A bude i nadále, aby se tyto procesy samozřejmost, ale uvědomit, 131 00:06:26,430 --> 00:06:28,750 je tu spousta šťavnatých detailů děje pod tam. 132 00:06:28,750 --> 00:06:31,920 A to je to, co dělá vaše počítač s Intel Inside 133 00:06:31,920 --> 00:06:33,940 zvláště zřetelný. 134 00:06:33,940 --> 00:06:37,020 >> Takže v takovém případě, pokud chcete, aby Připojte se k nám na oběd v pátek, to jít 135 00:06:37,020 --> 00:06:41,570 na obvyklém místě cs50.net/rsvp, 13:15 tento pátek. 136 00:06:41,570 --> 00:06:43,400 A nyní několik oznámení. 137 00:06:43,400 --> 00:06:44,670 Takže máme dobrou zprávu. 138 00:06:44,670 --> 00:06:45,970 A máme špatné zprávy. 139 00:06:45,970 --> 00:06:47,260 Začněte s nějakou dobrou zprávou zde. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Sténání] 142 00:06:54,510 --> 00:06:54,710 >> Dobrá. 143 00:06:54,710 --> 00:06:56,670 No, je to technicky dovolenou, tak to není tak moc Dárek od nás. 144 00:06:56,670 --> 00:06:58,030 Ale pak ta špatná zpráva samozřejmě. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Sténání] 147 00:07:01,880 --> 00:07:03,530 >> Strávil jsem hodně času těchto animací. 148 00:07:03,530 --> 00:07:04,690 >> [Smích] 149 00:07:04,690 --> 00:07:07,000 >> K dispozici bude přezkum zasedání letos v pondělí. 150 00:07:07,000 --> 00:07:08,340 Bude to být v 17:30. 151 00:07:08,340 --> 00:07:11,210 My vám připomene všech těchto detailů prostřednictvím e-mailu na kurz je 152 00:07:11,210 --> 00:07:13,470 internetové stránky jen pár dní čas. 153 00:07:13,470 --> 00:07:16,610 To bude natočen a zpřístupněny krátce poté. 154 00:07:16,610 --> 00:07:19,200 Takže pokud nemůžete dělat, že pondělí noc slot, neboj se. 155 00:07:19,200 --> 00:07:22,270 Sekce letos týden bude také zaměřit na přezkoumání na kvíz. 156 00:07:22,270 --> 00:07:25,670 Pokud váš oddíl je v pondělí, což je opravdu univerzitní prázdniny, budeme 157 00:07:25,670 --> 00:07:26,920 stále setkávají v části. 158 00:07:26,920 --> 00:07:28,890 Pokud si prostě nemůže dělat, že část, protože budete 159 00:07:28,890 --> 00:07:29,860 pryč, to je v pořádku. 160 00:07:29,860 --> 00:07:33,710 Zúčastněte neděli nebo úterý oddílu nebo naladit v oddílu Jasonova, což je 161 00:07:33,710 --> 00:07:35,110 k dispozici online. 162 00:07:35,110 --> 00:07:37,490 >> Takže, další špatné zprávy. 163 00:07:37,490 --> 00:07:41,960 Takže v souladu s osnovou, máme přednášku příští pátek. 164 00:07:41,960 --> 00:07:43,690 Ale dobrá zpráva - 165 00:07:43,690 --> 00:07:44,860 jasně, jsem strávil příliš mnoho času na to. 166 00:07:44,860 --> 00:07:45,280 >> [Smích] 167 00:07:45,280 --> 00:07:47,140 >> Budeme zrušit další pátečních přednášek. 168 00:07:47,140 --> 00:07:50,590 Takže to bude dárek pro nás, takže může mít opravdu krásný odpočinek v 169 00:07:50,590 --> 00:07:52,990 Mezi tento týden a dva týdny od této doby. 170 00:07:52,990 --> 00:07:57,460 Takže žádné přednášky příští týden, jen malý malý kvíz, pro které by měl být 171 00:07:57,460 --> 00:07:59,030 stále více vzrušený. 172 00:07:59,030 --> 00:08:03,870 >> Takže pojďme se zaměřit na něco, co se ve skutečnosti vizuální 173 00:08:03,870 --> 00:08:06,990 a více vzrušující a půdu za to, co se děje, že je na obzoru 174 00:08:06,990 --> 00:08:08,420 jen na pár týdnů. 175 00:08:08,420 --> 00:08:12,160 Po prvním testu, budeme zase zaměření našich problémových souborů na jiný 176 00:08:12,160 --> 00:08:16,710 domény specifický problém, který z forenzní nebo bezpečnostních obecněji. 177 00:08:16,710 --> 00:08:19,550 >> Ve skutečnosti, tradice s tímto problémem set je pro mě jeden z 178 00:08:19,550 --> 00:08:24,850 výuky kolegy nebo CAS chodit po Areál přičemž některé fotografií 179 00:08:24,850 --> 00:08:29,450 identifikovatelné, ale bez zjevné lidem, místa, nebo věci, pak každý rok jsem 180 00:08:29,450 --> 00:08:34,520 nějak podaří omylem smazat nebo poškození digitální paměťovou kartu 181 00:08:34,520 --> 00:08:35,720 že je v naší kamery. 182 00:08:35,720 --> 00:08:36,860 Ale žádný velký problém. 183 00:08:36,860 --> 00:08:39,200 Můžu jít dál a připojte že do svého počítače. 184 00:08:39,200 --> 00:08:43,010 Můžu udělat forenzní obraz, takže mluvit, zkopírováním a nul 185 00:08:43,010 --> 00:08:46,830 ty off této paměťové karty, ať už jeho karta SD nebo Compact Flash karty nebo 186 00:08:46,830 --> 00:08:48,100 co jste zvyklí. 187 00:08:48,100 --> 00:08:49,300 A pak můžeme předat, že ven. 188 00:08:49,300 --> 00:08:53,190 >> A tak výzvou do budoucna, mimo jiné co pro vás bude psát 189 00:08:53,190 --> 00:08:58,630 C kódu, který využívá spoustu JPEG pro mě a ukázalo se bude 190 00:08:58,630 --> 00:09:00,190 ti lidé, místa nebo věci. 191 00:09:00,190 --> 00:09:03,340 A budeme také mluvit, v tomto problému nastavit a v příštích dnech, o 192 00:09:03,340 --> 00:09:04,440 grafiky obecně. 193 00:09:04,440 --> 00:09:06,140 Použili jsme je, kurz, pro vypuknout. 194 00:09:06,140 --> 00:09:09,080 Ale ty jsi nějak za samozřejmost existuje vysoké úrovni tyto pojmy 195 00:09:09,080 --> 00:09:10,680 obdélníky a ovály. 196 00:09:10,680 --> 00:09:12,450 Ale pod kapotou tam jsou pixely. 197 00:09:12,450 --> 00:09:14,370 A vy jste musel začít přemýšlet o nich. 198 00:09:14,370 --> 00:09:18,800 Nebo budete pro p-set 4 myslet o rozdílu mezi vaše cihel, jak 199 00:09:18,800 --> 00:09:21,990 rychle jste míč pohybující se po obrazovka pro vypuknout. 200 00:09:21,990 --> 00:09:24,830 Takže tam je to pojem tečky na obrazovce, která je 201 00:09:24,830 --> 00:09:26,290 vstupují do hry již. 202 00:09:26,290 --> 00:09:29,430 >> Teď to, co vidíte, když je to, co se dostanete na obrazovce počítače. 203 00:09:29,430 --> 00:09:33,680 Pokud jste někdy sledovali nějaké dobré nebo špatný TV, je pravděpodobné, že do značné míry 204 00:09:33,680 --> 00:09:36,280 léčbě publikum jako technofobií kteří nemají opravdu 205 00:09:36,280 --> 00:09:37,630 vědět hodně o počítači. 206 00:09:37,630 --> 00:09:40,840 A tak je to velmi snadné pro policii detektiv říci, můžete 207 00:09:40,840 --> 00:09:41,710 vyčistěte, že pro mě? 208 00:09:41,710 --> 00:09:42,710 Nebo zlepšit, ne? 209 00:09:42,710 --> 00:09:45,550 Posílit je jako Buzz slovo v téměř jakýkoli trestný čin související show. 210 00:09:45,550 --> 00:09:49,240 A realita je, pokud budete mít velmi rozmazaný obraz podezřelého dělá 211 00:09:49,240 --> 00:09:51,620 něco špatného, ​​nemůžete Jen zvýšení. 212 00:09:51,620 --> 00:09:53,080 Nemůžete přiblížit nekonečně. 213 00:09:53,080 --> 00:09:56,350 Nevidíte v záblesk něčí oko, který spáchal, že 214 00:09:56,350 --> 00:09:59,860 konkrétního trestného činu, a to navzdory Prevalence tohoto v televizi. 215 00:09:59,860 --> 00:10:04,110 >> A tak s tím pojďme motivovat, aby Blížící se problém souprava s pohled na 216 00:10:04,110 --> 00:10:05,765 Některé ukazuje, se kterou může být povědomý. 217 00:10:05,765 --> 00:10:06,500 >> [PŘEHRÁVÁNÍ] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Nyní se pojďme dobré podívat se na vás. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Drž to. 222 00:10:17,766 --> 00:10:18,658 Spustit to zpátky. 223 00:10:18,658 --> 00:10:19,550 >> -Počkej chvíli. 224 00:10:19,550 --> 00:10:21,580 Jděte vpravo. 225 00:10:21,580 --> 00:10:21,800 >> -Tam. 226 00:10:21,800 --> 00:10:22,690 Freeze to. 227 00:10:22,690 --> 00:10:23,692 >> -Celý displej. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Freeze to. 230 00:10:24,154 --> 00:10:25,140 >> -Utáhněte na to, že se máš? 231 00:10:25,140 --> 00:10:27,090 >> -Vector na uvedeném chlapa od zadního kola. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom tady na tomto místě. 233 00:10:29,730 --> 00:10:33,700 >> -Se správným vybavením, zobrazované lze zvětšit a naostřené. 234 00:10:33,700 --> 00:10:34,490 >> -Co je to? 235 00:10:34,490 --> 00:10:35,870 >> -Je to vylepšení programu. 236 00:10:35,870 --> 00:10:36,793 >> -Můžeš jasné, že se nějaké? 237 00:10:36,793 --> 00:10:38,560 >> -Já nevím. 238 00:10:38,560 --> 00:10:39,090 Pojďme zvýšení. 239 00:10:39,090 --> 00:10:41,690 >> -Vylepšete část A-6. 240 00:10:41,690 --> 00:10:43,510 >> -I lepší detail, a - 241 00:10:43,510 --> 00:10:44,456 >> -Myslím, že je dost zlepšit. 242 00:10:44,456 --> 00:10:45,402 Uvolněte jej do mé obrazovce. 243 00:10:45,402 --> 00:10:47,300 >> -Zvýšit odraz v očích. 244 00:10:47,300 --> 00:10:49,330 >> -Pojďme tento příkaz prostřednictvím Vylepšení videa. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, můžete zlepšit to? 246 00:10:50,340 --> 00:10:52,320 >> -Vydrž. 247 00:10:52,320 --> 00:10:54,290 >> -I've pracuje na této úvahy. 248 00:10:54,290 --> 00:10:55,560 >> -Někdo reflexe. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Je to odrazem z obličeje. 251 00:10:57,940 --> 00:10:58,860 >> -Reflexe. 252 00:10:58,860 --> 00:10:59,710 >> -Je to odraz. 253 00:10:59,710 --> 00:11:00,900 >> -Přibližte na zrcadle. 254 00:11:00,900 --> 00:11:03,500 >> -Můžete vidět odraz. 255 00:11:03,500 --> 00:11:04,700 >> -Můžeš zlepšit image odsud? 256 00:11:04,700 --> 00:11:05,700 >> -Můžete zvýšit ho tady? 257 00:11:05,700 --> 00:11:06,500 >> -Můžete zlepšit to? 258 00:11:06,500 --> 00:11:07,380 >> -Můžete zlepšit to? 259 00:11:07,380 --> 00:11:08,190 >> -Můžeme zlepšit to? 260 00:11:08,190 --> 00:11:08,940 >> -Můžete zlepšit to? 261 00:11:08,940 --> 00:11:10,280 >> -Počkej chvilku, já zlepšit. 262 00:11:10,280 --> 00:11:11,570 >> -Přibližte na dveře. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Smích] 266 00:11:13,197 --> 00:11:14,360 >> -Nastěhování 267 00:11:14,360 --> 00:11:15,100 >> -Počkej, přestaň. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> Pauzy to. 270 00:11:16,290 --> 00:11:19,390 >> -Otočit o 75 stupňů kolem vertikální prosím. 271 00:11:19,390 --> 00:11:19,886 >> [Smích] 272 00:11:19,886 --> 00:11:24,350 >> -Zastavte a zpět na část, o dveřím. 273 00:11:24,350 --> 00:11:26,330 >> Máte-o Image Enhancer které mohou bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Možná, že můžeme použít pradeep Sen způsob, jak nahlédnout do oken. 275 00:11:28,990 --> 00:11:30,680 >> -Tento software je nejmodernější. 276 00:11:30,680 --> 00:11:31,676 >> -Ikona hodnota je vypnuto. 277 00:11:31,676 --> 00:11:34,166 >> -Se správnou kombinací algoritmů. 278 00:11:34,166 --> 00:11:38,399 >> -Vzal osvětlení algoritmy další úroveň a mohu použít k 279 00:11:38,399 --> 00:11:38,648 doplnění tohoto snímku. 280 00:11:38,648 --> 00:11:42,050 >> -Lock a zvětšení z-osa. 281 00:11:42,050 --> 00:11:42,760 >> -Vylepšete. 282 00:11:42,760 --> 00:11:43,060 >> -Vylepšete. 283 00:11:43,060 --> 00:11:43,760 >> -Vylepšete. 284 00:11:43,760 --> 00:11:45,010 >> Freeze a zlepšit. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END PŘEHRÁVÁNÍ] 287 00:11:47,910 --> 00:11:51,470 >> David J. Malan: Takže problém Set 5 je to, co leží před námi tam. 288 00:11:51,470 --> 00:11:55,260 Takže budeme brzy lépe pochopit o tom, kdy a proč se můžete 289 00:11:55,260 --> 00:11:57,300 a naše nelze zvýšit tímto způsobem. 290 00:11:57,300 --> 00:12:00,090 Ale nejprve pojďme vrátit naši pozornost na některé ze stavebních kamenů budeme 291 00:12:00,090 --> 00:12:02,250 musí být schopni říct, že příběh. 292 00:12:02,250 --> 00:12:05,580 >> Takže připomínám, že jsme vypracovali tento obrázek na Pondělí a trochu minulý týden. 293 00:12:05,580 --> 00:12:09,970 A to popisuje uspořádání věcí v paměti počítače, pokud 294 00:12:09,970 --> 00:12:11,000 běží nějaký program. 295 00:12:11,000 --> 00:12:14,310 Tech segmentu až nahoru, odvolání, odkazuje skutečných nul a jedniček 296 00:12:14,310 --> 00:12:16,000 že psát program. 297 00:12:16,000 --> 00:12:19,340 Tam je, že pod některé inicializován Neinicializované údaje, které se obvykle 298 00:12:19,340 --> 00:12:22,910 se vztahuje na věci, jako jsou konstanty nebo řetězce nebo globální proměnné, které mají 299 00:12:22,910 --> 00:12:24,200 byl prohlášen za předem. 300 00:12:24,200 --> 00:12:26,500 Tam je hromada, ale vrátíme se zpět, že za chvilku. 301 00:12:26,500 --> 00:12:27,410 >> A pak je tu hromada. 302 00:12:27,410 --> 00:12:30,660 Stejně jako na hromadu zásobníků v jídelna, to je místo, kde paměť dostane 303 00:12:30,660 --> 00:12:33,610 vrstvené a vrstvené kdykoliv budete dělat to, co v programu? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Co je to zásobník použít pro? 306 00:12:37,730 --> 00:12:39,320 >> Jo? 307 00:12:39,320 --> 00:12:40,000 >> Volání funkce. 308 00:12:40,000 --> 00:12:42,890 Kdykoliv volání funkce, je to vzhledem k kouskem paměti pro jeho 309 00:12:42,890 --> 00:12:45,020 lokální proměnné nebo parametry. 310 00:12:45,020 --> 00:12:48,810 A obrazově, vidíme, že s každým následné funkce je volána, když 311 00:12:48,810 --> 00:12:52,520 volání volání B C D hovory, které se vrství do zásobníku. 312 00:12:52,520 --> 00:12:55,630 A do každé z těchto plátků paměť je v podstatě unikátní rozsah 313 00:12:55,630 --> 00:12:58,590 pro tuto funkci, který, samozřejmě, je problematické, pokud chcete předat 314 00:12:58,590 --> 00:13:01,850 z jedné funkce na jinou část dat, která chcete ji 315 00:13:01,850 --> 00:13:03,500 zmutovat nebo změnit. 316 00:13:03,500 --> 00:13:08,060 >> Takže to, co bylo naše řešení umožňující Funkce reprezentován jedním zásobníku 317 00:13:08,060 --> 00:13:11,390 rám změnit paměť uvnitř z jiného zásobníku rámu? 318 00:13:11,390 --> 00:13:14,590 Jak ty dva mluvit k sobě navzájem? 319 00:13:14,590 --> 00:13:18,510 Takže prostřednictvím ukazatelů nebo adres, které opět pouze popsat místo, kde v 320 00:13:18,510 --> 00:13:22,280 paměť, a způsob, jak konkrétní skus číslo, zejména 321 00:13:22,280 --> 00:13:23,830 hodnotu lze nalézt. 322 00:13:23,830 --> 00:13:26,860 Tak vzpomínám minule taky jsme pokračovali příběh a podíval se na 323 00:13:26,860 --> 00:13:28,280 docela buggy programu. 324 00:13:28,280 --> 00:13:32,900 A tento program je kočárek pro několik důvodů, ale většina z nich je znepokojující 325 00:13:32,900 --> 00:13:34,620 protože nedokáže zjistit, co? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Jo, to nedokáže kontrolovat vstup. 328 00:13:40,450 --> 00:13:41,870 Je nám líto? 329 00:13:41,870 --> 00:13:43,880 >> Pokud je to více než 12 znaků. 330 00:13:43,880 --> 00:13:47,260 Takže velmi elegantně, při volání memcopy, který, jak již název napovídá, právě 331 00:13:47,260 --> 00:13:50,630 kopie paměti z jeho druhý argument do první argument. 332 00:13:50,630 --> 00:13:54,730 Třetí argument, velmi elegantně, je zkontrolovat, aby se ujistil, že nemáte 333 00:13:54,730 --> 00:13:59,400 kopírovat více, v tomto případě, na délku baru, počet znaků, 334 00:13:59,400 --> 00:14:03,810 do místa určení, která je tato pole C. Ale problém je, že to, co 335 00:14:03,810 --> 00:14:07,230 pokud C sám o sobě není dostatečně velká zvládnout, že? 336 00:14:07,230 --> 00:14:09,900 Budeš kopírovat počtu bajtů, že jste uvedené. 337 00:14:09,900 --> 00:14:13,040 Ale co ve skutečnosti mají více bajtů, než máte prostor pro? 338 00:14:13,040 --> 00:14:16,770 >> No, tento program velmi bláznivě jen slepě pokračuje vzít, co je to 339 00:14:16,770 --> 00:14:20,650 dáno, ahoj zpětné lomítko 0 je skvělé, pokud řetězec je krátká 340 00:14:20,650 --> 00:14:22,040 dost, stejně jako pět znaků. 341 00:14:22,040 --> 00:14:26,470 Ale jestli je to opravdu 12 znaků nebo 1200 znaků, jsme viděli minule 342 00:14:26,470 --> 00:14:29,380 že jste jen tak zcela přepsat paměť, 343 00:14:29,380 --> 00:14:30,470 nepatří k vám. 344 00:14:30,470 --> 00:14:34,390 A v nejhorším případě, pokud se přepsat, že Červená část je, že jsme nazvali 345 00:14:34,390 --> 00:14:35,380 zpáteční adresa - 346 00:14:35,380 --> 00:14:38,370 To je přesně tam, kde je počítač automaticky za vás, za 347 00:14:38,370 --> 00:14:43,130 scény, břicha daleko 32-bitová hodnota, která připomíná to, co by mělo adresa 348 00:14:43,130 --> 00:14:47,080 vrátí, až foo, to jiná funkce, se provádí spuštěním. 349 00:14:47,080 --> 00:14:49,320 Je to chléb drobeček druhů , na které se vrací. 350 00:14:49,320 --> 00:14:52,490 Pokud nahráváte, že potenciálně pokud jste špatný člověk, by možné 351 00:14:52,490 --> 00:14:54,750 potenciálně převzít něčí počítač. 352 00:14:54,750 --> 00:14:58,020 A budete určitě zhroucení ve většině případů. 353 00:14:58,020 --> 00:15:01,690 >> Nyní tento problém byl jen zhoršilo když jsme začali mluvit o paměti 354 00:15:01,690 --> 00:15:03,010 řízení obecně. 355 00:15:03,010 --> 00:15:07,150 A malloc pro alokaci paměti, je funkce, kterou můžeme použít k přidělení 356 00:15:07,150 --> 00:15:11,260 paměti, když nevíme předem že bychom mohli potřebovat. 357 00:15:11,260 --> 00:15:13,960 Tak například, když jsem se vrátit ke spotřebiči zde. 358 00:15:13,960 --> 00:15:21,010 A otevřu z minulého času hello2.c, připomínají tento program, která sem vypadal 359 00:15:21,010 --> 00:15:23,500 Trochu něco takového, jen tři linky - 360 00:15:23,500 --> 00:15:27,940 uvést své jméno, pak řetězec jméno, na levé straně, rovná GetString. 361 00:15:27,940 --> 00:15:29,690 A pak jsme jej vytisknout, jméno uživatele. 362 00:15:29,690 --> 00:15:31,170 >> Tak tohle je super jednoduchý program. 363 00:15:31,170 --> 00:15:34,870 Aby bylo jasno, nechte mě jít napřed a aby ahoj-2. 364 00:15:34,870 --> 00:15:36,680 Chystám se udělat tečku lomítko ahoj-2. 365 00:15:36,680 --> 00:15:37,750 Uveďte své jméno - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Ahoj Davide. 369 00:15:39,540 --> 00:15:41,060 Zdá se, že funguje OK. 370 00:15:41,060 --> 00:15:43,140 Ale to, co se opravdu děje pod kapotou zde? 371 00:15:43,140 --> 00:15:44,670 Nejprve pojďme sloupněte některých vrstev. 372 00:15:44,670 --> 00:15:48,380 String je jen synonymem máme si uvědomil, na co? 373 00:15:48,380 --> 00:15:49,110 Char hvězda. 374 00:15:49,110 --> 00:15:52,740 Takže pojďme dělat to trochu tajemný ale technicky správné, že tento 375 00:15:52,740 --> 00:15:55,570 je char hvězda, což znamená, že jméno, ano, je proměnná. 376 00:15:55,570 --> 00:15:59,920 Ale to, co název prodejny je adresa char, která se cítí trochu divně 377 00:15:59,920 --> 00:16:01,050 protože jsem se vrátit řetězec. 378 00:16:01,050 --> 00:16:03,580 Začínám zpět více znaky nejsou char. 379 00:16:03,580 --> 00:16:07,400 >> Ale samozřejmě, budete potřebovat pouze první char adresa si vzpomenout, kde 380 00:16:07,400 --> 00:16:08,870 Celý řetězec je, protože proč? 381 00:16:08,870 --> 00:16:12,700 Jak zjistit, kde konec řetězec je znát na začátku? 382 00:16:12,700 --> 00:16:13,630 Zpětné lomítko nula. 383 00:16:13,630 --> 00:16:17,260 Takže s těmito dvěma stopy zjistit, před začátkem a na konci 384 00:16:17,260 --> 00:16:20,280 libovolný řetězec je tak dlouho, dokud jsou správně tvarované s tímto null 385 00:16:20,280 --> 00:16:22,110 terminator, že zpětné lomítko nula. 386 00:16:22,110 --> 00:16:24,520 >> Ale to volá GetString. 387 00:16:24,520 --> 00:16:28,020 A ukázalo se, že GetString Celou tu dobu byl druh 388 00:16:28,020 --> 00:16:28,820 podvádění pro nás. 389 00:16:28,820 --> 00:16:32,460 Bylo to dělá tuto práci, abyste se ujistili, jak řetězec od uživatele. 390 00:16:32,460 --> 00:16:34,580 Ale kde je, že paměť byla z? 391 00:16:34,580 --> 00:16:38,440 Vrátíme-li se k obrázku sem použít definici z téměř 392 00:16:38,440 --> 00:16:42,610 Před chvílí, že zásobník je místo, kde paměť jde, když jsou volány funkce, 393 00:16:42,610 --> 00:16:45,370 podle této logiky, když zavoláte GetString, a pak jsem psát v 394 00:16:45,370 --> 00:16:50,900 D--V-I-D Enter, kde je D--V-I-D lomítko nulový bod uložen, na základě 395 00:16:50,900 --> 00:16:53,480 Příběh jsme řekli nám daleko? 396 00:16:53,480 --> 00:16:55,190 >> Mohlo by se zdát, že je v zásobník, ne? 397 00:16:55,190 --> 00:16:58,120 Voláte-li získat řetězec dostanete malý plátek paměti na zásobníku. 398 00:16:58,120 --> 00:17:01,630 Takže je logické, že D--V-I-D zpětné lomítko nula je uložen 399 00:17:01,630 --> 00:17:02,770 tam v zásobníku. 400 00:17:02,770 --> 00:17:07,680 Ale počkej, getString vrátí tento řetězec, abych tak řekl, což znamená, 401 00:17:07,680 --> 00:17:11,700 je to zásobník z jídelny je převzat ze zásobníku. 402 00:17:11,700 --> 00:17:14,560 A my jsme řekli minule, že jakmile funkce vrací, a vy se, že 403 00:17:14,560 --> 00:17:20,109 zásobník, abych tak řekl, ze zásobníku, co lze předpokládat, o pozůstatcích 404 00:17:20,109 --> 00:17:21,819 že paměť? 405 00:17:21,819 --> 00:17:25,160 Trochu jsem překleslil jako otazníky protože účinně se 406 00:17:25,160 --> 00:17:26,250 neznámé hodnoty. 407 00:17:26,250 --> 00:17:29,500 Které mohou být znovu použity, pokud nějaké Další funkce je volána. 408 00:17:29,500 --> 00:17:31,870 >> Jinými slovy, pokud se stane, k ukládání - 409 00:17:31,870 --> 00:17:34,350 Budu čerpat rychlou obrázek zde v zásobníku. 410 00:17:34,350 --> 00:17:38,690 Pokud se stalo, že se čerpání spodní mého segmentu paměti, a řekneme 411 00:17:38,690 --> 00:17:42,230 že toto je místo paměti obsazený hlavní a možná arg C a 412 00:17:42,230 --> 00:17:46,790 arg v a něco jiného v programu, při volání GetString, 413 00:17:46,790 --> 00:17:51,120 pravděpodobně dostane GetString kus paměti zde. 414 00:17:51,120 --> 00:17:53,940 A pak D--V-I-D nějak skončí v této funkci. 415 00:17:53,940 --> 00:17:55,320 A budu zjednodušovat. 416 00:17:55,320 --> 00:18:00,050 Ale předpokládejme, že její D--V-I-D zpětné lomítko nula. 417 00:18:00,050 --> 00:18:03,500 Takže toto množství bajtů se používá v rám pro getString. 418 00:18:03,500 --> 00:18:08,270 >> Ale jakmile getString vrátí, budeme řekl minule, že tato paměť po 419 00:18:08,270 --> 00:18:11,340 zde vše se stává - Woops! - 420 00:18:11,340 --> 00:18:14,270 všichni se efektivně vymazány. 421 00:18:14,270 --> 00:18:17,220 A my můžeme myslet na to teď jako otázku značky, protože kdo ví 422 00:18:17,220 --> 00:18:18,720 co se děje, aby se stal z této paměti. 423 00:18:18,720 --> 00:18:22,130 Opravdu, velmi často volat funkce jiné než GetString. 424 00:18:22,130 --> 00:18:24,750 A jakmile jsem volat jiné funkce než GetString, možná ne v 425 00:18:24,750 --> 00:18:28,860 Tento konkrétní program se jen díval na, ale nějaká jiná, jistě jiné 426 00:18:28,860 --> 00:18:34,180 funkce může skončit dána Tato další místo v zásobníku. 427 00:18:34,180 --> 00:18:39,410 >> Takže to nemůže být, že getString obchody D--V-I-D na stacku, protože bych 428 00:18:39,410 --> 00:18:41,040 okamžitě ztratí přístup k němu. 429 00:18:41,040 --> 00:18:43,720 Ale my víme, že getString vrátí pouze to, co? 430 00:18:43,720 --> 00:18:47,220 Není to návrat do mi šest znaků. 431 00:18:47,220 --> 00:18:51,090 Co je skutečně vrací se jsme došli k závěru minule? 432 00:18:51,090 --> 00:18:52,480 Adresa první. 433 00:18:52,480 --> 00:18:56,650 Tak nějak, když jsi volal GetString, je to přidělování kus paměti 434 00:18:56,650 --> 00:18:59,620 Řetězec, který uživatelé typ a pak se vracet adresa ní. 435 00:18:59,620 --> 00:19:02,930 A ukázalo se, že když chcete funkce alokovat paměť v tomto 436 00:19:02,930 --> 00:19:08,390 způsob a návrat do osoby, která volala že funkce, adresa 437 00:19:08,390 --> 00:19:11,870 že kus paměti, jste naprosto není možné, aby ji do zásobníku na 438 00:19:11,870 --> 00:19:14,750 dno, protože funkčně je to jen bude to stát tobě moc 439 00:19:14,750 --> 00:19:17,800 rychle, takže asi tušíte, kde budeme pravděpodobně bude hodit 440 00:19:17,800 --> 00:19:20,130 místo, tzv. haldy. 441 00:19:20,130 --> 00:19:25,290 >> Takže mezi spodní částí paměť je rozložení a horní paměť je 442 00:19:25,290 --> 00:19:26,820 layout je celá banda segmentů. 443 00:19:26,820 --> 00:19:29,270 Jedním z nich je zásobník a doprava nad ní je halda. 444 00:19:29,270 --> 00:19:33,680 A halda je jen jiný kus paměť, která se nepoužívá pro funkce 445 00:19:33,680 --> 00:19:34,770 když jste voláni. 446 00:19:34,770 --> 00:19:38,100 Používá se na dlouhodobější paměť, když Chcete-jedna funkce chytit některé 447 00:19:38,100 --> 00:19:42,700 paměti a moci pověsit na to bez ztráty kontroly nad ním. 448 00:19:42,700 --> 00:19:45,550 >> Nyní by snad okamžitě vidět, že to není 449 00:19:45,550 --> 00:19:48,060 nutně dokonalý design. 450 00:19:48,060 --> 00:19:51,350 Jak váš program přidělené paměti na zásobník, nebo jak tomu říkáte a více 451 00:19:51,350 --> 00:19:55,540 více funkcí, nebo jak si rozdělit paměť na haldě s malloc off jako 452 00:19:55,540 --> 00:20:00,690 GetString dělá to, co jasně Zdá se, že nevyhnutelný problém? 453 00:20:00,690 --> 00:20:00,860 >> Přesně tak. 454 00:20:00,860 --> 00:20:03,150 Stejně jako skutečnost, že tyto šipky směřovaly na sebe 455 00:20:03,150 --> 00:20:04,380 nevěstí nic dobrého. 456 00:20:04,380 --> 00:20:08,630 A skutečně, můžeme velmi rychle dojít k selhání program, v mnoha různými způsoby. 457 00:20:08,630 --> 00:20:12,050 Ve skutečnosti si myslím, že bychom mohli mít udělal náhodně jednou. 458 00:20:12,050 --> 00:20:14,020 A pokud ne, jdem na to záměrně teď. 459 00:20:14,020 --> 00:20:21,330 Nech mě jít dál a psát Super rychle program s názvem dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 A teď půjdu sem a se ostré patří stdio.h. 461 00:20:26,730 --> 00:20:32,620 Pojďme deklarovat funkce foo se žádné argumenty, což je 462 00:20:32,620 --> 00:20:34,040 označován jako dobře prázdnoty. 463 00:20:34,040 --> 00:20:37,830 >> A jediná věc, foo se chystá udělat, je volání foo, který pravděpodobně není 464 00:20:37,830 --> 00:20:39,100 nejchytřejší nápad, ale budiž. 465 00:20:39,100 --> 00:20:40,490 Ent hlavní neplatné. 466 00:20:40,490 --> 00:20:45,270 Nyní je jediná věc, hlavní se děje udělat, je zavolat foo stejně. 467 00:20:45,270 --> 00:20:51,050 A jen tak pro legraci, já jdu dopředu a tady říkají printf "Hello from 468 00:20:51,050 --> 00:20:52,340 foo ". 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Takže když jsem nedělal žádné chyby, Udělat dontdothis dot lomítko. 471 00:21:00,160 --> 00:21:01,960 A jdem na to ve větším okně - 472 00:21:01,960 --> 00:21:03,210 tečka lomítko, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Tak pojď. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Zdá se, že to můžete udělat. 478 00:21:13,100 --> 00:21:15,190 Sakra. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Počkejte. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Měli jsme - 483 00:21:18,270 --> 00:21:20,110 My jsme ji použít s make. 484 00:21:20,110 --> 00:21:22,050 >> [Povzdechne si] 485 00:21:22,050 --> 00:21:25,110 >> Já vím, ale myslím, že my právě smazal to. 486 00:21:25,110 --> 00:21:28,410 Uh, jo. 487 00:21:28,410 --> 00:21:30,660 Sakra. 488 00:21:30,660 --> 00:21:32,640 Vyřešte tento Rob. 489 00:21:32,640 --> 00:21:34,678 Co je? 490 00:21:34,678 --> 00:21:35,928 Je to velmi jednoduché. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Jo, jsme se obrátili optimalizace off. 493 00:21:47,360 --> 00:21:48,970 OK, stát ahoj. 494 00:21:48,970 --> 00:21:49,950 Teď se cítím lépe. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Dobrá. 497 00:21:51,780 --> 00:21:53,430 >> Takže pojďme překompilovat to - 498 00:21:53,430 --> 00:21:55,880 Udělat si dontdothis. 499 00:21:55,880 --> 00:22:00,090 Možná budete muset přejmenovat to dothis.c za chvíli. 500 00:22:00,090 --> 00:22:00,710 Tam jdeme. 501 00:22:00,710 --> 00:22:01,240 Děkuju. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Fakt, že jsem byl tisk něco, co bylo ve skutečnosti jen 504 00:22:05,480 --> 00:22:08,150 zpomaluje proces, při kterém se by dosáhl tohoto bodu. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Uf! 507 00:22:08,870 --> 00:22:11,180 >> Takže co se vlastně děje? 508 00:22:11,180 --> 00:22:14,440 Důvodem je, stejně jako stranou, je dělat nic, pokud jde o vstup a 509 00:22:14,440 --> 00:22:17,270 výstup má tendenci být pomalejší, protože psát znaky 510 00:22:17,270 --> 00:22:18,600 obrazovce, má posouvat. 511 00:22:18,600 --> 00:22:21,720 Tak dlouhý příběh krátký, měl jsem vlastně Stalo se to tak netrpělivá, museli bychom 512 00:22:21,720 --> 00:22:23,260 viděl konečný výsledek stejně. 513 00:22:23,260 --> 00:22:26,220 Teď, když jsem dostal jízdu na tisk-up, vidíme to hned. 514 00:22:26,220 --> 00:22:28,410 Tak proč se to děje. 515 00:22:28,410 --> 00:22:31,300 No, jednoduché vysvětlení, samozřejmě, je, že foo asi neměl 516 00:22:31,300 --> 00:22:32,500 bude volat sám. 517 00:22:32,500 --> 00:22:34,470 >> Nyní v obecné rovině, je to rekurze. 518 00:22:34,470 --> 00:22:36,970 A mysleli jsme si pár týdnů Před rekurzivní je dobrá. 519 00:22:36,970 --> 00:22:40,330 Rekurze je to magický způsob sebevyjádření Super stručně. 520 00:22:40,330 --> 00:22:41,400 A to prostě funguje. 521 00:22:41,400 --> 00:22:45,060 Ale tam je klíčovým rysem všech rekurzivní programy Mluvili jsme 522 00:22:45,060 --> 00:22:48,260 o a podíval se na tak daleko, což bylo, že měli co? 523 00:22:48,260 --> 00:22:52,610 Referenční případ, který byl nějaký pevný kódované případě tím, že v některých situacích 524 00:22:52,610 --> 00:22:56,210 nevolejte foo, který je jasně není tento případ. 525 00:22:56,210 --> 00:22:58,920 >> Takže to, co se skutečně děje co se týče obrázku? 526 00:22:58,920 --> 00:23:01,790 No, když hlavní volá foo, že mít užitek z paměti. 527 00:23:01,790 --> 00:23:04,150 Když volá foo foo, dostane plátek paměti. 528 00:23:04,150 --> 00:23:06,430 Když volá foo foo, dostane kousek. 529 00:23:06,430 --> 00:23:07,080 To dostane řez. 530 00:23:07,080 --> 00:23:08,120 To dostane řez. 531 00:23:08,120 --> 00:23:09,460 Vzhledem k tomu, foo nikdy vracet. 532 00:23:09,460 --> 00:23:12,160 My nikdy mazání jedním z těch, rámy ze zásobníku. 533 00:23:12,160 --> 00:23:15,930 Takže jsme profouknutí hromadu, a to uvést, kdo ví, co ještě, a 534 00:23:15,930 --> 00:23:19,600 budeme překračovat hranice naší tzv. segment paměti. 535 00:23:19,600 --> 00:23:21,790 Chyba jít segmentace false. 536 00:23:21,790 --> 00:23:24,110 >> Takže řešení je jasně, nedělej to. 537 00:23:24,110 --> 00:23:28,830 Ale větší vyplývá, že ano, tam je nějaká hranice, absolutně, 538 00:23:28,830 --> 00:23:32,470 i když to není dobře definována, jak mnoho funkcí, můžete volat do 539 00:23:32,470 --> 00:23:34,970 Program, kolikrát funkce mohou volat sám. 540 00:23:34,970 --> 00:23:38,430 Takže i když jsme kázat rekurzi jak této potenciálně magické věci 541 00:23:38,430 --> 00:23:41,870 Před pár týdny na sigma funkce, a když jsme se získat data 542 00:23:41,870 --> 00:23:45,270 struktury a CS50, uvidíte další Žádosti o tom, že to není 543 00:23:45,270 --> 00:23:46,500 nutně ta nejlepší věc. 544 00:23:46,500 --> 00:23:50,070 Vzhledem k tomu, pokud se volání funkce, volá sama sebe, i když je tu základna 545 00:23:50,070 --> 00:23:54,860 případě, pokud nechcete zasáhnout, že základní případ, 1000 pro hovory nebo hovory 10000, podle 546 00:23:54,860 --> 00:23:58,800 Tehdy jste možná došly místnosti na tzv. zásobníku a stiskněte klávesu 547 00:23:58,800 --> 00:24:00,400 některé jiné části paměti. 548 00:24:00,400 --> 00:24:03,950 Tak to je také design trade-off mezi elegancí a mezi 549 00:24:03,950 --> 00:24:06,920 robustnost váš konkrétní implementace. 550 00:24:06,920 --> 00:24:10,780 >> Takže tam je další nevýhoda, nebo další chyták na to, co máme 551 00:24:10,780 --> 00:24:11,720 dělal tak daleko. 552 00:24:11,720 --> 00:24:12,980 Když jsem volal GetString - 553 00:24:12,980 --> 00:24:15,120 nech mě jít zpátky do ahoj-2. 554 00:24:15,120 --> 00:24:18,170 Všimněte si, že volám GetString, který se vrací adresu. 555 00:24:18,170 --> 00:24:20,730 A tvrdí, že dnes adresa je z haldy. 556 00:24:20,730 --> 00:24:24,480 A teď jsem vytištění string na této adrese. 557 00:24:24,480 --> 00:24:27,000 Ale my jsme nikdy nevolal opak GetString. 558 00:24:27,000 --> 00:24:30,850 Nikdy jsme museli calll funkci jako ungetstring, kde jste ruku zpět 559 00:24:30,850 --> 00:24:31,610 že paměť. 560 00:24:31,610 --> 00:24:33,250 Ale upřímně řečeno, jsme asi by měl být. 561 00:24:33,250 --> 00:24:37,390 Protože pokud budeme pořád ptají počítač pro paměť tím, že způsob, jak někoho, jako je 562 00:24:37,390 --> 00:24:40,830 GetString ale nikdy to vrátit, určitě že je také nevyhnutelně povede k 563 00:24:40,830 --> 00:24:42,970 problémy, kterým jsme se spustit z paměti. 564 00:24:42,970 --> 00:24:46,140 >> A ve skutečnosti, můžeme se za ně problémy s novým nástrojem, jehož použití 565 00:24:46,140 --> 00:24:47,640 je trochu záhadné psát. 566 00:24:47,640 --> 00:24:50,960 Ale dovolte mi jít dopředu a nešetřit ji na obrazovce jen na chvíli. 567 00:24:50,960 --> 00:24:56,940 Chystám se jít dopředu a spusťte Valgrind s parametrem, jehož první příkaz 568 00:24:56,940 --> 00:25:00,260 argument řádek je název tohoto programu ahoj-2. 569 00:25:00,260 --> 00:25:02,650 A bohužel je to výstup je ukrutně 570 00:25:02,650 --> 00:25:04,290 komplexní bezdůvodně. 571 00:25:04,290 --> 00:25:06,280 Vidíme vše, co nepořádek. 572 00:25:06,280 --> 00:25:07,530 David je uvedeno mé jméno. 573 00:25:07,530 --> 00:25:09,760 Tak to je program, vlastně běží. 574 00:25:09,760 --> 00:25:11,180 A teď si tento výstup. 575 00:25:11,180 --> 00:25:13,400 >> Takže Valgrind je podobný svým duchem GDB. 576 00:25:13,400 --> 00:25:14,950 Není to debugger sobě. 577 00:25:14,950 --> 00:25:16,270 Ale je to vzpomínka kontrolu. 578 00:25:16,270 --> 00:25:20,140 Je to program, který spustí programovat a řeknu vám, pokud budete požádáni 579 00:25:20,140 --> 00:25:23,860 počítač na paměti a nikdy podal zpět, čímž což znamená, že máte 580 00:25:23,860 --> 00:25:24,570 nevracení paměti. 581 00:25:24,570 --> 00:25:26,240 A úniky paměti mají tendenci být špatné. 582 00:25:26,240 --> 00:25:29,120 A vy jste se uživatelé počítačů mají Pravděpodobně cítil, zda máte 583 00:25:29,120 --> 00:25:30,300 Mac nebo PC. 584 00:25:30,300 --> 00:25:33,730 Už jste někdy použili počítač while a není restartován v několika 585 00:25:33,730 --> 00:25:36,820 dny, nebo jste právě dostal hodně programy spuštěné, a ta zatracená věc 586 00:25:36,820 --> 00:25:42,360 zpomalí se zastavila, nebo alespoň Je to super nepříjemné používat, protože 587 00:25:42,360 --> 00:25:44,350 vše, co zrovna super slow. 588 00:25:44,350 --> 00:25:46,260 >> Teď to může být libovolný počet důvodů. 589 00:25:46,260 --> 00:25:49,600 Mohlo by to být nekonečná smyčka, chyba v něčí kód, nebo, více jednoduše, že 590 00:25:49,600 --> 00:25:53,250 by mohlo znamenat, že používáte více paměť, nebo se snaží, než vaše 591 00:25:53,250 --> 00:25:54,920 počítač ve skutečnosti má. 592 00:25:54,920 --> 00:25:57,770 A možná je to chyba v nějakém programu že pořád ptají na paměti. 593 00:25:57,770 --> 00:26:02,480 Prohlížeče pro roky byli notoricky známí pro to, žádají více a více paměti 594 00:26:02,480 --> 00:26:03,870 ale nikdy podal zpátky. 595 00:26:03,870 --> 00:26:07,220 Jistě, pokud máte pouze konečný množství paměti, nemůžete žádat 596 00:26:07,220 --> 00:26:09,990 nekonečně mnohokrát pro některé z těchto pamětí. 597 00:26:09,990 --> 00:26:13,070 >> A tak to, co vidíte tady, i když znovu Valgrind je výstup 598 00:26:13,070 --> 00:26:17,490 zbytečně složité, aby se podíval na První, to je zajímavá část. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 v provozu na výstupu. 601 00:26:20,060 --> 00:26:22,810 Tak tady je, kolik paměti je se používá v haldě na 602 00:26:22,810 --> 00:26:24,300 Čas můj program ukončen - 603 00:26:24,300 --> 00:26:27,280 zřejmě šest bajtů v jednom bloku. 604 00:26:27,280 --> 00:26:28,710 Takže budu mávat rukama v jakém je blok. 605 00:26:28,710 --> 00:26:31,270 Myslete na to je jen kus, další technický výraz pro kus. 606 00:26:31,270 --> 00:26:33,140 Ale šest bajtů - 607 00:26:33,140 --> 00:26:36,870 co je šest bytů, které byly ještě v použití? 608 00:26:36,870 --> 00:26:37,390 >> Přesně tak. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D lomítko nula, pět písmeno Název a null terminátor. 610 00:26:41,520 --> 00:26:46,350 Takže tento program Valgrind si všiml, že jsem požádal o šesti bytech, zřejmě tím, že 611 00:26:46,350 --> 00:26:48,950 způsob GetString, ale nikdy dal zpátky. 612 00:26:48,950 --> 00:26:52,030 A ve skutečnosti, mohlo by to být tak zřejmé, když můj program není tři 613 00:26:52,030 --> 00:26:53,590 linky, ale je to 300 řádků. 614 00:26:53,590 --> 00:26:56,920 Takže můžeme skutečně dát jiný příkaz linka argument Valgrind na 615 00:26:56,920 --> 00:26:58,290 aby bylo více upovídaný. 616 00:26:58,290 --> 00:26:59,760 Je to trochu nepříjemné pamatovat. 617 00:26:59,760 --> 00:27:01,580 Ale když to udělám - 618 00:27:01,580 --> 00:27:01,930 podívejme. 619 00:27:01,930 --> 00:27:03,540 Leak - 620 00:27:03,540 --> 00:27:05,030 Bylo to k úniku - 621 00:27:05,030 --> 00:27:07,580 ani nepamatuji co je to pryč ruce. 622 00:27:07,580 --> 00:27:08,550 >> - Kontrola těsnosti se rovná plné výši. 623 00:27:08,550 --> 00:27:10,180 Jo, děkuji. 624 00:27:10,180 --> 00:27:12,520 - Kontrola těsnosti se rovná plné výši. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Stejný program běží. 627 00:27:14,940 --> 00:27:16,180 Zadejte v Davidovi znovu. 628 00:27:16,180 --> 00:27:17,660 Teď vidím trochu podrobněji. 629 00:27:17,660 --> 00:27:20,890 Ale pod haldy shrnutí, což je totožná s čtyři - ah, 630 00:27:20,890 --> 00:27:22,120 je to docela hezké. 631 00:27:22,120 --> 00:27:25,460 Nyní Valgrind je vlastně hledá trochu těžší v mém kódu. 632 00:27:25,460 --> 00:27:29,580 A to se říká, že, zdá se, malloc na řádku - 633 00:27:29,580 --> 00:27:30,580 jsme oddálit. 634 00:27:30,580 --> 00:27:31,980 Na řádku - 635 00:27:31,980 --> 00:27:32,930 nevidíme, jaký postoj je. 636 00:27:32,930 --> 00:27:35,110 Ale malloc je prvním viníkem. 637 00:27:35,110 --> 00:27:38,630 Je to blog na malloc. 638 00:27:38,630 --> 00:27:39,810 >> V pořádku? 639 00:27:39,810 --> 00:27:40,450 OK, no. 640 00:27:40,450 --> 00:27:40,940 Je to tak? 641 00:27:40,940 --> 00:27:42,520 Zavolal jsem GetString. 642 00:27:42,520 --> 00:27:44,460 GetString zřejmě volá malloc. 643 00:27:44,460 --> 00:27:47,800 Takže to, co řádek kódu je zřejmě vinen s 644 00:27:47,800 --> 00:27:49,050 přiděleno tuto paměť? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Předpokládejme, že ten, kdo napsal malloc byl asi dost dlouho, že je to 647 00:27:55,540 --> 00:27:56,390 není jejich chyba. 648 00:27:56,390 --> 00:27:57,520 Takže je to asi moje. 649 00:27:57,520 --> 00:28:02,000 GetString v cs50.c - takže je to soubor někde na počítači - 650 00:28:02,000 --> 00:28:05,210 v řádku 286 se zdá, že je viník. 651 00:28:05,210 --> 00:28:08,140 Nyní předpokládejme, že CS50 bylo kolem slušné množství času, takže 652 00:28:08,140 --> 00:28:09,720 my jsou neomylné. 653 00:28:09,720 --> 00:28:14,080 A tak to asi není v getString že chyba spočívá, ale v 654 00:28:14,080 --> 00:28:17,810 ahoj-2.c linka 18. 655 00:28:17,810 --> 00:28:20,670 >> Takže pojďme se podívat na co to linka 18 byla. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Nějak tento řádek není nutně buggy, samo o sobě, ale to je důvod, 658 00:28:27,130 --> 00:28:28,630 za tím nevracení paměti. 659 00:28:28,630 --> 00:28:32,140 Takže prostě super, co by intuitivně Řešením je? 660 00:28:32,140 --> 00:28:34,710 Pokud se ptáte na paměti, nebyly nikdy dát zpět, a že se zdá, že je 661 00:28:34,710 --> 00:28:37,940 problém, protože v průběhu času svůj počítač může spustit z paměti, může zpomalit 662 00:28:37,940 --> 00:28:42,110 dolů, může špatné věci se stávají, no, to, co je jednoduché intuitivní řešení? 663 00:28:42,110 --> 00:28:43,140 Dej to zpátky. 664 00:28:43,140 --> 00:28:44,770 >> Jak se uvolnit, že paměť? 665 00:28:44,770 --> 00:28:49,970 No, naštěstí je to docela jednoduché jen říci, bez názvu. 666 00:28:49,970 --> 00:28:51,260 A my jsme nikdy nedělal. 667 00:28:51,260 --> 00:28:55,890 Ale můžete v podstatě myslet zdarma jako protiklad malloc. 668 00:28:55,890 --> 00:28:58,030 zdarma, je opakem přidělování paměti. 669 00:28:58,030 --> 00:28:59,540 Takže teď mi dovolte překompilovat to. 670 00:28:59,540 --> 00:29:02,050 Zkontrolujte, ahoj-2. 671 00:29:02,050 --> 00:29:04,620 Dovolte mi jej spustit znovu. ahoj-2 David. 672 00:29:04,620 --> 00:29:07,290 Takže se zdá, pracovat v přesně stejným způsobem. 673 00:29:07,290 --> 00:29:11,180 Ale když jsem se vrátit do Valgrind a znovu spustit že stejný příkaz na mém nově 674 00:29:11,180 --> 00:29:14,720 zkompilovaný program psaní ve jménu mém, jako předtím - 675 00:29:14,720 --> 00:29:15,370 pěkné. 676 00:29:15,370 --> 00:29:16,760 Heap shrnutí - 677 00:29:16,760 --> 00:29:17,740 používané na výstupu - 678 00:29:17,740 --> 00:29:19,370 nula bajtů nulových bloků. 679 00:29:19,370 --> 00:29:21,840 A to je super hezký, všechny haldy bloky byli osvobozeni. 680 00:29:21,840 --> 00:29:23,480 Žádné úniky jsou možné. 681 00:29:23,480 --> 00:29:27,200 >> Takže přijít, ne problému Sada 4, ale Problem Set 5, forenzní 682 00:29:27,200 --> 00:29:30,740 a následující roky, to také stane měřítkem správnosti vašeho 683 00:29:30,740 --> 00:29:33,630 Program, zda máte nebo nemáte nebo nemají k nevracení paměti. 684 00:29:33,630 --> 00:29:36,900 Ale naštěstí, můžete nejen rozum skrze ně intuitivně, což 685 00:29:36,900 --> 00:29:40,430 je, pravděpodobně, snadné malých programů ale těžší větších programů, 686 00:29:40,430 --> 00:29:43,860 Valgrind, pro ty větší programy, vám může pomoci identifikovat 687 00:29:43,860 --> 00:29:45,360 konkrétní problém. 688 00:29:45,360 --> 00:29:47,500 >> Ale je tu ještě jeden další problém které by mohly vzniknout. 689 00:29:47,500 --> 00:29:51,245 Dovolte mi otevřít tento soubor zde, což je Opět platí, že poněkud jednoduchý příklad. 690 00:29:51,245 --> 00:29:53,760 Ale pojďme se zaměřit na to, co Tento program dělá. 691 00:29:53,760 --> 00:29:55,190 To se nazývá memory.c. 692 00:29:55,190 --> 00:29:58,380 Budeme tento post později dnes zip dnešní zdrojového kódu. 693 00:29:58,380 --> 00:30:01,610 A zjistíte, že mám funkci nazvanou f že žádné argumenty a 694 00:30:01,610 --> 00:30:02,800 nevrací nic. 695 00:30:02,800 --> 00:30:07,240 V řádku 20, jsem prý prohlásil ukazatel na int a volat to x. 696 00:30:07,240 --> 00:30:09,570 Jsem přiřazení je návrat hodnota malloc. 697 00:30:09,570 --> 00:30:14,590 A jen aby bylo jasno, kolik bajtů am Asi jsem se vrátit z malloc 698 00:30:14,590 --> 00:30:17,080 v této situaci? 699 00:30:17,080 --> 00:30:18,040 >> Asi 40. 700 00:30:18,040 --> 00:30:18,840 Kde jsi to vzal? 701 00:30:18,840 --> 00:30:22,410 No, jestli si vzpomínáte, že int je často 4 bajty, je přinejmenším v 702 00:30:22,410 --> 00:30:25,110 zařízení, 10 krát 4 je samozřejmě 40. 703 00:30:25,110 --> 00:30:28,920 Takže malloc vrací adresu na kus paměti a skladování, které 704 00:30:28,920 --> 00:30:30,800 řešení nakonec v x. 705 00:30:30,800 --> 00:30:32,570 Takže aby bylo jasno, co pak se to děje? 706 00:30:32,570 --> 00:30:34,990 No, dovolte mi vrátit zpět na našem obrázku zde. 707 00:30:34,990 --> 00:30:38,150 Dovolte mi, abych nejen kreslit hloubi paměti počítače, nech mě jít napřed a 708 00:30:38,150 --> 00:30:42,990 nakreslit celý obdélník, který představuje všechny mé paměti RAM. 709 00:30:42,990 --> 00:30:44,790 >> Řekneme, že zásobník je na dně. 710 00:30:44,790 --> 00:30:47,010 A je tu textový segment se Neinicializované údaje. 711 00:30:47,010 --> 00:30:49,880 Ale já jsem prostě jít na ty abstraktní jiné věci daleko jako tečka, tečka tečka. 712 00:30:49,880 --> 00:30:53,470 Jdu jen se odkazovat na to jako hromadu v horní části. 713 00:30:53,470 --> 00:30:57,070 A pak v dolní části obrázku, představují hlavní, já jdu 714 00:30:57,070 --> 00:30:59,880 aby jí plátky paměť na zásobníku. 715 00:30:59,880 --> 00:31:03,150 Pro f, jdu dát plátek paměti na zásobníku. 716 00:31:03,150 --> 00:31:05,140 Teď jsem se dostal do prohlížím svůj Zdrojový kód znovu. 717 00:31:05,140 --> 00:31:07,170 Jaké jsou lokální proměnné pro hlavní? 718 00:31:07,170 --> 00:31:10,710 Zřejmě nic, takže řez je účinně prázdná nebo dokonce ani tak velký, 719 00:31:10,710 --> 00:31:11,600 jak jsem čerpány. 720 00:31:11,600 --> 00:31:15,730 Ale f, mám lokální proměnné, který se nazývá x. 721 00:31:15,730 --> 00:31:20,410 Takže jsem jít dopředu a dát f kus paměti, volat to x. 722 00:31:20,410 --> 00:31:24,680 >> A teď malloc 10 krát 4, Takže malloc 40, kde je to 723 00:31:24,680 --> 00:31:25,430 paměť přichází? 724 00:31:25,430 --> 00:31:27,530 Jsme není vykreslen obrázek jako předtím. 725 00:31:27,530 --> 00:31:31,140 Ale předpokládejme, že je to skutečně přichází odtud, tak jeden, 726 00:31:31,140 --> 00:31:33,170 dva, tři, čtyři, pět. 727 00:31:33,170 --> 00:31:34,680 A teď musím 40 z nich. 728 00:31:34,680 --> 00:31:37,540 Tak jsem si prostě udělat tečku, tečka, tečka navrhnout že tam je ještě více paměti 729 00:31:37,540 --> 00:31:39,350 návratu z haldy. 730 00:31:39,350 --> 00:31:40,710 Teď, co je adresa? 731 00:31:40,710 --> 00:31:42,620 Zvolme libovolný naše řešit jako vždy - 732 00:31:42,620 --> 00:31:46,310 Ox123, i když to asi bude být něco úplně jiného. 733 00:31:46,310 --> 00:31:50,420 To je adresa prvního bajtu v paměti, že se ptám na malloc. 734 00:31:50,420 --> 00:31:53,630 >> Takže ve zkratce, jakmile řádek 20 vykoná, co je doslova 735 00:31:53,630 --> 00:31:57,170 uložené uvnitř x tady? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 A vůl je nezajímavý. 739 00:32:01,550 --> 00:32:03,200 To jen znamená, že tady Hexadecimální číslo. 740 00:32:03,200 --> 00:32:06,490 Ale co je klíčové je, že to, co jsem obchod x, což je místní proměnná. 741 00:32:06,490 --> 00:32:10,260 Ale jeho datový typ, opět je adresa int. 742 00:32:10,260 --> 00:32:12,710 No, já jdu uložit Ox123. 743 00:32:12,710 --> 00:32:16,610 Ale na druhou stranu, pokud je to trochu moc složitý zbytečně, když jsem listovat 744 00:32:16,610 --> 00:32:21,490 zpět, můžeme to pryč docela abstraktní rozumně a jen říct, že x je 745 00:32:21,490 --> 00:32:23,910 ukazatel na tento kus paměti. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Nyní je otázka, na dosah ruky je následující - 748 00:32:26,230 --> 00:32:29,910 linka 21, jak se ukázalo, je chybné. 749 00:32:29,910 --> 00:32:31,160 Proč? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Je nám líto? 752 00:32:36,930 --> 00:32:38,640 To nemá - 753 00:32:38,640 --> 00:32:40,390 tvrdí, že ještě jednou. 754 00:32:40,390 --> 00:32:41,240 No, to není zadarmo. 755 00:32:41,240 --> 00:32:42,350 Tak to je druhý, ale. 756 00:32:42,350 --> 00:32:45,000 Takže je tu ještě jedna, ale specificky na řádku 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Přesně tak. 759 00:32:50,040 --> 00:32:54,980 Tento jednoduchý řádek kódu je jen buffer overflow, přetečení vyrovnávací paměti. 760 00:32:54,980 --> 00:32:57,050 Vyrovnávací paměť znamená jen kus paměti. 761 00:32:57,050 --> 00:33:01,520 Ale to kus paměti o velikosti 10, 10 celých čísel, což znamená, že pokud bychom 762 00:33:01,520 --> 00:33:05,350 index do ní pomocí syntaktický cukr z pole notaci, náměstí 763 00:33:05,350 --> 00:33:09,220 držáky, máte přístup k x držák 0 x držák 1 x, 764 00:33:09,220 --> 00:33:10,390 Držák tečka, tečka, tečka. 765 00:33:10,390 --> 00:33:13,270 x držák 9 je největší. 766 00:33:13,270 --> 00:33:17,680 Takže když udělám x držák 10, kde Já jsem vlastně děje v paměti? 767 00:33:17,680 --> 00:33:19,120 >> No, když mám 10 int - 768 00:33:19,120 --> 00:33:21,070 pojďme vlastně kreslit vše z nich tady. 769 00:33:21,070 --> 00:33:22,700 Takže to byl první pět. 770 00:33:22,700 --> 00:33:24,660 Zde je dalších pět ints. 771 00:33:24,660 --> 00:33:29,580 Takže x držák 0 je tady. x držák 1 je zde. x držák 9 je tady. x držák 772 00:33:29,580 --> 00:33:37,960 10 je tady, což znamená, že říkám, v řádku 21, počítač, aby 773 00:33:37,960 --> 00:33:39,400 číslo, kde? 774 00:33:39,400 --> 00:33:42,010 Číslo 0, kde? 775 00:33:42,010 --> 00:33:43,380 No, to je 0, tak ano. 776 00:33:43,380 --> 00:33:45,460 Ale jen to, že její 0 je tak trochu náhoda. 777 00:33:45,460 --> 00:33:47,140 Mohlo by to být číslo 50, pro všechny staráme. 778 00:33:47,140 --> 00:33:50,480 Ale snažíme se, aby to na x držáku 10, což je místo, kde toto 779 00:33:50,480 --> 00:33:53,700 Otazník je koncipován, což není dobrá věc. 780 00:33:53,700 --> 00:33:57,070 Tento program by mohl velmi dobře havárie jako výsledek. 781 00:33:57,070 --> 00:33:59,400 >> Nyní pojďme dál a uvidíme, jestli to je skutečně to, co se stane. 782 00:33:59,400 --> 00:34:02,600 Aby paměti, protože soubor se nazývá memory.c. 783 00:34:02,600 --> 00:34:05,950 Pojďme dál a spusťte programové paměti. 784 00:34:05,950 --> 00:34:08,239 Takže jsme měli štěstí, ve skutečnosti, zdá se. 785 00:34:08,239 --> 00:34:09,340 Měli jsme štěstí. 786 00:34:09,340 --> 00:34:11,060 Ale uvidíme, jestli budeme nyní běží Valgrind. 787 00:34:11,060 --> 00:34:14,170 Na první pohled by se mohlo můj program Zdá se, že je naprosto správné. 788 00:34:14,170 --> 00:34:18,010 Ale dovolte mi spustit Valgrind se - Kontrola úniku odpovídá plné paměti. 789 00:34:18,010 --> 00:34:20,110 >> A teď, když jsem tento příkaz - 790 00:34:20,110 --> 00:34:21,030 zajímavé. 791 00:34:21,030 --> 00:34:26,800 Neplatný zápis o velikosti 4 na řádek 21 memory.c. 792 00:34:26,800 --> 00:34:29,284 Linka 21 memory.c je, který z nich? 793 00:34:29,284 --> 00:34:30,340 Oh, zajímavé. 794 00:34:30,340 --> 00:34:31,080 Ale počkejte. 795 00:34:31,080 --> 00:34:32,389 Velikost 4, jak je to s odkazem na? 796 00:34:32,389 --> 00:34:34,969 Jen jsem se jednou napsat, ale je to o velikosti 4. 797 00:34:34,969 --> 00:34:36,889 Proč je to 4? 798 00:34:36,889 --> 00:34:39,280 Je to proto, že je to int, což je opět čtyři bajty. 799 00:34:39,280 --> 00:34:42,510 Takže Valgrind našli nějakou chybu, že jsem, podíval se na mém kódu, ne. 800 00:34:42,510 --> 00:34:45,040 A možná vaše TF nebo by ne. 801 00:34:45,040 --> 00:34:48,469 Co však Valgrind jistě zjistil, že že jsme udělali chybu, dokonce 802 00:34:48,469 --> 00:34:52,719 ale měli jsme štěstí, a počítač rozhodl, co, nebudu se zhroutí 803 00:34:52,719 --> 00:34:57,470 jen proto, že jste se dotkli jeden bajt, jeden INT stojí za paměti, že ne 804 00:34:57,470 --> 00:34:58,550 ve skutečnosti vlastní. 805 00:34:58,550 --> 00:35:00,380 >> No, co jiného je buggy zde. 806 00:35:00,380 --> 00:35:01,180 Adresa - 807 00:35:01,180 --> 00:35:03,190 To je šílené hledá adresa v šestnáctkové soustavě. 808 00:35:03,190 --> 00:35:06,890 To jen znamená, že někde v haldě je nula bajtů po bloku o velikosti 40 809 00:35:06,890 --> 00:35:07,620 je přiděleno. 810 00:35:07,620 --> 00:35:10,610 Dovolte mi přiblížit tady a uvidíme, jestli je to trochu vstřícnější. 811 00:35:10,610 --> 00:35:11,410 Zajímavý. 812 00:35:11,410 --> 00:35:15,600 40 bajtů definitivně ztratil v záznam ztráty 1 z 1. 813 00:35:15,600 --> 00:35:17,840 Opět platí, že více slov, než je zde velmi užitečná. 814 00:35:17,840 --> 00:35:21,350 Ale na základě zvýrazněné linie, kde asi bych měla zaměřit moje 815 00:35:21,350 --> 00:35:24,070 pozornost na další bug? 816 00:35:24,070 --> 00:35:26,570 Vypadá to, že linky 20 memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Takže když se vrátíme k řádku 20, to je ten, který jste určili dříve. 818 00:35:30,990 --> 00:35:33,030 A to nemusí být nutně buggy. 819 00:35:33,030 --> 00:35:35,160 Ale my jsme to zvrátit jeho účinky. 820 00:35:35,160 --> 00:35:38,790 Tak jak to mám opravit alespoň jeden z těchto chyb? 821 00:35:38,790 --> 00:35:42,240 Co jsem mohl dělat po řádku 21? 822 00:35:42,240 --> 00:35:47,110 Co jsem mohl udělat bez x, takže je vrátit, že paměť. 823 00:35:47,110 --> 00:35:49,230 A jak mohu opravit tuto chybu? 824 00:35:49,230 --> 00:35:52,120 Měl bych určitě jít ne dál než 0. 825 00:35:52,120 --> 00:35:53,670 Takže dovolte mi, abych se pokusila znovu spustit tento. 826 00:35:53,670 --> 00:35:56,080 Omlouváme se, ale určitě jít ne dál než 9. 827 00:35:56,080 --> 00:35:57,510 Udělat paměti. 828 00:35:57,510 --> 00:36:00,650 Dovolte mi, abych znovu Valgrind ve větším okně. 829 00:36:00,650 --> 00:36:01,580 A teď se podívejte. 830 00:36:01,580 --> 00:36:02,250 Pěkný. 831 00:36:02,250 --> 00:36:03,270 Všechny bloky haldy byli osvobozeni. 832 00:36:03,270 --> 00:36:04,270 Žádné úniky jsou možné. 833 00:36:04,270 --> 00:36:07,520 A tady nahoře, tam žádná zmínka některého z neplatné práva. 834 00:36:07,520 --> 00:36:09,820 >> Jen dostat chamtivý a pojďme zjistit, zda další ukázkou 835 00:36:09,820 --> 00:36:11,050 nejde jak má - 836 00:36:11,050 --> 00:36:12,560 Jsem štěstí před chvílí. 837 00:36:12,560 --> 00:36:15,530 A skutečnost, že je to 0 je možná zbytečně zavádějící. 838 00:36:15,530 --> 00:36:20,650 Udělejme 50, poněkud svévolné počet, značka paměti dot slash paměť - 839 00:36:20,650 --> 00:36:21,410 ještě štěstí. 840 00:36:21,410 --> 00:36:22,510 Nic shazovat. 841 00:36:22,510 --> 00:36:26,150 Dejme tomu, že to prostě udělat něco opravdu hloupé, a já 100. 842 00:36:26,150 --> 00:36:30,360 Dovolte mi, abych předělat paměti, tečka lomítko paměť - 843 00:36:30,360 --> 00:36:31,075 štěstí znovu. 844 00:36:31,075 --> 00:36:32,800 Jak se o 1000? 845 00:36:32,800 --> 00:36:35,370 ints mimo, hrubě, kde bych měl být? 846 00:36:35,370 --> 00:36:37,410 Udělat paměť - 847 00:36:37,410 --> 00:36:38,570 sakra. 848 00:36:38,570 --> 00:36:39,920 >> [Smích] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Pojďme se flákat už ne. 851 00:36:43,920 --> 00:36:45,120 Znovu paměti. 852 00:36:45,120 --> 00:36:45,840 Tam jdeme. 853 00:36:45,840 --> 00:36:46,410 Dobrá. 854 00:36:46,410 --> 00:36:52,500 Takže zřejmě budete index 100000 ints než kde byste měli být v 855 00:36:52,500 --> 00:36:54,410 paměti, špatné věci se stávají. 856 00:36:54,410 --> 00:36:56,430 Tak to samozřejmě není tvrdé, rychlé pravidlo. 857 00:36:56,430 --> 00:36:58,190 Byl jsem tak trochu s použitím zkušební a chyba se tam dostat. 858 00:36:58,190 --> 00:37:02,230 Ale to je proto, že dlouhý příběh krátký, paměti počítače je také rozdělena 859 00:37:02,230 --> 00:37:03,580 do těchto věcí tzv. segmenty. 860 00:37:03,580 --> 00:37:07,260 A někdy, že počítač skutečně vám dal trochu více paměti 861 00:37:07,260 --> 00:37:08,400 než se zeptáte na. 862 00:37:08,400 --> 00:37:12,170 Ale účinnost, je to prostě jednodušší získat více paměti, ale pouze ti 863 00:37:12,170 --> 00:37:13,780 že jste stále část. 864 00:37:13,780 --> 00:37:16,370 >> A pokud budete mít štěstí někdy, Proto, měli byste být schopni dotknout 865 00:37:16,370 --> 00:37:17,795 paměť, která nepatří k vám. 866 00:37:17,795 --> 00:37:21,860 Nemáte žádnou záruku, že to, co hodnota dáte tam zůstane tam, protože 867 00:37:21,860 --> 00:37:25,080 počítač stále si myslí, že to není tvoje, ale není to nutně děje 868 00:37:25,080 --> 00:37:29,910 udeřit do dalšího segmentu paměti v počítač a vyvolat takovou chybu 869 00:37:29,910 --> 00:37:31,710 tohle tady. 870 00:37:31,710 --> 00:37:32,060 Dobrá. 871 00:37:32,060 --> 00:37:37,240 Jakékoliv dotazy pak na paměť? 872 00:37:37,240 --> 00:37:37,590 >> Dobrá. 873 00:37:37,590 --> 00:37:40,610 Pojďme se podívat zde, pak na něco, co jsme užívali pro 874 00:37:40,610 --> 00:37:48,361 poskytnuta na nějakou dobu, která v tomto souboru s názvem cs50.h. 875 00:37:48,361 --> 00:37:49,420 Tak to je soubor. 876 00:37:49,420 --> 00:37:51,130 To jsou jen celá parta komentářů do horní části. 877 00:37:51,130 --> 00:37:53,900 A možná jste se na tuto možnost, pokud si tropil kolem na přístroji. 878 00:37:53,900 --> 00:37:57,000 Ukazuje se však, že po celou dobu, když jsme používali řetězec jako 879 00:37:57,000 --> 00:38:01,130 synonymum prostředky, které jsme deklarovali které bylo synonymem s tímto 880 00:38:01,130 --> 00:38:03,990 klíčové slovo typedef pro definici typu. 881 00:38:03,990 --> 00:38:07,500 A my jsme v podstatě říká, aby navléci synonymum pro char hvězdy. 882 00:38:07,500 --> 00:38:11,190 , Že prostředky, které zásobníku vytvořili tyto tréninkové kola známé jako 883 00:38:11,190 --> 00:38:12,040 řetězec. 884 00:38:12,040 --> 00:38:14,830 >> Tady je to jen prototyp pro getchar. 885 00:38:14,830 --> 00:38:17,350 Jsme mohli vidět dříve, ale to je opravdu to, co dělá. getchar 886 00:38:17,350 --> 00:38:19,070 žádné argumenty, vrací char. 887 00:38:19,070 --> 00:38:21,340 getdouble žádné argumenty, vrací double. 888 00:38:21,340 --> 00:38:24,440 getfloat žádné argumenty, vrátí float, a tak dále. 889 00:38:24,440 --> 00:38:27,270 vezmi_int je tady. getlonglong je tady. 890 00:38:27,270 --> 00:38:28,820 A GetString je tady. 891 00:38:28,820 --> 00:38:29,420 A je to. 892 00:38:29,420 --> 00:38:33,080 Tato fialová linka je další preprocesor směrnice, protože 893 00:38:33,080 --> 00:38:35,550 hashtag na jeho začátku. 894 00:38:35,550 --> 00:38:35,870 >> Dobrá. 895 00:38:35,870 --> 00:38:38,380 Takže teď mě nech jít do cs50.c. 896 00:38:38,380 --> 00:38:40,400 A nebudeme mluvit příliš dlouho na to. 897 00:38:40,400 --> 00:38:43,280 Ale aby vám pohled na to, co je se děje na všechno 898 00:38:43,280 --> 00:38:46,434 čas, nech mě jít do - 899 00:38:46,434 --> 00:38:48,250 jdem getchar. 900 00:38:48,250 --> 00:38:51,050 Takže getchar je většinou komentáře. 901 00:38:51,050 --> 00:38:52,060 Ale vypadá to takhle. 902 00:38:52,060 --> 00:38:54,800 Tak tohle je skutečná funkce getchar, že jsme byli 903 00:38:54,800 --> 00:38:56,055 přičemž za samozřejmost existuje. 904 00:38:56,055 --> 00:38:59,370 A i když jsme se použít tohle že často, pokud vůbec, je to alespoň 905 00:38:59,370 --> 00:39:00,470 poměrně jednoduchý. 906 00:39:00,470 --> 00:39:02,580 Takže je to stojí za to Rychlý pohled na zde. 907 00:39:02,580 --> 00:39:06,540 >> Takže getchar má nekonečnou smyčku, záměrně tak zdánlivě. 908 00:39:06,540 --> 00:39:10,050 Potom zavolá - a to je druh pěkný opětovné použití kódu sami napsali. 909 00:39:10,050 --> 00:39:11,220 Volá GetString. 910 00:39:11,220 --> 00:39:12,460 Protože to, co dělá znamená dostat char? 911 00:39:12,460 --> 00:39:14,730 No, můžete se pokusit získat celý řádek textu od uživatele a 912 00:39:14,730 --> 00:39:16,940 pak se stačí podívat na jeden z těchto znaků. 913 00:39:16,940 --> 00:39:19,170 V souladu 60, tady je to trochu trochu zdravý rozum kontroly. 914 00:39:19,170 --> 00:39:21,610 Pokud GetString vrátil null, pojďme nepokračuje. 915 00:39:21,610 --> 00:39:22,820 Něco je špatně. 916 00:39:22,820 --> 00:39:28,120 >> Teď je to trochu nepříjemné, ale konvenční C. char max. pravděpodobně 917 00:39:28,120 --> 00:39:29,960 představuje to, co právě na základě jeho jméno? 918 00:39:29,960 --> 00:39:31,670 Je to konstanta. 919 00:39:31,670 --> 00:39:36,040 Je to jako číselnou hodnotu Největší char můžete reprezentovat s 920 00:39:36,040 --> 00:39:40,370 jedno kousnutí, což je pravděpodobně číslo 255, což je největší číslo, které 921 00:39:40,370 --> 00:39:42,720 představují osm bitů, od nuly. 922 00:39:42,720 --> 00:39:47,460 Takže jsem se využít této funkce, v této funkci, kdy psaní tohoto kódu jen proto, 923 00:39:47,460 --> 00:39:51,753 pokud se něco pokazí, ale getchar jeho účel v životě je vrátit 924 00:39:51,753 --> 00:39:54,830 char, musíte být schopni nějak najevo, že uživatel, který 925 00:39:54,830 --> 00:39:55,840 se něco pokazilo. 926 00:39:55,840 --> 00:39:56,970 Nemůžeme vrátit hodnotu null. 927 00:39:56,970 --> 00:39:58,480 Ukazuje se, že je nulový ukazatel. 928 00:39:58,480 --> 00:40:01,030 A opět, getchar má vrátit char. 929 00:40:01,030 --> 00:40:04,760 >> Takže úmluva, pokud se něco špatně, vy, programátor, nebo 930 00:40:04,760 --> 00:40:08,160 V tomto případě jsem se do knihovny, měl jsem jen rozhodnout libovolně, pokud 931 00:40:08,160 --> 00:40:12,230 se něco pokazí, budu vrátí číslo 255, která je skutečně 932 00:40:12,230 --> 00:40:17,240 znamená, že nemůže uživatel nemůže zadat znak reprezentován 933 00:40:17,240 --> 00:40:21,410 číslo 255, protože jsme měli ukrást jako tzv. sentinelové hodnotu 934 00:40:21,410 --> 00:40:23,410 představují problém. 935 00:40:23,410 --> 00:40:27,010 Nyní se ukazuje, že charakter 255 není něco, co můžete psát na 936 00:40:27,010 --> 00:40:28,380 klávesnice, takže to není velký problém. 937 00:40:28,380 --> 00:40:30,910 Uživatel nevšimne, že Já jsem ukradl tento znak. 938 00:40:30,910 --> 00:40:34,620 Ale pokud jste někdy v manuálových stránkách na počítačový systém nějaký odkaz 939 00:40:34,620 --> 00:40:38,560 všechny čepice konstantní, jako je tato, která říká, v případě chyby tato konstanta může 940 00:40:38,560 --> 00:40:42,720 být vráceny, to je všechno nějaký člověk udělal lety byl svévolně rozhodla 941 00:40:42,720 --> 00:40:45,680 vrátit tuto speciální hodnotu a říkat konstanta v případě 942 00:40:45,680 --> 00:40:46,840 se něco pokazí. 943 00:40:46,840 --> 00:40:48,580 >> Nyní magie stane tady. 944 00:40:48,580 --> 00:40:52,600 Za prvé, já jsem prohlásil v souladu 67 dvě postavy, C1 a C2. 945 00:40:52,600 --> 00:40:57,080 A pak v řadě 68, je to vlastně řádek kódu, který je připomínající 946 00:40:57,080 --> 00:41:01,140 náš přítel printf vzhledem k tomu, že má mít procent Čs v uvozovkách. 947 00:41:01,140 --> 00:41:06,490 Nevšimnout, co se tu děje. sscanf znamená řetězec skenování - 948 00:41:06,490 --> 00:41:11,690 znamená, že skenování formátu řetězec, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Co to má znamenat? 950 00:41:12,590 --> 00:41:16,310 To znamená, že předáte sscanf řetězec. 951 00:41:16,310 --> 00:41:18,420 A linka je cokoliv uživatel zadá palců 952 00:41:18,420 --> 00:41:23,520 Můžete přejít na sscanf formátovací řetězec jako to, že říká, scanf, jaké jsou 953 00:41:23,520 --> 00:41:25,870 Doufáte, který zadal uživatel palců 954 00:41:25,870 --> 00:41:29,730 Ty pak předat v adresách dvou kousky paměti, v tomto případě, 955 00:41:29,730 --> 00:41:31,150 protože mám dva zástupné symboly. 956 00:41:31,150 --> 00:41:34,610 Tak jsem dám jí adresu C1 a C2 na adresu. 957 00:41:34,610 --> 00:41:37,700 >> A připomínají, že dáte funkci, Adresa nějaké proměnné, co je 958 00:41:37,700 --> 00:41:38,950 implikace? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Co může dělat, že funkce v důsledku dát jí adresu 961 00:41:45,050 --> 00:41:48,170 Proměnná, na rozdíl od proměnná sám? 962 00:41:48,170 --> 00:41:49,450 To lze změnit, ne? 963 00:41:49,450 --> 00:41:53,250 Pokud jste měl někoho mapu pro fyzické adresu, mohou jít tam a udělat 964 00:41:53,250 --> 00:41:54,750 co chtějí na této adrese. 965 00:41:54,750 --> 00:41:55,800 Stejná myšlenka tady. 966 00:41:55,800 --> 00:41:59,950 Pomineme-li, aby sscanf, adresa, ze dvou kousky paměti, dokonce i ty malé 967 00:41:59,950 --> 00:42:03,585 malé kousky paměti, C1 a C2, ale řekneme jí adresu z nich, 968 00:42:03,585 --> 00:42:05,170 sscanf jej změnit. 969 00:42:05,170 --> 00:42:08,530 >> Takže sscanf je smysl života, když čteme manuálové stránky, je přečíst, co 970 00:42:08,530 --> 00:42:13,420 uživatel zadali, doufám, že pro uživatele s zadali znak a možná 971 00:42:13,420 --> 00:42:16,470 jiný znak, a to bez ohledu na uživatele napsal první znak pokračuje 972 00:42:16,470 --> 00:42:19,310 zde, druhý znak jde zde. 973 00:42:19,310 --> 00:42:22,470 Nyní, stejně jako stranou, a vy by jen vím to z dokumentace, 974 00:42:22,470 --> 00:42:25,570 Skutečnost, že jsem dal mezeru tam prostě znamená, že je mi jedno, jestli 975 00:42:25,570 --> 00:42:28,440 uživatel narazí na mezerník málo krát, než on nebo ona má 976 00:42:28,440 --> 00:42:30,400 charakter, budu ignorovat jakýkoli bílý prostor. 977 00:42:30,400 --> 00:42:32,510 Takže, já vím od dokumentace. 978 00:42:32,510 --> 00:42:36,570 >> Skutečnost, že je druhý% c následovaný mezerou je ve skutečnosti 979 00:42:36,570 --> 00:42:37,410 úmyslné. 980 00:42:37,410 --> 00:42:41,190 Chci být schopni zjistit, zda uživatel podělal nebo nespolupracovali. 981 00:42:41,190 --> 00:42:45,630 Takže doufám, že jen uživatel napsal v jednom znaku, a proto doufám, 982 00:42:45,630 --> 00:42:50,640 že sscanf je teprve ve chvíli vrátit hodnota 1, protože, opět, když jsem četl 983 00:42:50,640 --> 00:42:55,400 dokumentace, sscanf je účel život je pro návrat do počtu 984 00:42:55,400 --> 00:42:59,170 proměnné, které byly vyplněny uživatelského vstupu. 985 00:42:59,170 --> 00:43:02,270 >> Prošel jsem ve dvou proměnných adresy, C1 a C2. 986 00:43:02,270 --> 00:43:06,420 Doufám však, že pouze jeden z je zabit, protože pokud sscanf 987 00:43:06,420 --> 00:43:11,130 vrací2, co je pravděpodobně implikace logicky? 988 00:43:11,130 --> 00:43:14,600 Že uživatel nebyl jen mi jednu charakter, jako bych mu nebo jí. 989 00:43:14,600 --> 00:43:17,860 Pravděpodobně zadali při nejméně dva znaky. 990 00:43:17,860 --> 00:43:22,430 Takže když jsem místo toho neměl druhý % C, jen jsem měl jeden, který 991 00:43:22,430 --> 00:43:25,370 Upřímně řečeno by být více intuitivní přístup, myslím, že první pohled, 992 00:43:25,370 --> 00:43:30,220 budete nebude schopen detekovat pokud byl uživatel dává vám více 993 00:43:30,220 --> 00:43:31,780 Vstupní než jste vlastně chtěli. 994 00:43:31,780 --> 00:43:34,100 Tak to je implicitní forma z kontroly chyb. 995 00:43:34,100 --> 00:43:35,640 >> Ale zjistíte, co dělám tady. 996 00:43:35,640 --> 00:43:39,970 Jednou jsem si jistý, že mi dal jeden uživatel postava, jsem uvolnit linku, dělat 997 00:43:39,970 --> 00:43:44,450 opak getString, což používá malloc, a pak se vrátím 998 00:43:44,450 --> 00:43:51,030 C1, charakter, že jsem doufal, že uživatel k dispozici a pouze za předpokladu. 999 00:43:51,030 --> 00:43:54,680 Tak rychle zahlédl jen, ale všechny otázky týkající se getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Vrátíme se k některým z ostatních. 1002 00:43:59,590 --> 00:44:03,770 >> No, nech mě jít dál a dělat to - Předpokládám, že teď, jen motivovat 1003 00:44:03,770 --> 00:44:08,910 diskuse v týdnu a navíc čas, to je soubor s názvem structs.h. 1004 00:44:08,910 --> 00:44:11,440 A opět, je to jen chuť něčeho, co leží před námi. 1005 00:44:11,440 --> 00:44:13,090 Ale všimněte si, že hodně toto je komentář. 1006 00:44:13,090 --> 00:44:17,440 Takže mi dovolte zdůraznit pouze Zajímavostí teď. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 tam je to stejné klíčové slovo znovu. 1009 00:44:19,700 --> 00:44:23,100 typedef používáme deklarovat řetězec jako zvláštní typ dat. 1010 00:44:23,100 --> 00:44:27,490 Můžete použít typedef vytvořit zbrusu nový datové typy, které neexistovaly, když 1011 00:44:27,490 --> 00:44:28,570 C byl vynalezen. 1012 00:44:28,570 --> 00:44:32,520 Například, int přichází s C. char Dodává se s C. double přichází s C. Ale 1013 00:44:32,520 --> 00:44:34,000 není pojem studenta. 1014 00:44:34,000 --> 00:44:37,230 A přesto, že by bylo docela užitečné mít schopni napsat program, který ukládá 1015 00:44:37,230 --> 00:44:40,440 do proměnné, student ID číslo, jejich jméno, a jejich dům. 1016 00:44:40,440 --> 00:44:42,890 Jinými slovy, tři kusy dat, jako int a 1017 00:44:42,890 --> 00:44:44,420 string a jiný řetězec. 1018 00:44:44,420 --> 00:44:48,220 >> S typedef, co je dost silný o tom, a klíčovým slovem sturct pro 1019 00:44:48,220 --> 00:44:53,660 struktura, vy, programátor v roce 2013, může skutečně definovat vlastní 1020 00:44:53,660 --> 00:44:57,530 datové typy, které neexistovaly let zpátky, ale to vyhovovalo vašim požadavkům. 1021 00:44:57,530 --> 00:45:01,910 A tak zde, v řádcích 13 až 19, jsme se prohlašuje, že nový datový typ, například 1022 00:45:01,910 --> 00:45:04,320 int, ale nazývat to studentka. 1023 00:45:04,320 --> 00:45:09,310 A uvnitř této proměnné se chystá tři věci - int, string, 1024 00:45:09,310 --> 00:45:09,930 a řetězec. 1025 00:45:09,930 --> 00:45:13,040 Takže si můžete myslet, co je opravdu stalo, i když je to 1026 00:45:13,040 --> 00:45:17,160 kousek zjednodušení pro dnešek, student je v podstatě děje 1027 00:45:17,160 --> 00:45:19,450 takhle vypadat. 1028 00:45:19,450 --> 00:45:22,580 Jeho bude kus paměť s ID, jméno 1029 00:45:22,580 --> 00:45:25,580 pole a dům pole. 1030 00:45:25,580 --> 00:45:30,670 A budeme moci využít tyto kusy paměti a přistupovat k nim takto. 1031 00:45:30,670 --> 00:45:38,870 >> Když jdu do struct0.c, zde je poměrně dlouho, ale po 1032 00:45:38,870 --> 00:45:42,630 vzor, ​​kód, který používá tento nový trik. 1033 00:45:42,630 --> 00:45:45,790 Takže v první řadě mi dovolte, abych vás upozornil na zajímavých částí nahoru nahoru. 1034 00:45:45,790 --> 00:45:49,670 Sharp definuje studenty 3, prohlašuje, konstantní tzv. studenti a nabyvatelé 1035 00:45:49,670 --> 00:45:53,450 je libovolně číslo 3, jen takže mám tři studenty pomocí 1036 00:45:53,450 --> 00:45:54,830 Tento program nyní. 1037 00:45:54,830 --> 00:45:55,960 Tady je hlavní. 1038 00:45:55,960 --> 00:45:58,860 A všimněte si, jak Prohlašuji, řada studentů? 1039 00:45:58,860 --> 00:46:00,480 No, jen jsem použít stejnou syntaxi. 1040 00:46:00,480 --> 00:46:02,110 Slovo Student je samozřejmě nové. 1041 00:46:02,110 --> 00:46:04,790 Ale student, třída, konzolové studenti. 1042 00:46:04,790 --> 00:46:06,720 >> Takže bohužel je tu spousta opětovného použití pojmů zde. 1043 00:46:06,720 --> 00:46:07,660 To je jen číslo. 1044 00:46:07,660 --> 00:46:09,040 Takže to je jako říct tři. 1045 00:46:09,040 --> 00:46:11,430 Třída je jen to, co chci volat proměnnou. 1046 00:46:11,430 --> 00:46:12,840 Mohl bych říkat, že studenti. 1047 00:46:12,840 --> 00:46:15,880 Ale třída, to není třída ve objektově orientované Java druh způsobem. 1048 00:46:15,880 --> 00:46:17,220 Je to jen třída studentů. 1049 00:46:17,220 --> 00:46:20,590 A datový typ každého prvku v tomto poli je studentem. 1050 00:46:20,590 --> 00:46:23,040 Tak to je trochu jinak az říká něco 1051 00:46:23,040 --> 00:46:25,250 takhle, je to jen - 1052 00:46:25,250 --> 00:46:29,500 Říkám, dej mi tři studenty a volat, že třídu pole. 1053 00:46:29,500 --> 00:46:29,800 >> Dobrá. 1054 00:46:29,800 --> 00:46:30,680 Tady je to čtyři smyčky. 1055 00:46:30,680 --> 00:46:33,480 Ten chlap zná - iterate od nuly až na tři. 1056 00:46:33,480 --> 00:46:35,160 A tady je nový kus syntaxe. 1057 00:46:35,160 --> 00:46:37,710 Program bude podněcovat mě, člověk, aby to student 1058 00:46:37,710 --> 00:46:39,200 ID, což je int. 1059 00:46:39,200 --> 00:46:44,650 A tady je syntaxe, pomocí kterého můžete uložit něco do pole ID na 1060 00:46:44,650 --> 00:46:48,630 Umístění třída držák I. Tak tato syntaxe není nic nového. 1061 00:46:48,630 --> 00:46:51,450 To prostě znamená, že mi osmý studentů ve třídě. 1062 00:46:51,450 --> 00:46:52,940 Ale to je symbol nové. 1063 00:46:52,940 --> 00:46:56,320 Až do této chvíle jsme nelze použít tečku, alespoň v kódu jako je tato. 1064 00:46:56,320 --> 00:47:01,490 To znamená jít do struct známý jako student a dát tam něco. 1065 00:47:01,490 --> 00:47:05,670 Stejně tak v této další řádek, 31, přejít dopředu a dejte, co uživatel zadá 1066 00:47:05,670 --> 00:47:10,530 na jméno tady a co dělají pro dům, totéž, jděte do toho a 1067 00:47:10,530 --> 00:47:13,230 vložte jej do. domu. 1068 00:47:13,230 --> 00:47:15,955 >> Takže to, co dělá tento program nakonec dělat? 1069 00:47:15,955 --> 00:47:17,220 Můžete vidět malou ukázku tam. 1070 00:47:17,220 --> 00:47:24,780 Nech mě jít dál a dělat, aby structs 0 tečka lomítko struct 0, student ID 1, 1071 00:47:24,780 --> 00:47:28,250 řekl David Mather, student ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, student ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 a jediné, co tento program udělal, který je jen zcela svévolné, je 1075 00:47:38,380 --> 00:47:40,980 Chtěl jsem udělat něco, co s těmito daty, teď, když jsem učil nás, jak se 1076 00:47:40,980 --> 00:47:43,450 používat structs, je, že jsem prostě musel Tato extra smyčka zde. 1077 00:47:43,450 --> 00:47:45,260 I iterovat přes pole studentů. 1078 00:47:45,260 --> 00:47:49,170 Použil jsem svou, možná teď známý přítel, řetězec porovnání, stircomp na 1079 00:47:49,170 --> 00:47:53,780 Kontrola je 8. studenta dům rovná Mather? 1080 00:47:53,780 --> 00:47:56,760 A pokud ano, stačí něco vytisknout libovolně ráda, ano, je. 1081 00:47:56,760 --> 00:47:59,430 Ale na druhou stranu, jen to, že mi příležitosti používat a opakovaně a 1082 00:47:59,430 --> 00:48:02,270 znovu tuto novou dot notace. 1083 00:48:02,270 --> 00:48:03,250 >> Takže koho to zajímá, že? 1084 00:48:03,250 --> 00:48:06,270 Přijít s studentského programu poněkud svévolné, ale ukázalo se, 1085 00:48:06,270 --> 00:48:09,800 že můžeme dělat užitečné věci s to, například následujícím způsobem. 1086 00:48:09,800 --> 00:48:14,600 To je mnohem složitější struct v C. Je tu tucet nebo více polí, 1087 00:48:14,600 --> 00:48:15,880 poněkud nesrozumitelné názvy. 1088 00:48:15,880 --> 00:48:20,110 Ale pokud jste někdy slyšeli o grafický formát souboru s názvem bitmapa, BMP, to 1089 00:48:20,110 --> 00:48:22,830 Ukazuje se, že bitmapový formát souboru skoro vypadá, že. 1090 00:48:22,830 --> 00:48:24,200 Je to malá hloupá smajlíky. 1091 00:48:24,200 --> 00:48:27,840 Je to malý obrázek, který jsem přiblížení na dost velký, takže jsem mohl vidět každý 1092 00:48:27,840 --> 00:48:30,410 jednotlivých bodů neboli pixelů. 1093 00:48:30,410 --> 00:48:33,800 Nyní se ukazuje, můžeme představovat černá tečka s, řekněme, číslo 0.. 1094 00:48:33,800 --> 00:48:35,520 A bílá tečka s číslem 1. 1095 00:48:35,520 --> 00:48:39,140 >> Takže jinými slovy, pokud chcete kreslit Smajlík a kromě toho, že obraz v 1096 00:48:39,140 --> 00:48:42,680 počítač, postačí pro uložení nuly a ty, které vypadají jako to, kde, 1097 00:48:42,680 --> 00:48:45,250 znovu, ty jsou bílé a nuly jsou černé. 1098 00:48:45,250 --> 00:48:48,290 A společně, pokud skutečně máte gird jedniček a nul, máte 1099 00:48:48,290 --> 00:48:51,030 mřížka obrazových bodů, a pokud si položit je ven, máte roztomilá 1100 00:48:51,030 --> 00:48:52,560 malý smajlíky. 1101 00:48:52,560 --> 00:48:58,150 Nyní bitmapový obrázek formátu BMP, je efektivně, že pod kapotou 1102 00:48:58,150 --> 00:49:00,970 ale s více pixelů Sot, že může skutečně reprezentovat barvy. 1103 00:49:00,970 --> 00:49:05,170 >> Ale když máte sofistikovanější formáty souborů jako BMP a JPEG a GIF 1104 00:49:05,170 --> 00:49:09,360 se kterou by mohlo být známé, které soubory na disku obvykle není pouze 1105 00:49:09,360 --> 00:49:13,760 mají nul a jedniček na obrazových bodů, ale mají nějaký metadata a - 1106 00:49:13,760 --> 00:49:16,960 meta v tom smyslu, že ve skutečnosti není dat, ale to je užitečné mít. 1107 00:49:16,960 --> 00:49:21,370 Takže tato pole tady naznačujete, a uvidíme to podrobněji v P-set 1108 00:49:21,370 --> 00:49:25,810 5, že před nul a jedniček, které představují obrazové body v obraze, 1109 00:49:25,810 --> 00:49:29,110 je tu banda metadat, jako velikost snímku a 1110 00:49:29,110 --> 00:49:30,250 šířka obrazu. 1111 00:49:30,250 --> 00:49:32,910 A všimněte si, já jsem škubání pryč některé libovolné věci zde - 1112 00:49:32,910 --> 00:49:34,260 šířka a výška. 1113 00:49:34,260 --> 00:49:36,160 Bit obraz a některé další věci. 1114 00:49:36,160 --> 00:49:37,840 Takže tam je nějaký metadata v souboru. 1115 00:49:37,840 --> 00:49:41,470 >> Ale tím, že pochopení toho, jak jsou stanoveny soubory se tímto způsobem, můžete skutečně 1116 00:49:41,470 --> 00:49:45,890 pak manipulovat s obrázky, obnovit obrázky z disku, velikost obrázků. 1117 00:49:45,890 --> 00:49:47,560 Ale to nejde nutně zlepšit je. 1118 00:49:47,560 --> 00:49:48,480 Potřeboval jsem fotografii. 1119 00:49:48,480 --> 00:49:52,840 Tak jsem šel zpátky do RJ zde, který jsi viděl Na obrazovce se poměrně dlouhou dobu před. 1120 00:49:52,840 --> 00:49:57,160 A když otevřu Keynote tady, je to co se stane, když se pokusíte přiblížit a 1121 00:49:57,160 --> 00:49:59,380 zvýšení RJ. 1122 00:49:59,380 --> 00:50:01,480 On nedostávají žádné opravdu lepší. 1123 00:50:01,480 --> 00:50:06,240 Nyní Keynote je trochu rozmazaný, že trochu, jen zakrývat 1124 00:50:06,240 --> 00:50:11,040 Skutečnost, že RJ nedostane zvlášť lepší, když obraz zvětšíte 1125 00:50:11,040 --> 00:50:13,310 A pokud se to udělat tímto způsobem, vidět na náměstí? 1126 00:50:13,310 --> 00:50:15,490 Ano, můžete určitě vidět čtverce na projektoru. 1127 00:50:15,490 --> 00:50:17,690 >> To je to, co dostanete, když budete zvýšit. 1128 00:50:17,690 --> 00:50:22,570 Ale v pochopení toho, jak naše RJ nebo Smajlík je realizován nám umožní 1129 00:50:22,570 --> 00:50:24,950 vlastně psát kód, který manipuluje tyto věci. 1130 00:50:24,950 --> 00:50:29,970 A já myslel, že bych skončit na této poznámce, se 55 sekund na zvýšení je to, 1131 00:50:29,970 --> 00:50:31,230 Troufám si řekněme poněkud zavádějící. 1132 00:50:31,230 --> 00:50:32,990 >> [PŘEHRÁVÁNÍ] 1133 00:50:32,990 --> 00:50:34,790 >> -Lže. 1134 00:50:34,790 --> 00:50:38,310 O co, já nevím. 1135 00:50:38,310 --> 00:50:41,200 >> -Tak co víme? 1136 00:50:41,200 --> 00:50:45,280 >> -To v 09:15 Ray Santoya byl u bankomatu. 1137 00:50:45,280 --> 00:50:47,830 >> -Takže otázka je, co dělal v 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Střelba devět milimetrů na něco. 1139 00:50:50,750 --> 00:50:52,615 Možná viděl odstřelovače. 1140 00:50:52,615 --> 00:50:54,760 >> -Nebo se s ním pracovat. 1141 00:50:54,760 --> 00:50:56,120 >> -Počkej. 1142 00:50:56,120 --> 00:50:57,450 Vraťte se jeden. 1143 00:50:57,450 --> 00:50:58,700 >> -Co vidíš? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Přineste mu lícem nahoru, na celé obrazovce. 1146 00:51:09,490 --> 00:51:09,790 >> -Jeho brýle. 1147 00:51:09,790 --> 00:51:11,040 >> -Je to odraz. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -To je baseball Neuvitas tým. 1150 00:51:23,520 --> 00:51:24,530 To je jejich logo. 1151 00:51:24,530 --> 00:51:27,040 >> A mluví s tím, kdo je na sobě bundu. 1152 00:51:27,040 --> 00:51:27,530 >> [END PŘEHRÁVÁNÍ] 1153 00:51:27,530 --> 00:51:29,180 >> David J. Malan: To bude Problém je sada 5. 1154 00:51:29,180 --> 00:51:30,720 Uvidíme se příští týden. 1155 00:51:30,720 --> 00:51:32,330 >> MALE SPEAKER: Na další CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Cvrcku] 1157 00:51:39,240 --> 00:51:41,270 >> [Přehrávání hudby]