1 00:00:00,000 --> 00:00:10,970 >> [Prehrávanie hudby] 2 00:00:10,970 --> 00:00:12,536 >> David J. Malan: Dobre. 3 00:00:12,536 --> 00:00:13,392 >> [Smiech] 4 00:00:13,392 --> 00:00:14,240 >> Vitaj späť. 5 00:00:14,240 --> 00:00:14,990 Toto je CS50. 6 00:00:14,990 --> 00:00:16,890 A to do konca týždňa päť. 7 00:00:16,890 --> 00:00:20,020 A až do teraz, máme celkom veľa bral za samozrejmé, že 8 00:00:20,020 --> 00:00:23,480 existuje tento kompilátor, klap, ktoré ste bolo vyvolanie prostredníctvom tejto 9 00:00:23,480 --> 00:00:27,100 ďalší nástroj s názvom Urobiť to nejako ako mávnutím čarovného prútika zmení váš zdrojový kód 10 00:00:27,100 --> 00:00:31,350 do objektového kódu, sa núl a jedničiek že vaše počítače CPU, centrálne 11 00:00:31,350 --> 00:00:33,410 procesorová jednotka, skutočne rozumie. 12 00:00:33,410 --> 00:00:36,770 Ale ukazuje sa, že je to číslo, ktoré je deje pod kapotou v 13 00:00:36,770 --> 00:00:38,690 medzi vstupom a výstupom. 14 00:00:38,690 --> 00:00:41,800 >> A ja by som chcel navrhnúť, aby sa mäso že v trochu podrobnejšie do 15 00:00:41,800 --> 00:00:45,130 Tieto štyri kroky, mať niečo, čo nazýva predspracovanie, čo 16 00:00:45,130 --> 00:00:48,300 tzv kompilácie, ktoré sme videli, niečo ako montáž a 17 00:00:48,300 --> 00:00:49,420 niečo, čo nazýva prepojenie. 18 00:00:49,420 --> 00:00:53,270 Takže až do teraz, v niektorej z našich programy, sme mali ostré obsahuje. 19 00:00:53,270 --> 00:00:56,650 V poslednej dobe sme mali nejaké ostré definuje konštánt. 20 00:00:56,650 --> 00:01:00,660 Tak to dopadá, že tie veci, ktoré majú pred hash symbol alebo 21 00:01:00,660 --> 00:01:04,150 libra symbol sú pre-procesor smernice. 22 00:01:04,150 --> 00:01:07,960 To je len ozdobný spôsob, ako hovoriť, že je to riadok kódu, ktorý je vlastne 23 00:01:07,960 --> 00:01:12,280 prevedené do niečoho iného, ​​než sa Počítač sa dokonca pokúsiť previesť svoje 24 00:01:12,280 --> 00:01:13,800 Program do núl a jednotiek. 25 00:01:13,800 --> 00:01:19,000 >> Napríklad, ostrý obsahuje štandardné I / O. H, do značnej miery jednoducho znamená ísť 26 00:01:19,000 --> 00:01:24,010 dopredu, chytiť obsah súborov stdio.h a vložiť ich priamo tam. 27 00:01:24,010 --> 00:01:25,880 Takže žiadne núl a jedničiek v tomto bode ešte. 28 00:01:25,880 --> 00:01:27,470 Je to naozaj len substitúcia. 29 00:01:27,470 --> 00:01:30,790 A to sa stalo počas tzv pre-fáze spracovania, pri 30 00:01:30,790 --> 00:01:34,230 vlastne beží Clang alebo špecificky Aby sa vo väčšine prípadov. 31 00:01:34,230 --> 00:01:36,950 Takže všetko sa dialo Prvý automaticky tak ďaleko. 32 00:01:36,950 --> 00:01:38,800 >> Potom prichádza krok kompilácie. 33 00:01:38,800 --> 00:01:40,920 Ale boli sme príliš zjednodušený kompilácie. 34 00:01:40,920 --> 00:01:45,060 Kompilácia programu naozaj znamená vezmite si ju z niečoho, ako je C, 35 00:01:45,060 --> 00:01:48,430 Zdrojový kód sme písali, sa na niečo, čo nazýva montáž. 36 00:01:48,430 --> 00:01:52,900 Jazyk symbolických inštrukcií je nižšia úroveň jazyk, ktorý našťastie nebudeme 37 00:01:52,900 --> 00:01:55,480 majú veľa príležitostí na napísať tento semester. 38 00:01:55,480 --> 00:01:59,100 Ale to je na najnižšej úrovni v pocit, že ste doslova začať písať 39 00:01:59,100 --> 00:02:04,270 sčítať a odčítať a násobiť a načítať z pamäte a uložiť do pamäte, 40 00:02:04,270 --> 00:02:08,259 veľmi základné pokyny, ktoré počítač, pod kapotou, 41 00:02:08,259 --> 00:02:09,639 skutočne rozumie. 42 00:02:09,639 --> 00:02:14,930 >> Konečne, montáž sa tento jazyk do núl a jednotiek, ktoré sme boli 43 00:02:14,930 --> 00:02:16,190 popisovať tak ďaleko. 44 00:02:16,190 --> 00:02:19,270 A naozaj nakoniec, je tu tzv prepojenie fázy, ktoré použijeme 45 00:02:19,270 --> 00:02:22,360 vidieť za chvíľu, ktorá spája Vaše núl a jedničiek s nulami a 46 00:02:22,360 --> 00:02:24,870 tie ostatné ľudia pred ste vytvorili. 47 00:02:24,870 --> 00:02:26,660 >> Takže zvážte to super jednoduchý program. 48 00:02:26,660 --> 00:02:27,560 To bolo od 1. týždňa. 49 00:02:27,560 --> 00:02:29,610 Je to len povedal, Hello World, na obrazovke. 50 00:02:29,610 --> 00:02:30,920 Bežali sme to cez Clang. 51 00:02:30,920 --> 00:02:33,200 Alebo sme bežali, že cez Urobiť ktorý bežal Clang. 52 00:02:33,200 --> 00:02:36,170 A výstup v čase, keď niektoré núl a jednotiek. 53 00:02:36,170 --> 00:02:38,100 Ale ukazuje sa, že je medzikrok. 54 00:02:38,100 --> 00:02:40,460 Keď idem sem - pardon, nie Chcem ho vidieť ešte. 55 00:02:40,460 --> 00:02:44,800 Keď idem sem k môjmu spotrebiče a otvorím hello.c, tu 56 00:02:44,800 --> 00:02:46,160 je to rovnaký program. 57 00:02:46,160 --> 00:02:48,600 A čo budem robiť vo svojom termináli Okno je tu budem 58 00:02:48,600 --> 00:02:51,430 spustiť Clang skôr ako značka, ktorá automatizuje všetky štyri 59 00:02:51,430 --> 00:02:52,870 tieto kroky u nás. 60 00:02:52,870 --> 00:02:58,620 A ja budem robiť klap-S a potom hello.c a zadajte. 61 00:02:58,620 --> 00:03:00,590 >> A ja si blikajúce výzva znova, čo je dobré. 62 00:03:00,590 --> 00:03:05,280 A teraz v mierne väčšie okno, Idem otvoriť gedit tu. 63 00:03:05,280 --> 00:03:09,610 A ja idem otvoriť súbor, ktorý, Ukázalo sa, že je to tzv hello.s 64 00:03:09,610 --> 00:03:11,870 obsahuje toto jazyk symbolických inštrukcií Som sa zmienil predtým. 65 00:03:11,870 --> 00:03:15,060 A to je to, čo sa nazýva montáž jazyk, pomerne nízkej úrovni 66 00:03:15,060 --> 00:03:18,470 inštrukcie, že váš procesor Intel alebo čo to je, že je vo vnútri 67 00:03:18,470 --> 00:03:19,350 chápe. 68 00:03:19,350 --> 00:03:24,480 A mov je k nasťahovaniu. Výzva je určená pre volanie, veľmi nízku úroveň funkcie. 69 00:03:24,480 --> 00:03:26,380 sub je pre odčítanie. 70 00:03:26,380 --> 00:03:30,370 >> Takže keď máte konkrétny procesor vnútri počítača, čo je to 71 00:03:30,370 --> 00:03:34,300 odlišné verzus ostatné procesorov na trhu, ktorý je inštrukcia sa 72 00:03:34,300 --> 00:03:39,460 chápe a často, ako efektívne je je, ako rýchlo je na vykonávanie niektorých 73 00:03:39,460 --> 00:03:40,380 z týchto inštrukcií. 74 00:03:40,380 --> 00:03:45,150 Teraz pre viac na túto tému, môžete sa Ďalší pád CS61 na vysokej škole. 75 00:03:45,150 --> 00:03:48,170 Ale tu sa, napríklad, niekoľko identifikátory, ktoré by mohli pripadať povedomý. 76 00:03:48,170 --> 00:03:50,150 hello.c je názov programu. 77 00:03:50,150 --> 00:03:51,070 >> . Textu - 78 00:03:51,070 --> 00:03:54,190 že to nie je moc zaujímavé, že práve teraz, pripomínajú, že text 79 00:03:54,190 --> 00:03:59,190 segmentu, v pondelok, je miesto, kde v Pamäť váš program vlastne skončí. 80 00:03:59,190 --> 00:04:01,330 Tak to aspoň hmlisto pozná tam. 81 00:04:01,330 --> 00:04:03,730 Tu sa samozrejme, je zmienka našou hlavné funkcie. 82 00:04:03,730 --> 00:04:07,220 Rolovanie dole, tie nájdete na veci tzv registre, veľmi malé kúsky 83 00:04:07,220 --> 00:04:09,190 pamäť vnútri vašej aktuálnej CPU. 84 00:04:09,190 --> 00:04:12,930 A keď som sa posunúť nadol, aj ďalej, vidím nejaký 85 00:04:12,930 --> 00:04:14,240 nepriame zmienky o ASCII. 86 00:04:14,240 --> 00:04:17,120 A tam, samozrejme, je to, že reťazec, ahoj, čiarka, svet. 87 00:04:17,120 --> 00:04:20,079 >> Tak dlhý príbeh krátky, to bolo deje pre vás, automaticky, 88 00:04:20,079 --> 00:04:22,140 pod kapotou celú túto dobu. 89 00:04:22,140 --> 00:04:26,450 A to, čo sa deje v skutočnosti je jednou čo ste spustili Clang, alebo prostredníctvom 90 00:04:26,450 --> 00:04:29,150 Skontrolujte, že ste stále po prvý raz, zo zdrojového kódu, 91 00:04:29,150 --> 00:04:30,700 tzv jazyku symbolických inštrukcií. 92 00:04:30,700 --> 00:04:35,210 Potom zvonenie je prevod tohto zhromaždenia jazyk až do núl a jednotiek. 93 00:04:35,210 --> 00:04:38,340 A to je snímka, ktorý sme začali naša diskusia v týždni 0, o - 94 00:04:38,340 --> 00:04:39,840 a potom týždeň 1 ďalej. 95 00:04:39,840 --> 00:04:44,030 A nakoniec, tie nuly a jednotky sú v kombinácii s nulami a jednotkami 96 00:04:44,030 --> 00:04:47,190 z týchto knižníc sme sa pri za samozrejmosť, ako je Standard I / O alebo 97 00:04:47,190 --> 00:04:50,010 String knižnice, alebo dokonca CS50 knižnica. 98 00:04:50,010 --> 00:04:54,200 >> Takže maľovať tento obrázok viac vizuálne, máme hello.c. 99 00:04:54,200 --> 00:04:57,220 A, samozrejme, používa printf fungovať povedať, hello world. 100 00:04:57,220 --> 00:05:01,810 Kompilácia krok sa dole do tento súbor sme práve videli hello.s, a to aj 101 00:05:01,810 --> 00:05:04,290 že aj keď je zvyčajne odstránený automaticky za vás. 102 00:05:04,290 --> 00:05:06,050 Ale to je kód assembleri uprostred kroku. 103 00:05:06,050 --> 00:05:09,750 A potom, keď sme sa zostaviť zostavy jazyk, aby som tak povedal, to je, keď ste 104 00:05:09,750 --> 00:05:10,830 dostať tie núl a jednotiek. 105 00:05:10,830 --> 00:05:13,920 Takže sme priblížili efektívne dnes čo sme užívali ako samozrejmosť, 106 00:05:13,920 --> 00:05:16,430 znamená ísť zdrojový kód objektového kódu. 107 00:05:16,430 --> 00:05:18,850 >> Ale nakoniec, teraz ten rovnaký obrázok - poďme strčiť ju do 108 00:05:18,850 --> 00:05:20,020 na ľavej strane. 109 00:05:20,020 --> 00:05:22,880 A všimnime si, že vo vrchole Zmienil som sa stdio.h. 110 00:05:22,880 --> 00:05:25,030 Je to súbor, ktorý sme súčasťou takmer vo všetkých 111 00:05:25,030 --> 00:05:26,250 programy, písali sme. 112 00:05:26,250 --> 00:05:28,830 A to je ten súbor, ktorého obsah dostať kópiu vložiť, 113 00:05:28,830 --> 00:05:30,350 účinne vrchole kódu. 114 00:05:30,350 --> 00:05:34,170 Ale ukazuje sa, že na počítači systém niekde, tam je pravdepodobne 115 00:05:34,170 --> 00:05:39,150 stdio.c súbor, ktorý niekto napísal rokov pred, ktorý implementuje všetky 116 00:05:39,150 --> 00:05:41,870 funkcie, ktoré sú deklarované v stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Teraz v skutočnosti je to asi nie je na Mac alebo PC, alebo dokonca v 118 00:05:45,465 --> 00:05:47,660 CS50 spotrebič je surový C kód. 119 00:05:47,660 --> 00:05:52,710 Niekto už skompilovaný a to vrátane . O súbor pre cieľový kód alebo. 120 00:05:52,710 --> 00:05:56,020 súbor, ktorý odkazuje na zdieľané knižnice , Ktorý bol predinštalovaný a 121 00:05:56,020 --> 00:05:57,240 predkompilované pre vás. 122 00:05:57,240 --> 00:06:01,950 Ale predpokladám, že tam skutočne existuje na našom počítači stdio.c v paralelnej 123 00:06:01,950 --> 00:06:02,650 s Clang. 124 00:06:02,650 --> 00:06:04,960 Váš kód je skompilovaný a zmontované. 125 00:06:04,960 --> 00:06:09,200 stdio.c je kód sa kompiluje a zostavené tak, že práve táto posledná 126 00:06:09,200 --> 00:06:13,730 krok, tu dole, musíme nejako odkaz, aby som tak povedal, vaše núl a jedničiek 127 00:06:13,730 --> 00:06:18,430 s jeho alebo jej núl a jednotiek do jedného jednoduchý program, ktorý v konečnom dôsledku je 128 00:06:18,430 --> 00:06:20,540 volal len Hello. 129 00:06:20,540 --> 00:06:23,340 >> Tak to je všetko o kúzle, ktoré je sa deje tak ďaleko. 130 00:06:23,340 --> 00:06:26,430 A bude aj naďalej, aby sa tieto procesy samozrejmosť, ale uvedomiť, 131 00:06:26,430 --> 00:06:28,750 je tu veľa šťavnatých detailov deje pod tam. 132 00:06:28,750 --> 00:06:31,920 A to je to, čo robí vaša počítač s Intel Inside 133 00:06:31,920 --> 00:06:33,940 obzvlášť zreteľný. 134 00:06:33,940 --> 00:06:37,020 >> Takže v takom prípade, ak chcete, aby Pripojte sa k nám na obed v piatok, to ísť 135 00:06:37,020 --> 00:06:41,570 na obvyklom mieste cs50.net/rsvp, 13:15 tento piatok. 136 00:06:41,570 --> 00:06:43,400 A teraz niekoľko oznámení. 137 00:06:43,400 --> 00:06:44,670 Takže máme dobrú správu. 138 00:06:44,670 --> 00:06:45,970 A máme zlé správy. 139 00:06:45,970 --> 00:06:47,260 Začnite s nejakou dobrou správou tu. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Stonanie] 142 00:06:54,510 --> 00:06:54,710 >> Dobrá. 143 00:06:54,710 --> 00:06:56,670 No, je to technicky dovolenku, tak to nie je tak moc Darček od nás. 144 00:06:56,670 --> 00:06:58,030 Ale potom tá zlá správa samozrejme. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Stonanie] 147 00:07:01,880 --> 00:07:03,530 >> Strávil som veľa času týchto animácií. 148 00:07:03,530 --> 00:07:04,690 >> [Smiech] 149 00:07:04,690 --> 00:07:07,000 >> K dispozícii bude preskúmanie zasadnutí tento rok v pondelok. 150 00:07:07,000 --> 00:07:08,340 Bude to byť o 17:30. 151 00:07:08,340 --> 00:07:11,210 My vám pripomenie všetkých týchto detailov prostredníctvom e-mailu na kurz je 152 00:07:11,210 --> 00:07:13,470 internetové stránky len pár dní čas. 153 00:07:13,470 --> 00:07:16,610 To bude natočený a sprístupnené krátko potom. 154 00:07:16,610 --> 00:07:19,200 Takže ak nemôžete robiť, že pondelok noc slot, neboj sa. 155 00:07:19,200 --> 00:07:22,270 Sekcia tento rok týždeň bude tiež zamerať na preskúmanie na kvíz. 156 00:07:22,270 --> 00:07:25,670 Ak váš oddiel je v pondelok, čo je naozaj univerzitné prázdniny, budeme 157 00:07:25,670 --> 00:07:26,920 stále stretávajú v časti. 158 00:07:26,920 --> 00:07:28,890 Ak si jednoducho nemôže robiť, že časť, pretože budete 159 00:07:28,890 --> 00:07:29,860 preč, to je v poriadku. 160 00:07:29,860 --> 00:07:33,710 Zúčastnite nedeľu alebo utorok oddielu alebo naladiť v oddieli Jasonova, čo je 161 00:07:33,710 --> 00:07:35,110 k dispozícii online. 162 00:07:35,110 --> 00:07:37,490 >> Takže, ďalšie zlé správy. 163 00:07:37,490 --> 00:07:41,960 Takže v súlade s osnovou, máme prednášku budúci piatok. 164 00:07:41,960 --> 00:07:43,690 Ale dobrá správa - 165 00:07:43,690 --> 00:07:44,860 jasne, som strávil príliš veľa času na to. 166 00:07:44,860 --> 00:07:45,280 >> [Smiech] 167 00:07:45,280 --> 00:07:47,140 >> Budeme zrušiť ďalšie piatkových prednášok. 168 00:07:47,140 --> 00:07:50,590 Takže to bude darček pre nás, takže môže mať naozaj krásny odpočinok v 169 00:07:50,590 --> 00:07:52,990 Medzi tento týždeň a dva týždne od tejto doby. 170 00:07:52,990 --> 00:07:57,460 Takže žiadne prednášky budúci týždeň, len malý malý kvíz, pre ktoré by mal byť 171 00:07:57,460 --> 00:07:59,030 stále viac vzrušený. 172 00:07:59,030 --> 00:08:03,870 >> Takže poďme sa zamerať na niečo, čo sa v skutočnosti vizuálnej 173 00:08:03,870 --> 00:08:06,990 a viac vzrušujúce a pôdu za to, čo sa deje, že je na obzore 174 00:08:06,990 --> 00:08:08,420 len na pár týždňov. 175 00:08:08,420 --> 00:08:12,160 Po prvom teste, budeme zase zameranie našich problémových súborov na iný 176 00:08:12,160 --> 00:08:16,710 domény špecifický problém, ktorý z forenznú alebo bezpečnostných všeobecnejšie. 177 00:08:16,710 --> 00:08:19,550 >> V skutočnosti, tradície s týmto problémom set je pre mňa jeden z 178 00:08:19,550 --> 00:08:24,850 výučby kolegami alebo CAS chodiť po Areál pričom niektoré fotografií 179 00:08:24,850 --> 00:08:29,450 identifikovateľné, ale bez zjavnej ľuďom, miesta, alebo veci, potom každý rok som 180 00:08:29,450 --> 00:08:34,520 nejako podarí omylom zmazať alebo poškodenie digitálnu pamäťovú kartu 181 00:08:34,520 --> 00:08:35,720 že je v našej kamery. 182 00:08:35,720 --> 00:08:36,860 Ale žiadny veľký problém. 183 00:08:36,860 --> 00:08:39,200 Môžem ísť ďalej a pripojte že do svojho počítača. 184 00:08:39,200 --> 00:08:43,010 Môžem urobiť forenznú obraz, takže hovoriť, skopírovaním a núl 185 00:08:43,010 --> 00:08:46,830 tie off tejto pamäťovej karty, či už jeho karta SD alebo Compact Flash karty alebo 186 00:08:46,830 --> 00:08:48,100 čo ste zvyknutí. 187 00:08:48,100 --> 00:08:49,300 A potom môžeme odovzdať, že von. 188 00:08:49,300 --> 00:08:53,190 >> A tak výzvou do budúcnosti, okrem iného čo pre vás bude písať 189 00:08:53,190 --> 00:08:58,630 C kódu, ktorý využíva veľa JPEG pre mňa a ukázalo sa bude 190 00:08:58,630 --> 00:09:00,190 tí ľudia, miesta alebo veci. 191 00:09:00,190 --> 00:09:03,340 A budeme tiež hovoriť, v tomto probléme nastaviť a v najbližších dňoch, o 192 00:09:03,340 --> 00:09:04,440 grafiky všeobecne. 193 00:09:04,440 --> 00:09:06,140 Použili sme ich, kurz, pre vypuknúť. 194 00:09:06,140 --> 00:09:09,080 Ale ty si nejako za samozrejmosť existuje vysokej úrovni tieto pojmy 195 00:09:09,080 --> 00:09:10,680 obdĺžniky a ovály. 196 00:09:10,680 --> 00:09:12,450 Ale pod kapotou tam sú pixely. 197 00:09:12,450 --> 00:09:14,370 A vy ste musel začať premýšľať o nich. 198 00:09:14,370 --> 00:09:18,800 Alebo budete pre p-set 4 myslieť o rozdiele medzi vaše tehál, ako 199 00:09:18,800 --> 00:09:21,990 rýchlo ste lopta pohybujúce sa po obrazovka pre vypuknúť. 200 00:09:21,990 --> 00:09:24,830 Takže tam je to pojem bodky na obrazovke, ktorá je 201 00:09:24,830 --> 00:09:26,290 vstupujú do hry už. 202 00:09:26,290 --> 00:09:29,430 >> Teraz to, čo vidíte, keď je to, čo sa dostanete na obrazovke počítača. 203 00:09:29,430 --> 00:09:33,680 Ak ste niekedy sledovali nejaké dobré alebo zlý TV, je pravdepodobné, že do značnej miery 204 00:09:33,680 --> 00:09:36,280 liečbe publikum ako technofobií ktorí nemajú naozaj 205 00:09:36,280 --> 00:09:37,630 vedieť veľa o počítači. 206 00:09:37,630 --> 00:09:40,840 A tak je to veľmi jednoduché pre políciu detektív povedať, môžete 207 00:09:40,840 --> 00:09:41,710 vyčistite, že pre mňa? 208 00:09:41,710 --> 00:09:42,710 Alebo zlepšiť, nie? 209 00:09:42,710 --> 00:09:45,550 Posilniť je ako Buzz slovo v takmer akýkoľvek trestný čin súvisiaci show. 210 00:09:45,550 --> 00:09:49,240 A realita je, ak budete mať veľmi rozmazaný obraz podozrivého robí 211 00:09:49,240 --> 00:09:51,620 niečo zlé, nemôžete Len zvýšenie. 212 00:09:51,620 --> 00:09:53,080 Nemôžete priblížiť nekonečne. 213 00:09:53,080 --> 00:09:56,350 Nevidíte v záblesk niečí oko, ktorý spáchal, že 214 00:09:56,350 --> 00:09:59,860 konkrétneho trestného činu, a to napriek Prevalencia tohto v televízii. 215 00:09:59,860 --> 00:10:04,110 >> A tak s tým poďme motivovať, aby Blížiace sa problém súprava s pohľad na 216 00:10:04,110 --> 00:10:05,765 Niektoré ukazuje, s ktorou môže byť povedomý. 217 00:10:05,765 --> 00:10:06,500 >> [PLAYBACK] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Teraz sa poďme dobré pozrieť sa 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 Spustiť to späť. 223 00:10:18,658 --> 00:10:19,550 >> -Počkaj chvíľu. 224 00:10:19,550 --> 00:10:21,580 Choď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 >> -Utiahnite na to, že sa máš? 231 00:10:25,140 --> 00:10:27,090 >> -Vector na uvedenom chlapa od zadného kolesa. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom tu na tomto mieste. 233 00:10:29,730 --> 00:10:33,700 >> -So správnym vybavením, zobrazované dá zväčšiť a naostrené. 234 00:10:33,700 --> 00:10:34,490 >> -Čo je to? 235 00:10:34,490 --> 00:10:35,870 >> -Je to vylepšenie programu. 236 00:10:35,870 --> 00:10:36,793 >> -Môžeš jasné, že sa nejaké? 237 00:10:36,793 --> 00:10:38,560 >> -Ja neviem. 238 00:10:38,560 --> 00:10:39,090 Poďme zvýšenie. 239 00:10:39,090 --> 00:10:41,690 >> -Vylepšite časť A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Aj lepší detail, a - 241 00:10:43,510 --> 00:10:44,456 >> -Myslím, že je dosť zlepšiť. 242 00:10:44,456 --> 00:10:45,402 Uvoľnite ho do mojej obrazovke. 243 00:10:45,402 --> 00:10:47,300 >> -Zvýšiť odraz v očiach. 244 00:10:47,300 --> 00:10:49,330 >> -Poďme tento príkaz prostredníctvom Zdokonalenia videa. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, môžete zlepšiť to? 246 00:10:50,340 --> 00:10:52,320 >> -Vydrž. 247 00:10:52,320 --> 00:10:54,290 >> -I've pracuje na tejto úvahy. 248 00:10:54,290 --> 00:10:55,560 >> -Niekto reflexie. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Je to odrazom z tváre. 251 00:10:57,940 --> 00:10:58,860 >> -Reflexia. 252 00:10:58,860 --> 00:10:59,710 >> -Je to odraz. 253 00:10:59,710 --> 00:11:00,900 >> -Priblížte na zrkadle. 254 00:11:00,900 --> 00:11:03,500 >> -Môžete vidieť odraz. 255 00:11:03,500 --> 00:11:04,700 >> -Môžeš zlepšiť imidž odtiaľto? 256 00:11:04,700 --> 00:11:05,700 >> -Môžete zvýšiť ho tu? 257 00:11:05,700 --> 00:11:06,500 >> -Môžete zlepšiť to? 258 00:11:06,500 --> 00:11:07,380 >> -Môžete zlepšiť to? 259 00:11:07,380 --> 00:11:08,190 >> -Môžeme zlepšiť to? 260 00:11:08,190 --> 00:11:08,940 >> -Môžete zlepšiť to? 261 00:11:08,940 --> 00:11:10,280 >> -Počkaj chvíľku, ja zlepšiť. 262 00:11:10,280 --> 00:11:11,570 >> -Priblížte na dvere. 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 >> [Smiech] 266 00:11:13,197 --> 00:11:14,360 >> -Nasťahovanie 267 00:11:14,360 --> 00:11:15,100 >> -Počkaj, prestaň. 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čiť o 75 stupňov okolo vertikálne prosím. 271 00:11:19,390 --> 00:11:19,886 >> [Smiech] 272 00:11:19,886 --> 00:11:24,350 >> -Zastavte a späť na časť, o dverám. 273 00:11:24,350 --> 00:11:26,330 >> Máte-o Image Enhancer ktoré môžu bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Možno, že môžeme použiť pradeep Sen spôsob, ako nahliadnuť do okien. 275 00:11:28,990 --> 00:11:30,680 >> -Tento softvér je najmodernejšie. 276 00:11:30,680 --> 00:11:31,676 >> -Ikona hodnota je vypnuté. 277 00:11:31,676 --> 00:11:34,166 >> -So správnou kombináciou algoritmov. 278 00:11:34,166 --> 00:11:38,399 >> -Vzal osvetlenie algoritmy ďalšiu úroveň a môžem použiť na 279 00:11:38,399 --> 00:11:38,648 doplnenie tohto snímku. 280 00:11:38,648 --> 00:11:42,050 >> -Lock a zväčšenie z-os. 281 00:11:42,050 --> 00:11:42,760 >> -Vylepšite. 282 00:11:42,760 --> 00:11:43,060 >> -Vylepšite. 283 00:11:43,060 --> 00:11:43,760 >> -Vylepšite. 284 00:11:43,760 --> 00:11:45,010 >> Freeze a zlepšiť. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END PLAYBACK] 287 00:11:47,910 --> 00:11:51,470 >> David J. Malan: Takže problém Set 5 je to, čo leží pred nami tam. 288 00:11:51,470 --> 00:11:55,260 Takže budeme čoskoro lepšie pochopiť o tom, kedy a prečo sa môžete 289 00:11:55,260 --> 00:11:57,300 a naše nemožno zvýšiť týmto spôsobom. 290 00:11:57,300 --> 00:12:00,090 Ale najprv poďme vrátiť našu pozornosť na niektoré zo stavebných kameňov budeme 291 00:12:00,090 --> 00:12:02,250 musia byť schopní povedať, že príbeh. 292 00:12:02,250 --> 00:12:05,580 >> Takže pripomínam, že sme vypracovali tento obrázok na Pondelok a trochu minulý týždeň. 293 00:12:05,580 --> 00:12:09,970 A to opisuje usporiadanie vecí v pamäti počítača, ak 294 00:12:09,970 --> 00:12:11,000 beží nejaký program. 295 00:12:11,000 --> 00:12:14,310 Tech segmente až hore, odvolanie, odkazuje skutočných núl a jedničiek 296 00:12:14,310 --> 00:12:16,000 že písať program. 297 00:12:16,000 --> 00:12:19,340 Tam je, že pod niektoré inicializovaný Neinicializované údaje, ktoré sa obvykle 298 00:12:19,340 --> 00:12:22,910 sa vzťahuje na veci, ako sú konštanty alebo reťazca alebo globálne premenné, ktoré majú 299 00:12:22,910 --> 00:12:24,200 bol vyhlásený za vopred. 300 00:12:24,200 --> 00:12:26,500 Tam je hromada, ale vrátime sa späť, že za chvíľku. 301 00:12:26,500 --> 00:12:27,410 >> A potom je tu hromada. 302 00:12:27,410 --> 00:12:30,660 Rovnako ako na hromadu zásobníkov v jedáleň, to je miesto, kde pamäť dostane 303 00:12:30,660 --> 00:12:33,610 vrstvené a vrstvené kedykoľvek budete robiť to, čo v programe? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Čo je to zásobník použiť pre? 306 00:12:37,730 --> 00:12:39,320 >> Jo? 307 00:12:39,320 --> 00:12:40,000 >> Volanie funkcie. 308 00:12:40,000 --> 00:12:42,890 Kedykoľvek volanie funkcie, je to vzhľadom k kúskom pamäte pre jeho 309 00:12:42,890 --> 00:12:45,020 lokálne premenné alebo parametre. 310 00:12:45,020 --> 00:12:48,810 A obrazovo, vidíme, že s každým následné funkcia je volaná, keď 311 00:12:48,810 --> 00:12:52,520 volanie volanie B C D hovory, ktoré sa vrstvia do zásobníka. 312 00:12:52,520 --> 00:12:55,630 A do každej z týchto plátkov pamäť je v podstate unikátny rozsah 313 00:12:55,630 --> 00:12:58,590 pre túto funkciu, ktorý, samozrejme, je problematické, ak chcete odovzdať 314 00:12:58,590 --> 00:13:01,850 z jednej funkcie na inú časť dát, ktoré chcete ju 315 00:13:01,850 --> 00:13:03,500 zmutovať alebo zmeniť. 316 00:13:03,500 --> 00:13:08,060 >> Takže to, čo bolo naše riešenie umožňujúce Funkcia reprezentovaný jedným zásobníka 317 00:13:08,060 --> 00:13:11,390 rám zmeniť pamäť vnútri z iného zásobníka rámu? 318 00:13:11,390 --> 00:13:14,590 Ako tie dva hovoriť k sebe navzájom? 319 00:13:14,590 --> 00:13:18,510 Takže prostredníctvom ukazovateľov alebo adries, ktoré opäť len opísať miesto, kde v 320 00:13:18,510 --> 00:13:22,280 pamäť, a spôsob, ako konkrétne skus číslo, najmä 321 00:13:22,280 --> 00:13:23,830 hodnotu možno nájsť. 322 00:13:23,830 --> 00:13:26,860 Tak spomínam minule taky sme pokračovali príbeh a pozrel sa 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čík pre niekoľko dôvodov, ale väčšina z nich je znepokojujúce 325 00:13:32,900 --> 00:13:34,620 pretože nedokáže zistiť, čo? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Jo, to nedokáže kontrolovať vstup. 328 00:13:40,450 --> 00:13:41,870 Je nám ľúto? 329 00:13:41,870 --> 00:13:43,880 >> Ak je to viac ako 12 znakov. 330 00:13:43,880 --> 00:13:47,260 Takže veľmi elegantne, pri volaní memcopy, ktorý, ako už názov napovedá, práve 331 00:13:47,260 --> 00:13:50,630 kópie pamäte z jeho druhý argument do prvej argument. 332 00:13:50,630 --> 00:13:54,730 Tretí argument, veľmi elegantne, je skontrolovať, aby sa ubezpečil, že nemáte 333 00:13:54,730 --> 00:13:59,400 kopírovať viac, v tomto prípade, na dĺžku baru, počet znakov, 334 00:13:59,400 --> 00:14:03,810 do miesta určenia, ktoré je táto pole C. Ale problém je, že to, čo 335 00:14:03,810 --> 00:14:07,230 ak C sám o sebe nie je dostatočne veľká zvládnuť, že? 336 00:14:07,230 --> 00:14:09,900 Budeš kopírovať počtu bajtov, že ste uvedené. 337 00:14:09,900 --> 00:14:13,040 Ale čo v skutočnosti majú viac bajtov, než máte priestor pre? 338 00:14:13,040 --> 00:14:16,770 >> No, tento program veľmi bláznivo len slepo pokračuje vziať, čo je to 339 00:14:16,770 --> 00:14:20,650 dané, ahoj spätné lomítko 0 je skvelé, ak reťazec je krátka 340 00:14:20,650 --> 00:14:22,040 dosť, rovnako ako päť znakov. 341 00:14:22,040 --> 00:14:26,470 Ale či je to naozaj 12 znakov alebo 1200 znakov, sme videli minule 342 00:14:26,470 --> 00:14:29,380 že ste len tak úplne prepísať pamäť, 343 00:14:29,380 --> 00:14:30,470 nepatrí k vám. 344 00:14:30,470 --> 00:14:34,390 A v najhoršom prípade, ak sa prepísať, že Červená časť je, že sme nazvali 345 00:14:34,390 --> 00:14:35,380 spiatočná adresa - 346 00:14:35,380 --> 00:14:38,370 To je presne tam, kde je počítač automaticky za vás, za 347 00:14:38,370 --> 00:14:43,130 scény, brucha ďaleko 32-bitová hodnota, ktorá pripomína to, čo by malo adresa 348 00:14:43,130 --> 00:14:47,080 vráti, až foo, to iná funkcia, sa vykonáva spustením. 349 00:14:47,080 --> 00:14:49,320 Je to chlieb drobček druhov , Na ktoré sa vracia. 350 00:14:49,320 --> 00:14:52,490 Ak nahrávate, že potenciálne ak ste zlý človek, by možné 351 00:14:52,490 --> 00:14:54,750 potenciálne prevziať niečí počítač. 352 00:14:54,750 --> 00:14:58,020 A budete určite zrútenie vo väčšine prípadov. 353 00:14:58,020 --> 00:15:01,690 >> Teraz tento problém bol len zhoršilo keď sme začali hovoriť o pamäti 354 00:15:01,690 --> 00:15:03,010 riadenie všeobecne. 355 00:15:03,010 --> 00:15:07,150 A malloc pre alokáciu pamäte, je funkcie, ktorú môžeme použiť na pridelenie 356 00:15:07,150 --> 00:15:11,260 pamäti, keď nevieme vopred že by sme mohli potrebovať. 357 00:15:11,260 --> 00:15:13,960 Tak napríklad, keď som sa vrátiť k spotrebiču tu. 358 00:15:13,960 --> 00:15:21,010 A otvorím z minulého času hello2.c, pripomínajú tento program, ktorá sem vyzeral 359 00:15:21,010 --> 00:15:23,500 Trochu niečo také, len tri linky - 360 00:15:23,500 --> 00:15:27,940 uviesť svoje meno, potom reťazec meno, na ľavej strane, rovná GetString. 361 00:15:27,940 --> 00:15:29,690 A potom sme ho vytlačiť, meno užívateľa. 362 00:15:29,690 --> 00:15:31,170 >> Tak toto je super jednoduchý program. 363 00:15:31,170 --> 00:15:34,870 Aby bolo jasno, nechajte ma ísť napred a aby ahoj-2. 364 00:15:34,870 --> 00:15:36,680 Chystám sa urobiť bodku lomítko ahoj-2. 365 00:15:36,680 --> 00:15:37,750 Uveďte svoje meno - 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á sa, že funguje OK. 370 00:15:41,060 --> 00:15:43,140 Ale to, čo sa naozaj deje pod kapotou tu? 371 00:15:43,140 --> 00:15:44,670 Najprv poďme zlúpnite niektorých vrstiev. 372 00:15:44,670 --> 00:15:48,380 String je len synonymom máme si uvedomil, na čo? 373 00:15:48,380 --> 00:15:49,110 Char hviezda. 374 00:15:49,110 --> 00:15:52,740 Takže poďme robiť to trochu tajomný ale technicky správne, že tento 375 00:15:52,740 --> 00:15:55,570 je char hviezda, čo znamená, že meno, áno, je premenná. 376 00:15:55,570 --> 00:15:59,920 Ale to, čo názov predajne je adresa char, ktorá sa cíti trochu divne 377 00:15:59,920 --> 00:16:01,050 pretože som sa vrátiť reťazec. 378 00:16:01,050 --> 00:16:03,580 Začínam späť viac znaky nie sú char. 379 00:16:03,580 --> 00:16:07,400 >> Ale samozrejme, budete potrebovať len prvý char adresa si spomenúť, kde 380 00:16:07,400 --> 00:16:08,870 Celý reťazec je, pretože prečo? 381 00:16:08,870 --> 00:16:12,700 Ako zistiť, kde koniec reťazec je poznať na začiatku? 382 00:16:12,700 --> 00:16:13,630 Spätné lomítko nula. 383 00:16:13,630 --> 00:16:17,260 Takže s týmito dvoma stopy zistiť, pred začiatkom a na konci 384 00:16:17,260 --> 00:16:20,280 ľubovoľný reťazec je tak dlho, kým sú správne tvarované s týmto null 385 00:16:20,280 --> 00:16:22,110 terminator, že spä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 sa, že GetString Celú tú dobu bol druh 388 00:16:28,020 --> 00:16:28,820 podvádzanie pre nás. 389 00:16:28,820 --> 00:16:32,460 Bolo to robí túto prácu, aby ste sa uistili, ako reťazec od užívateľa. 390 00:16:32,460 --> 00:16:34,580 Ale kde je, že pamäť bola z? 391 00:16:34,580 --> 00:16:38,440 Ak sa vrátime k obrázku sem použiť definíciu z takmer 392 00:16:38,440 --> 00:16:42,610 Pred chvíľou, že zásobník je miesto, kde pamäť ide, keď sú volány funkcie, 393 00:16:42,610 --> 00:16:45,370 podľa tejto logiky, keď zavoláte GetString, a potom som písať 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áklade 395 00:16:50,900 --> 00:16:53,480 Príbeh sme povedali nám ďaleko? 396 00:16:53,480 --> 00:16:55,190 >> Mohlo by sa zdať, že je v zásobník, nie? 397 00:16:55,190 --> 00:16:58,120 Ak voláte získať reťazec dostanete malý plátok pamäte na zásobníku. 398 00:16:58,120 --> 00:17:01,630 Takže je logické, že D - V-I-D spä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čkaj, getString vráti tento reťazec, aby som tak povedal, čo znamená, 401 00:17:07,680 --> 00:17:11,700 je to zásobník z jedálne je prevzatý zo zásobníka. 402 00:17:11,700 --> 00:17:14,560 A my sme povedali minule, že akonáhle funkcia vracia, a vy sa, že 403 00:17:14,560 --> 00:17:20,109 zásobník, aby som tak povedal, zo zásobníka, čo možno predpokladať, o pozostatkoch 404 00:17:20,109 --> 00:17:21,819 že pamäť? 405 00:17:21,819 --> 00:17:25,160 Trochu som překleslil ako otázniky pretože účinne sa 406 00:17:25,160 --> 00:17:26,250 neznáme hodnoty. 407 00:17:26,250 --> 00:17:29,500 Ktoré môžu byť znovu použité, ak nejaké Ďalšia funkcia je volaná. 408 00:17:29,500 --> 00:17:31,870 >> Inými slovami, ak sa stane, na ukladanie - 409 00:17:31,870 --> 00:17:34,350 Budem čerpať rýchlu obrázok tu v zásobníku. 410 00:17:34,350 --> 00:17:38,690 Ak sa stalo, že sa čerpanie spodnej môjho segmentu pamäti, a povieme 411 00:17:38,690 --> 00:17:42,230 že toto je miesto pamäti obsadený hlavný a možno arg C a 412 00:17:42,230 --> 00:17:46,790 arg v a niečo iné v programe, pri volaní GetString, 413 00:17:46,790 --> 00:17:51,120 pravdepodobne dostane GetString kus pamäti tu. 414 00:17:51,120 --> 00:17:53,940 A potom D - V-I-D nejako skončí v tejto funkcii. 415 00:17:53,940 --> 00:17:55,320 A budem zjednodušovať. 416 00:17:55,320 --> 00:18:00,050 Ale predpokladajme, že jej D - V-I-D spätné lomítko nula. 417 00:18:00,050 --> 00:18:03,500 Takže toto množstvo bajtov sa používa v rám pre getString. 418 00:18:03,500 --> 00:18:08,270 >> Ale akonáhle getString vráti, budeme povedal minule, že táto pamäť po 419 00:18:08,270 --> 00:18:11,340 tu všetko sa stáva - Woops! - 420 00:18:11,340 --> 00:18:14,270 všetci sa efektívne vymazané. 421 00:18:14,270 --> 00:18:17,220 A my môžeme myslieť na to teraz ako otázku značky, pretože kto vie 422 00:18:17,220 --> 00:18:18,720 čo sa deje, aby sa stal z tejto pamäte. 423 00:18:18,720 --> 00:18:22,130 Naozaj, veľmi často volať funkcie iné ako GetString. 424 00:18:22,130 --> 00:18:24,750 A akonáhle som volať iné funkcie ako GetString, možno nie v 425 00:18:24,750 --> 00:18:28,860 Tento konkrétny program sa len pozeral na, ale nejaká iná, určite iné 426 00:18:28,860 --> 00:18:34,180 funkcia môže skončiť daná Táto ďalšie miesto v zásobníku. 427 00:18:34,180 --> 00:18:39,410 >> Takže to nemôže byť, že getString obchody D - V-I-D na stacku, pretože by som 428 00:18:39,410 --> 00:18:41,040 okamžite stratí prístup k nemu. 429 00:18:41,040 --> 00:18:43,720 Ale my vieme, že getString vráti len to, čo? 430 00:18:43,720 --> 00:18:47,220 Nie je to návrat do mi šesť znakov. 431 00:18:47,220 --> 00:18:51,090 Čo je skutočne vracia sa sme došli k záveru minule? 432 00:18:51,090 --> 00:18:52,480 Adresa prvý. 433 00:18:52,480 --> 00:18:56,650 Tak nejako, keď si volal GetString, je to prideľovanie kus pamäti 434 00:18:56,650 --> 00:18:59,620 Reťazec, ktorý užívatelia typ a potom sa vracať adresa nej. 435 00:18:59,620 --> 00:19:02,930 A ukázalo sa, že keď chcete funkcie alokovať pamäť v tomto 436 00:19:02,930 --> 00:19:08,390 spôsob a návrat do osoby, ktorá volala že funkcia, adresa 437 00:19:08,390 --> 00:19:11,870 že kus pamäti, ste úplne nie je možné, aby ju do zásobníka na 438 00:19:11,870 --> 00:19:14,750 dno, pretože funkčne je to len bude to stáť tebe moc 439 00:19:14,750 --> 00:19:17,800 rýchlo, takže asi tušíte, kde budeme pravdepodobne bude hodiť 440 00:19:17,800 --> 00:19:20,130 miesto, tzv haldy. 441 00:19:20,130 --> 00:19:25,290 >> Takže medzi spodnou časťou pamäť je rozloženie a horná pamäť je 442 00:19:25,290 --> 00:19:26,820 layout je celá banda segmentov. 443 00:19:26,820 --> 00:19:29,270 Jedným z nich je zásobník a doprava nad ňou je halda. 444 00:19:29,270 --> 00:19:33,680 A halda je len iný kus pamäť, ktorá sa nepoužíva pre funkcie 445 00:19:33,680 --> 00:19:34,770 keď ste volaní. 446 00:19:34,770 --> 00:19:38,100 Používa sa na dlhodobejšie pamäť, keď Ak jedna funkcia chytiť niektoré 447 00:19:38,100 --> 00:19:42,700 pamäte a môcť zavesiť na to bez straty kontroly nad ním. 448 00:19:42,700 --> 00:19:45,550 >> Teraz by snáď okamžite vidieť, že to nie je 449 00:19:45,550 --> 00:19:48,060 nutne dokonalý dizajn. 450 00:19:48,060 --> 00:19:51,350 Ako váš program pridelenej pamäte na zásobník, alebo ako tomu hovoríte a viac 451 00:19:51,350 --> 00:19:55,540 viac funkcií, alebo ako si rozdeliť pamäť na halde s malloc off ako 452 00:19:55,540 --> 00:20:00,690 GetString robí to, čo jasne Zdá sa, že neodvratný problém? 453 00:20:00,690 --> 00:20:00,860 >> Presne tak. 454 00:20:00,860 --> 00:20:03,150 Rovnako ako skutočnosť, že tieto šípky smerovali na seba 455 00:20:03,150 --> 00:20:04,380 neveští nič dobrého. 456 00:20:04,380 --> 00:20:08,630 A skutočne, môžeme veľmi rýchlo dôjsť k zlyhaniu program, v mnohých rôznymi spôsobmi. 457 00:20:08,630 --> 00:20:12,050 V skutočnosti si myslím, že by sme mohli mať urobil náhodne raz. 458 00:20:12,050 --> 00:20:14,020 A ak nie, ideme na to zámerne teraz. 459 00:20:14,020 --> 00:20:21,330 Nechaj ma ísť ďalej a písať Super rýchlo program s názvom dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 A teraz pôjdem sem a sa ostré patrí stdio.h. 461 00:20:26,730 --> 00:20:32,620 Poďme deklarovať funkcie foo sa žiadne argumenty, čo je 462 00:20:32,620 --> 00:20:34,040 označovaný ako dobre prázdnoty. 463 00:20:34,040 --> 00:20:37,830 >> A jediná vec, foo sa chystá urobiť, je volanie foo, ktorý pravdepodobne nie je 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 Teraz je jediná vec, hlavné sa deje urobiť, je zavolať foo rovnako. 467 00:20:45,270 --> 00:20:51,050 A len tak pre srandu, ja idem dopredu a tu hovoria 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 keď som nerobil žiadne chyby, Urobiť dontdothis dot lomítko. 471 00:21:00,160 --> 00:21:01,960 A ideme na to vo väčšom okne - 472 00:21:01,960 --> 00:21:03,210 bodka lomítko, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Tak poď. 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á sa, že to môžete urobiť. 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čkajte. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Mali sme - 483 00:21:18,270 --> 00:21:20,110 My sme ju použiť s make. 484 00:21:20,110 --> 00:21:22,050 >> [Povzdychne si] 485 00:21:22,050 --> 00:21:25,110 >> Ja viem, ale myslím, že my práve zmazal 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 Vyriešte tento Rob. 489 00:21:32,640 --> 00:21:34,678 Čo je? 490 00:21:34,678 --> 00:21:35,928 Je to veľmi jednoduché. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Jo, sme sa obrátili optimalizácia off. 493 00:21:47,360 --> 00:21:48,970 OK, stať ahoj. 494 00:21:48,970 --> 00:21:49,950 Teraz sa cítim lepšie. 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 poďme překompilovat to - 498 00:21:53,430 --> 00:21:55,880 Urobiť si dontdothis. 499 00:21:55,880 --> 00:22:00,090 Možno budete musieť premenovať to dothis.c za chvíľu. 500 00:22:00,090 --> 00:22:00,710 Tam ideme. 501 00:22:00,710 --> 00:22:01,240 Ďakujem. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Fakt, že som bol tlač niečo, čo bolo v skutočnosti len 504 00:22:05,480 --> 00:22:08,150 spomaľuje proces, pri ktorom sa by dosiahol tohto 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 čo sa vlastne deje? 508 00:22:11,180 --> 00:22:14,440 Dôvodom je, rovnako ako stranou, je robiť nič, pokiaľ ide o vstup a 509 00:22:14,440 --> 00:22:17,270 výstup má tendenciu byť pomalší, pretože písať znaky 510 00:22:17,270 --> 00:22:18,600 obrazovke, má posúvať. 511 00:22:18,600 --> 00:22:21,720 Tak dlhý príbeh krátky, mal som vlastne Stalo sa to tak netrpezlivá, museli by sme 512 00:22:21,720 --> 00:22:23,260 videl konečný výsledok rovnako. 513 00:22:23,260 --> 00:22:26,220 Teraz, keď som dostal jazdu na tlač-up, vidíme to hneď. 514 00:22:26,220 --> 00:22:28,410 Tak prečo sa to deje. 515 00:22:28,410 --> 00:22:31,300 No, jednoduché vysvetlenie, samozrejme, je, že foo asi nemal 516 00:22:31,300 --> 00:22:32,500 bude volať sám. 517 00:22:32,500 --> 00:22:34,470 >> Teraz vo všeobecnej rovine, je to rekurzia. 518 00:22:34,470 --> 00:22:36,970 A mysleli sme si pár týždňov Pred rekurzívne je dobrá. 519 00:22:36,970 --> 00:22:40,330 Rekurzia je to magický spôsob sebavyjadrenia Super stručne. 520 00:22:40,330 --> 00:22:41,400 A to jednoducho funguje. 521 00:22:41,400 --> 00:22:45,060 Ale tam je kľúčovým rysom všetkých rekurzívne programy Hovorili sme 522 00:22:45,060 --> 00:22:48,260 o a pozrel sa na tak ďaleko, čo bolo, že mali čo? 523 00:22:48,260 --> 00:22:52,610 Referenčný prípad, ktorý bol nejaký pevný kódované prípade tým, že v niektorých situáciách 524 00:22:52,610 --> 00:22:56,210 nevolajte foo, ktorý je jasne nie je tento prípad. 525 00:22:56,210 --> 00:22:58,920 >> Takže to, čo sa skutočne deje čo sa týka obrázku? 526 00:22:58,920 --> 00:23:01,790 No, keď hlavný volá foo, že mať úžitok z pamäti. 527 00:23:01,790 --> 00:23:04,150 Keď volá foo foo, dostane plátok pamäti. 528 00:23:04,150 --> 00:23:06,430 Keď volá foo foo, dostane kúsok. 529 00:23:06,430 --> 00:23:07,080 To dostane rez. 530 00:23:07,080 --> 00:23:08,120 To dostane rez. 531 00:23:08,120 --> 00:23:09,460 Vzhľadom k tomu, foo nikdy vracať. 532 00:23:09,460 --> 00:23:12,160 My nikdy mazanie jedným z tých, rámy zo zásobníka. 533 00:23:12,160 --> 00:23:15,930 Takže sme prefúknutiu hromadu, a to uviesť, kto vie, čo ešte, a 534 00:23:15,930 --> 00:23:19,600 budeme prekračovať hranice našej tzv segment pamäte. 535 00:23:19,600 --> 00:23:21,790 Chyba ísť segmentácia false. 536 00:23:21,790 --> 00:23:24,110 >> Takže riešenie je jasne, nerob to. 537 00:23:24,110 --> 00:23:28,830 Ale väčšie vyplýva, že áno, tam je nejaká hranica, absolútne, 538 00:23:28,830 --> 00:23:32,470 aj keď to nie je dobre definovaná, ako mnoho funkcií, môžete volať do 539 00:23:32,470 --> 00:23:34,970 Program, koľkokrát funkcie môžu volať sám. 540 00:23:34,970 --> 00:23:38,430 Takže aj keď sme kázať rekurziu ako tejto potenciálne magické veci 541 00:23:38,430 --> 00:23:41,870 Pred pár týždňami na sigma funkcie, a keď sme sa získať dáta 542 00:23:41,870 --> 00:23:45,270 štruktúry a CS50, uvidíte ďalšie Žiadosti o tom, že to nie je 543 00:23:45,270 --> 00:23:46,500 nutne tá najlepšia vec. 544 00:23:46,500 --> 00:23:50,070 Vzhľadom k tomu, ak sa volanie funkcie, volá sama seba, aj keď je tu základňa 545 00:23:50,070 --> 00:23:54,860 prípade, ak nechcete zasiahnuť, že základný prípad, 1000 pre hovory alebo hovory 10000, podľa 546 00:23:54,860 --> 00:23:58,800 Vtedy ste možno došli miestnosti na tzv zásobníka a stlačte kláves 547 00:23:58,800 --> 00:24:00,400 niektoré iné časti pamäte. 548 00:24:00,400 --> 00:24:03,950 Tak to je tiež dizajn trade-off medzi eleganciou a medzi 549 00:24:03,950 --> 00:24:06,920 robustnosť váš konkrétny implementácia. 550 00:24:06,920 --> 00:24:10,780 >> Takže tam je ďalšia nevýhoda, alebo ďalšie chyták na to, čo máme 551 00:24:10,780 --> 00:24:11,720 robil tak ďaleko. 552 00:24:11,720 --> 00:24:12,980 Keď som volal GetString - 553 00:24:12,980 --> 00:24:15,120 nechaj ma ísť späť do ahoj-2. 554 00:24:15,120 --> 00:24:18,170 Všimnite si, že volám GetString, ktorý sa vracia 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 teraz som vytlačenie string na tejto adrese. 557 00:24:24,480 --> 00:24:27,000 Ale my sme nikdy nevolal opak GetString. 558 00:24:27,000 --> 00:24:30,850 Nikdy sme museli calll funkciu ako ungetstring, kde ste ruku späť 559 00:24:30,850 --> 00:24:31,610 že pamäť. 560 00:24:31,610 --> 00:24:33,250 Ale úprimne povedané, sme asi by mal byť. 561 00:24:33,250 --> 00:24:37,390 Pretože ak budeme stále pýtajú počítač pre pamäť tým, že spôsob, ako niekoho, ako je 562 00:24:37,390 --> 00:24:40,830 GetString ale nikdy to vrátiť, určite že je tiež nevyhnutne povedie k 563 00:24:40,830 --> 00:24:42,970 problémy, ktorým sme sa spustiť z pamäte. 564 00:24:42,970 --> 00:24:46,140 >> A v skutočnosti, môžeme sa za ne problémy s novým nástrojom, ktorého použitie 565 00:24:46,140 --> 00:24:47,640 je trochu záhadné písať. 566 00:24:47,640 --> 00:24:50,960 Ale dovoľte mi ísť dopredu a nešetriť ju na obrazovke len na chvíľu. 567 00:24:50,960 --> 00:24:56,940 Chystám sa ísť dopredu a spustite Valgrind s parametrom, ktorého prvý príkaz 568 00:24:56,940 --> 00:25:00,260 argument riadok je názov tohto programu ahoj-2. 569 00:25:00,260 --> 00:25:02,650 A bohužiaľ je to výstup je ukrutne 570 00:25:02,650 --> 00:25:04,290 komplexné bezdôvodne. 571 00:25:04,290 --> 00:25:06,280 Vidíme všetko, čo neporiadok. 572 00:25:06,280 --> 00:25:07,530 David je uvedené moje meno. 573 00:25:07,530 --> 00:25:09,760 Tak to je program, vlastne beží. 574 00:25:09,760 --> 00:25:11,180 A teraz si tento výstup. 575 00:25:11,180 --> 00:25:13,400 >> Takže Valgrind je podobný svojím duchom GDB. 576 00:25:13,400 --> 00:25:14,950 Nie je to debugger sebe. 577 00:25:14,950 --> 00:25:16,270 Ale je to spomienka kontrolu. 578 00:25:16,270 --> 00:25:20,140 Je to program, ktorý spustí programovať a poviem vám, ak budete požiadaní 579 00:25:20,140 --> 00:25:23,860 počítač na pamäti a nikdy podal späť, čím čo znamená, že máte 580 00:25:23,860 --> 00:25:24,570 pretečeniu pamäte. 581 00:25:24,570 --> 00:25:26,240 A úniky pamäte majú tendenciu byť zlé. 582 00:25:26,240 --> 00:25:29,120 A vy ste sa užívatelia počítačov majú Pravdepodobne cítil, či máte 583 00:25:29,120 --> 00:25:30,300 Mac alebo PC. 584 00:25:30,300 --> 00:25:33,730 Už ste niekedy používali počítač while a sa nereštartuje v niekoľkých 585 00:25:33,730 --> 00:25:36,820 dni, alebo ste práve dostal veľa programy spustené, a tá prekliata vec 586 00:25:36,820 --> 00:25:42,360 spomalí sa zastavila, alebo aspoň Je to super nepríjemné používať, pretože 587 00:25:42,360 --> 00:25:44,350 všetko, čo práve super slow. 588 00:25:44,350 --> 00:25:46,260 >> Teraz to môže byť ľubovoľný počet dôvodov. 589 00:25:46,260 --> 00:25:49,600 Mohlo by to byť nekonečná slučka, chyba v niečí kód, alebo, viac jednoducho, že 590 00:25:49,600 --> 00:25:53,250 by mohlo znamenať, že používate viac pamäť, alebo sa snaží, ako vaša 591 00:25:53,250 --> 00:25:54,920 počítač v skutočnosti má. 592 00:25:54,920 --> 00:25:57,770 A možno je to chyba v nejakom programe že stále pýtajú na pamäti. 593 00:25:57,770 --> 00:26:02,480 Prehliadače pre roky boli notoricky známi pre to, žiadajú viac a viac pamäte 594 00:26:02,480 --> 00:26:03,870 ale nikdy podal naspäť. 595 00:26:03,870 --> 00:26:07,220 Iste, ak máte iba konečný množstvo pamäti, nemôžete žiadať 596 00:26:07,220 --> 00:26:09,990 nekonečne mnohokrát pre niektoré z týchto pamätí. 597 00:26:09,990 --> 00:26:13,070 >> A tak to, čo vidíte tu, aj keď znovu Valgrind je výstup 598 00:26:13,070 --> 00:26:17,490 zbytočne zložité, aby sa pozrel na Prvá, to je zaujímavá časť. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 v prevádzke na výstupe. 601 00:26:20,060 --> 00:26:22,810 Tak tu je, koľko pamäte je sa používa v halde 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 zrejme šesť bajtov v jednom bloku. 604 00:26:27,280 --> 00:26:28,710 Takže budem mávať rukami v akom je blok. 605 00:26:28,710 --> 00:26:31,270 Myslite na to je len kus, ďalší technický výraz pre kus. 606 00:26:31,270 --> 00:26:33,140 Ale šesť bajtov - 607 00:26:33,140 --> 00:26:36,870 čo je šesť bytov, ktoré boli ešte v použitie? 608 00:26:36,870 --> 00:26:37,390 >> Presne tak. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D lomka nula, päť písmeno Názov a null terminátor. 610 00:26:41,520 --> 00:26:46,350 Takže tento program Valgrind si všimol, že som požiadal o šiestich bytoch, zrejme tým, že 611 00:26:46,350 --> 00:26:48,950 spôsob GetString, ale nikdy dal naspäť. 612 00:26:48,950 --> 00:26:52,030 A v skutočnosti, mohlo by to byť tak zrejmé, keď môj program nie je tri 613 00:26:52,030 --> 00:26:53,590 linky, ale je to 300 riadkov. 614 00:26:53,590 --> 00:26:56,920 Takže môžeme skutočne dať iný príkaz linka argument Valgrind na 615 00:26:56,920 --> 00:26:58,290 aby bolo viac ukecaný. 616 00:26:58,290 --> 00:26:59,760 Je to trochu nepríjemné pamätať. 617 00:26:59,760 --> 00:27:01,580 Ale keď to urobím - 618 00:27:01,580 --> 00:27:01,930 pozrime. 619 00:27:01,930 --> 00:27:03,540 Leak - 620 00:27:03,540 --> 00:27:05,030 Bolo to k úniku - 621 00:27:05,030 --> 00:27:07,580 ani nepamätám čo je to preč ruky. 622 00:27:07,580 --> 00:27:08,550 >> - Kontrola tesnosti sa rovná plnej výške. 623 00:27:08,550 --> 00:27:10,180 Jo, ďakujem. 624 00:27:10,180 --> 00:27:12,520 - Kontrola tesnosti sa rovná plnej výške. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Rovnaký program beží. 627 00:27:14,940 --> 00:27:16,180 Zadajte v Dávidovi znova. 628 00:27:16,180 --> 00:27:17,660 Teraz vidím trochu podrobnejšie. 629 00:27:17,660 --> 00:27:20,890 Ale pod haldy zhrnutie, čo je totožná s štyri - ah, 630 00:27:20,890 --> 00:27:22,120 je to celkom pekné. 631 00:27:22,120 --> 00:27:25,460 Teraz Valgrind je vlastne hľadá trochu ťažšie v mojom kóde. 632 00:27:25,460 --> 00:27:29,580 A to sa hovorí, že, zdá sa, malloc na riadku - 633 00:27:29,580 --> 00:27:30,580 sme oddialiť. 634 00:27:30,580 --> 00:27:31,980 Na riadku - 635 00:27:31,980 --> 00:27:32,930 nevidíme, aký postoj je. 636 00:27:32,930 --> 00:27:35,110 Ale malloc je prvým vinníkom. 637 00:27:35,110 --> 00:27:38,630 Je to blog na malloc. 638 00:27:38,630 --> 00:27:39,810 >> V poriadku? 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 som GetString. 642 00:27:42,520 --> 00:27:44,460 GetString zrejme volá malloc. 643 00:27:44,460 --> 00:27:47,800 Takže to, čo riadok kódu je zrejme vinný s 644 00:27:47,800 --> 00:27:49,050 pridelené túto pamäť? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Predpokladajme, že ten, kto napísal malloc bol asi dosť dlho, že je to 647 00:27:55,540 --> 00:27:56,390 nie je ich chyba. 648 00:27:56,390 --> 00:27:57,520 Takže je to asi moja. 649 00:27:57,520 --> 00:28:02,000 GetString v cs50.c - takže je to súbor niekde na počítači - 650 00:28:02,000 --> 00:28:05,210 v riadku 286 sa zdá, že je vinník. 651 00:28:05,210 --> 00:28:08,140 Teraz predpokladajme, že CS50 bolo okolo slušné množstvo času, takže 652 00:28:08,140 --> 00:28:09,720 my sú neomylné. 653 00:28:09,720 --> 00:28:14,080 A tak to asi nie je v getString že chyba spočíva, 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 poďme sa pozrieť na čo to linka 18 bola. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Nejako tento riadok nie je nevyhnutne buggy, samo o sebe, ale to je dôvod, 658 00:28:27,130 --> 00:28:28,630 za tým pretečeniu pamäte. 659 00:28:28,630 --> 00:28:32,140 Takže proste super, čo by intuitívne Riešením je? 660 00:28:32,140 --> 00:28:34,710 Ak sa pýtate na pamäti, neboli nikdy dať späť, a že sa zdá, že je 661 00:28:34,710 --> 00:28:37,940 problém, pretože v priebehu času svoj počítač môže spustiť z pamäte, môže spomaliť 662 00:28:37,940 --> 00:28:42,110 nadol, môže zlé veci sa stávajú, no, to, čo je jednoduché intuitívne riešenie? 663 00:28:42,110 --> 00:28:43,140 Daj to späť. 664 00:28:43,140 --> 00:28:44,770 >> Ako sa uvoľniť, že pamäť? 665 00:28:44,770 --> 00:28:49,970 No, našťastie je to celkom jednoduché len povedať, bez názvu. 666 00:28:49,970 --> 00:28:51,260 A my sme nikdy nerobil. 667 00:28:51,260 --> 00:28:55,890 Ale môžete v podstate myslieť zadarmo ako protiklad malloc. 668 00:28:55,890 --> 00:28:58,030 zadarmo, je opakom prideľovanie pamäte. 669 00:28:58,030 --> 00:28:59,540 Takže teraz mi dovoľte překompilovat to. 670 00:28:59,540 --> 00:29:02,050 Skontrolujte, ahoj-2. 671 00:29:02,050 --> 00:29:04,620 Dovoľte mi ho spustiť znova. ahoj-2 David. 672 00:29:04,620 --> 00:29:07,290 Takže sa zdá, pracovať v presne rovnakým spôsobom. 673 00:29:07,290 --> 00:29:11,180 Ale keď som sa vrátiť do Valgrind a znovu spustiť že rovnaký príkaz na mojom novo 674 00:29:11,180 --> 00:29:14,720 skompilovaný program písanie v mojom mene, ako predtým - 675 00:29:14,720 --> 00:29:15,370 pekné. 676 00:29:15,370 --> 00:29:16,760 Heap zhrnutie - 677 00:29:16,760 --> 00:29:17,740 používané na výstupe - 678 00:29:17,740 --> 00:29:19,370 nula bajtov nulových blokov. 679 00:29:19,370 --> 00:29:21,840 A to je super pekný, všetky haldy bloky boli oslobodení. 680 00:29:21,840 --> 00:29:23,480 Žiadne úniky sú možné. 681 00:29:23,480 --> 00:29:27,200 >> Takže prísť, nie problému Sada 4, ale Problem Set 5, forenznú 682 00:29:27,200 --> 00:29:30,740 a nasledujúce roky, to tiež stane meradlom správnosti vášho 683 00:29:30,740 --> 00:29:33,630 Program, či máte alebo nemáte alebo nemajú k pretečeniu pamäte. 684 00:29:33,630 --> 00:29:36,900 Ale našťastie, môžete nielen rozum skrze ne intuitívne, čo 685 00:29:36,900 --> 00:29:40,430 je, pravdepodobne, ľahké malých programov ale ťažšie väčších programov, 686 00:29:40,430 --> 00:29:43,860 Valgrind, pre tie väčšie programy, vám môže pomôcť identifikovať 687 00:29:43,860 --> 00:29:45,360 konkrétny problém. 688 00:29:45,360 --> 00:29:47,500 >> Ale je tu ešte jeden ďalší problém ktoré by mohli vzniknúť. 689 00:29:47,500 --> 00:29:51,245 Dovoľte mi otvoriť tento súbor tu, čo je Opäť platí, že trochu jednoduchý príklad. 690 00:29:51,245 --> 00:29:53,760 Ale poďme sa zamerať na to, čo Tento program robí. 691 00:29:53,760 --> 00:29:55,190 To sa nazýva memory.c. 692 00:29:55,190 --> 00:29:58,380 Budeme tento post neskôr dnes zips dnešnej zdrojového kódu. 693 00:29:58,380 --> 00:30:01,610 A zistíte, že mám funkciu nazvanú f že žiadne argumenty a 694 00:30:01,610 --> 00:30:02,800 nevracia nič. 695 00:30:02,800 --> 00:30:07,240 V riadku 20, som vraj vyhlásil ukazovateľ na int a volať to x. 696 00:30:07,240 --> 00:30:09,570 Som priradenie je návrat hodnota malloc. 697 00:30:09,570 --> 00:30:14,590 A len aby bolo jasno, koľko bajtov am Asi som sa vrátiť z malloc 698 00:30:14,590 --> 00:30:17,080 v tejto situácii? 699 00:30:17,080 --> 00:30:18,040 >> Asi 40. 700 00:30:18,040 --> 00:30:18,840 Kde si to zobral? 701 00:30:18,840 --> 00:30:22,410 No, či si spomínate, že int je často 4 bajty, je prinajmenšom v 702 00:30:22,410 --> 00:30:25,110 zariadenie, 10 krát 4 je samozrejme 40. 703 00:30:25,110 --> 00:30:28,920 Takže malloc vracia adresu na kus pamäte a skladovanie, ktoré 704 00:30:28,920 --> 00:30:30,800 riešenie nakoniec v x. 705 00:30:30,800 --> 00:30:32,570 Takže aby bolo jasno, čo potom sa to deje? 706 00:30:32,570 --> 00:30:34,990 No, dovoľte mi vrátiť späť na našom obrázku tu. 707 00:30:34,990 --> 00:30:38,150 Dovoľte mi, aby som nielen kresliť hĺbke pamäti počítača, nechaj ma ísť napred a 708 00:30:38,150 --> 00:30:42,990 nakresliť celý obdĺžnik, ktorý predstavuje všetky mojej pamäti RAM. 709 00:30:42,990 --> 00:30:44,790 >> Povieme, že zásobník je na dne. 710 00:30:44,790 --> 00:30:47,010 A je tu textový segment sa Neinicializované údaje. 711 00:30:47,010 --> 00:30:49,880 Ale ja som jednoducho ísť na tie abstraktné iné veci ďaleko ako bodka, bodka bodka. 712 00:30:49,880 --> 00:30:53,470 Idem len sa odkazovať na to ako hromadu v hornej časti. 713 00:30:53,470 --> 00:30:57,070 A potom v dolnej časti obrázku, predstavujú hlavné, ja idem 714 00:30:57,070 --> 00:30:59,880 aby jej plátky pamäť na zásobníku. 715 00:30:59,880 --> 00:31:03,150 Pre f, idem dať plátok pamäte na zásobníku. 716 00:31:03,150 --> 00:31:05,140 Teraz som sa dostal do prezerám svoj Zdrojový kód znova. 717 00:31:05,140 --> 00:31:07,170 Aké sú lokálne premenné pre hlavné? 718 00:31:07,170 --> 00:31:10,710 Zrejme nič, takže rez je účinne prázdna alebo dokonca ani tak veľký, 719 00:31:10,710 --> 00:31:11,600 ako som čerpané. 720 00:31:11,600 --> 00:31:15,730 Ale f, mám lokálne premenné, ktorý sa nazýva x. 721 00:31:15,730 --> 00:31:20,410 Takže som ísť dopredu a dať f kus pamäti, volať to x. 722 00:31:20,410 --> 00:31:24,680 >> A teraz malloc 10 krát 4, Takže malloc 40, kde je to 723 00:31:24,680 --> 00:31:25,430 pamäť prichádza? 724 00:31:25,430 --> 00:31:27,530 Sme nie je vykreslený obrázok ako predtým. 725 00:31:27,530 --> 00:31:31,140 Ale predpokladajme, že je to skutočne prichádza odtiaľ, tak jeden, 726 00:31:31,140 --> 00:31:33,170 dva, tri, štyri, päť. 727 00:31:33,170 --> 00:31:34,680 A teraz musím 40 z nich. 728 00:31:34,680 --> 00:31:37,540 Tak som si jednoducho urobiť bodku, bodka, bodka navrhnúť že tam je ešte viac pamäte 729 00:31:37,540 --> 00:31:39,350 návrate z haldy. 730 00:31:39,350 --> 00:31:40,710 Teraz, čo je adresa? 731 00:31:40,710 --> 00:31:42,620 Zvoľme ľubovoľný naše riešiť ako vždy - 732 00:31:42,620 --> 00:31:46,310 Ox123, aj keď to asi bude byť niečo úplne iného. 733 00:31:46,310 --> 00:31:50,420 To je adresa prvého bajtu v pamäti, že sa pýtam na malloc. 734 00:31:50,420 --> 00:31:53,630 >> Takže v skratke, akonáhle riadok 20 vykoná, čo je doslova 735 00:31:53,630 --> 00:31:57,170 uložené vnútri x tu? 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 nezaujímavý. 739 00:32:01,550 --> 00:32:03,200 To len znamená, že tu Hexadecimálne číslo. 740 00:32:03,200 --> 00:32:06,490 Ale čo je kľúčové je, že to, čo som obchod x, čo je miestna premenná. 741 00:32:06,490 --> 00:32:10,260 Ale jeho dátový typ, opäť je adresa int. 742 00:32:10,260 --> 00:32:12,710 No, ja idem uložiť Ox123. 743 00:32:12,710 --> 00:32:16,610 Ale na druhú stranu, ak je to trochu moc zložitý zbytočne, keď som listovať 744 00:32:16,610 --> 00:32:21,490 späť, môžeme to preč docela abstraktné rozumne a len povedať, že x je 745 00:32:21,490 --> 00:32:23,910 ukazovateľ na tento kus pamäti. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Teraz je otázka, na dosah ruky je nasledovné - 748 00:32:26,230 --> 00:32:29,910 linka 21, ako sa ukázalo, je chybné. 749 00:32:29,910 --> 00:32:31,160 Prečo? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Je nám ľúto? 752 00:32:36,930 --> 00:32:38,640 To nemá - 753 00:32:38,640 --> 00:32:40,390 tvrdí, že ešte raz. 754 00:32:40,390 --> 00:32:41,240 No, to nie je 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 ešte jedna, ale špecificky na riadku 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Presne tak. 759 00:32:50,040 --> 00:32:54,980 Tento jednoduchý riadok kódu je len buffer overflow, pretečenie vyrovnávacej pamäte. 760 00:32:54,980 --> 00:32:57,050 Vyrovnávacia pamäť znamená len kus pamäte. 761 00:32:57,050 --> 00:33:01,520 Ale to kus pamäte o veľkosti 10, 10 celých čísel, čo znamená, že ak by sme 762 00:33:01,520 --> 00:33:05,350 index do nej pomocou syntaktickú cukor z poľa notáciu, námestí 763 00:33:05,350 --> 00:33:09,220 držiaky, máte prístup k x držiak 0 x držiak 1 x, 764 00:33:09,220 --> 00:33:10,390 Držiak bodka, bodka, bodka. 765 00:33:10,390 --> 00:33:13,270 x držiak 9 je najväčší. 766 00:33:13,270 --> 00:33:17,680 Takže keď urobím x držiak 10, kde Ja som vlastne deje v pamäti? 767 00:33:17,680 --> 00:33:19,120 >> No, keď mám 10 int - 768 00:33:19,120 --> 00:33:21,070 poďme vlastne kresliť všetko z nich tu. 769 00:33:21,070 --> 00:33:22,700 Takže to bol prvý päť. 770 00:33:22,700 --> 00:33:24,660 Tu je ďalších päť ints. 771 00:33:24,660 --> 00:33:29,580 Takže x držiak 0 je tu. x držiak 1 je tu. x držiak 9 je tu. x držiak 772 00:33:29,580 --> 00:33:37,960 10 je tu, čo znamená, že hovorím, v riadku 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 áno. 776 00:33:43,380 --> 00:33:45,460 Ale len to, že jej 0 je tak trochu náhoda. 777 00:33:45,460 --> 00:33:47,140 Mohlo by to byť číslo 50, pre všetky staráme. 778 00:33:47,140 --> 00:33:50,480 Ale snažíme sa, aby to na x držiaku 10, čo je miesto, kde toto 779 00:33:50,480 --> 00:33:53,700 Otáznik je koncipovaný, čo nie je dobrá vec. 780 00:33:53,700 --> 00:33:57,070 Tento program by mohol veľmi dobre havárie ako výsledok. 781 00:33:57,070 --> 00:33:59,400 >> Teraz poďme ďalej a uvidíme, či to je skutočne to, čo sa stane. 782 00:33:59,400 --> 00:34:02,600 Aby pamäti, pretože súbor sa nazýva memory.c. 783 00:34:02,600 --> 00:34:05,950 Poďme ďalej a spustite programovej pamäte. 784 00:34:05,950 --> 00:34:08,239 Takže sme mali šťastie, v skutočnosti, zdá sa. 785 00:34:08,239 --> 00:34:09,340 Mali sme šťastie. 786 00:34:09,340 --> 00:34:11,060 Ale uvidíme, či budeme teraz beží Valgrind. 787 00:34:11,060 --> 00:34:14,170 Na prvý pohľad by sa mohlo môj program Zdá sa, že je úplne správne. 788 00:34:14,170 --> 00:34:18,010 Ale dovoľte mi spustiť Valgrind sa - Kontrola úniku zodpovedá plnej pamäti. 789 00:34:18,010 --> 00:34:20,110 >> A teraz, keď som tento príkaz - 790 00:34:20,110 --> 00:34:21,030 zaujímavé. 791 00:34:21,030 --> 00:34:26,800 Neplatný zápis o veľkosti 4 na riadok 21 memory.c. 792 00:34:26,800 --> 00:34:29,284 Linka 21 memory.c je, ktorý z nich? 793 00:34:29,284 --> 00:34:30,340 Oh, zaujímavé. 794 00:34:30,340 --> 00:34:31,080 Ale počkajte. 795 00:34:31,080 --> 00:34:32,389 Veľkosť 4, ako je to s odkazom na? 796 00:34:32,389 --> 00:34:34,969 Len som sa raz napísať, ale je to o veľkosti 4. 797 00:34:34,969 --> 00:34:36,889 Prečo je to 4? 798 00:34:36,889 --> 00:34:39,280 Je to preto, že je to int, čo je opäť štyri bajty. 799 00:34:39,280 --> 00:34:42,510 Takže Valgrind našli nejakú chybu, že som, pozrel sa na mojom kóde, nie. 800 00:34:42,510 --> 00:34:45,040 A možno vaše TF alebo by nie. 801 00:34:45,040 --> 00:34:48,469 Čo však Valgrind určite zistil, že že sme urobili chybu, dokonca 802 00:34:48,469 --> 00:34:52,719 ale mali sme šťastie, a počítač rozhodol, čo, nebudem sa zrúti 803 00:34:52,719 --> 00:34:57,470 len preto, že ste sa dotkli jeden bajt, jeden INT stojí za pamäti, že nie 804 00:34:57,470 --> 00:34:58,550 v skutočnosti vlastní. 805 00:34:58,550 --> 00:35:00,380 >> No, čo iné je buggy tu. 806 00:35:00,380 --> 00:35:01,180 Adresa - 807 00:35:01,180 --> 00:35:03,190 To je šialené hľadá adresa v šestnástkovej sústave. 808 00:35:03,190 --> 00:35:06,890 To len znamená, že niekde v halde je nula bajtov po bloku o veľkosti 40 809 00:35:06,890 --> 00:35:07,620 je pridelené. 810 00:35:07,620 --> 00:35:10,610 Dovoľte mi priblížiť tu a uvidíme, či je to trochu ústretovejšie. 811 00:35:10,610 --> 00:35:11,410 Zaujímavý. 812 00:35:11,410 --> 00:35:15,600 40 bajtov definitívne stratil v záznam straty 1 z 1. 813 00:35:15,600 --> 00:35:17,840 Opäť platí, že viac slov, ako je tu veľmi užitočná. 814 00:35:17,840 --> 00:35:21,350 Ale na základe zvýraznené línie, kde asi by som mala zamerať moja 815 00:35:21,350 --> 00:35:24,070 pozornosť na ďalší bug? 816 00:35:24,070 --> 00:35:26,570 Vyzerá to, že linky 20 memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Takže keď sa vrátime k riadku 20, to je ten, ktorý ste určili skôr. 818 00:35:30,990 --> 00:35:33,030 A to nemusí byť nutne buggy. 819 00:35:33,030 --> 00:35:35,160 Ale my sme to zvrátiť jeho účinky. 820 00:35:35,160 --> 00:35:38,790 Tak ako to mám opraviť aspoň jeden z týchto chýb? 821 00:35:38,790 --> 00:35:42,240 Čo som mohol robiť po riadku 21? 822 00:35:42,240 --> 00:35:47,110 Čo som mohol urobiť bez x, takže je vrátiť, že pamäť. 823 00:35:47,110 --> 00:35:49,230 A ako môžem opraviť túto chybu? 824 00:35:49,230 --> 00:35:52,120 Mal by som určite ísť nie ďalej ako 0. 825 00:35:52,120 --> 00:35:53,670 Takže dovoľte mi, aby som sa pokúsila znovu spustiť tento. 826 00:35:53,670 --> 00:35:56,080 Ospravedlňujeme sa, ale určite ísť nie ďalej ako 9. 827 00:35:56,080 --> 00:35:57,510 Urobiť pamäti. 828 00:35:57,510 --> 00:36:00,650 Dovoľte mi, aby som znova Valgrind vo väčšom okne. 829 00:36:00,650 --> 00:36:01,580 A teraz sa pozrite. 830 00:36:01,580 --> 00:36:02,250 Pekný. 831 00:36:02,250 --> 00:36:03,270 Všetky bloky haldy boli oslobodení. 832 00:36:03,270 --> 00:36:04,270 Žiadne úniky sú možné. 833 00:36:04,270 --> 00:36:07,520 A tu hore, tam žiadna zmienka niektorého z neplatné práva. 834 00:36:07,520 --> 00:36:09,820 >> Len dostať chamtivý a poďme zistiť, či ďalšou ukážkou 835 00:36:09,820 --> 00:36:11,050 nejde ako má - 836 00:36:11,050 --> 00:36:12,560 Som šťastie pred chvíľou. 837 00:36:12,560 --> 00:36:15,530 A skutočnosť, že je to 0 je možná zbytočne zavádzajúce. 838 00:36:15,530 --> 00:36:20,650 Urobme 50, trochu svojvoľné počet, značka pamäti dot slash pamäť - 839 00:36:20,650 --> 00:36:21,410 ešte šťastie. 840 00:36:21,410 --> 00:36:22,510 Nič zhadzovať. 841 00:36:22,510 --> 00:36:26,150 Dajme tomu, že to jednoducho urobiť niečo naozaj hlúpe, a ja 100. 842 00:36:26,150 --> 00:36:30,360 Dovoľte mi, aby som prerobiť pamäti, bodka lomítko pamäť - 843 00:36:30,360 --> 00:36:31,075 šťastie znova. 844 00:36:31,075 --> 00:36:32,800 Ako sa o 1000? 845 00:36:32,800 --> 00:36:35,370 ints mimo, hrubo, kde by som mal byť? 846 00:36:35,370 --> 00:36:37,410 Urobiť pamäť - 847 00:36:37,410 --> 00:36:38,570 sakra. 848 00:36:38,570 --> 00:36:39,920 >> [Smiech] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Poďme sa flákať už nie. 851 00:36:43,920 --> 00:36:45,120 Znovu pamäti. 852 00:36:45,120 --> 00:36:45,840 Tam ideme. 853 00:36:45,840 --> 00:36:46,410 Dobrá. 854 00:36:46,410 --> 00:36:52,500 Takže zrejme budete index 100000 ints než kde by ste mali byť v 855 00:36:52,500 --> 00:36:54,410 pamäti, zlé veci sa stávajú. 856 00:36:54,410 --> 00:36:56,430 Tak to samozrejme nie je tvrdé, rýchle pravidlo. 857 00:36:56,430 --> 00:36:58,190 Bol som tak trochu s použitím skúšobnej a chyba sa tam dostať. 858 00:36:58,190 --> 00:37:02,230 Ale to je preto, že dlhý príbeh krátky, pamäti počítača je tiež rozdelená 859 00:37:02,230 --> 00:37:03,580 do týchto vecí tzv segmenty. 860 00:37:03,580 --> 00:37:07,260 A niekedy, že počítač skutočne vám dal trochu viac pamäte 861 00:37:07,260 --> 00:37:08,400 než sa spýtate na. 862 00:37:08,400 --> 00:37:12,170 Ale účinnosť, je to proste jednoduchšie získať viac pamäte, ale iba tí 863 00:37:12,170 --> 00:37:13,780 že ste stále časť. 864 00:37:13,780 --> 00:37:16,370 >> A ak budete mať šťastie niekedy, Preto, mali by ste byť schopní dotknúť 865 00:37:16,370 --> 00:37:17,795 pamäť, ktorá nepatrí k vám. 866 00:37:17,795 --> 00:37:21,860 Nemáte žiadnu záruku, že to, čo hodnota dáte tam zostane tam, pretože 867 00:37:21,860 --> 00:37:25,080 počítač stále si myslí, že to nie je tvoje, ale nie je to nutne deje 868 00:37:25,080 --> 00:37:29,910 udrieť do ďalšieho segmentu pamäti v počítač a vyvolať takú chybu 869 00:37:29,910 --> 00:37:31,710 toto tu. 870 00:37:31,710 --> 00:37:32,060 Dobrá. 871 00:37:32,060 --> 00:37:37,240 Akékoľvek otázky potom na pamäť? 872 00:37:37,240 --> 00:37:37,590 >> Dobrá. 873 00:37:37,590 --> 00:37:40,610 Poďme sa pozrieť tu, potom na niečo, čo sme užívali pre 874 00:37:40,610 --> 00:37:48,361 poskytnutá na nejakú dobu, ktorá v tomto súbore s názvom cs50.h. 875 00:37:48,361 --> 00:37:49,420 Tak to je súbor. 876 00:37:49,420 --> 00:37:51,130 To sú len celá partia komentárov do hornej časti. 877 00:37:51,130 --> 00:37:53,900 A možno ste sa na túto možnosť, ak si tropil okolo na prístroji. 878 00:37:53,900 --> 00:37:57,000 Ukazuje sa však, že po celú dobu, keď sme používali reťazec ako 879 00:37:57,000 --> 00:38:01,130 synonymum prostriedky, ktoré sme deklarovali ktoré bolo synonymom s týmto 880 00:38:01,130 --> 00:38:03,990 kľúčové slovo typedef pre definíciu typu. 881 00:38:03,990 --> 00:38:07,500 A my sme v podstate hovorí, aby navliecť synonymum pre char hviezdy. 882 00:38:07,500 --> 00:38:11,190 , Že prostriedky, ktoré zásobníka vytvorili tieto tréningové kolesá známej ako 883 00:38:11,190 --> 00:38:12,040 reťazec. 884 00:38:12,040 --> 00:38:14,830 >> Tu je to len prototyp pre getchar. 885 00:38:14,830 --> 00:38:17,350 Sme mohli vidieť skôr, ale to je naozaj to, čo robí. getchar 886 00:38:17,350 --> 00:38:19,070 žiadne argumenty, vracia char. 887 00:38:19,070 --> 00:38:21,340 getdouble žiadne argumenty, vracia double. 888 00:38:21,340 --> 00:38:24,440 getfloat žiadne argumenty, vráti float, a tak ďalej. 889 00:38:24,440 --> 00:38:27,270 vezmi_int je tu. getlonglong je tu. 890 00:38:27,270 --> 00:38:28,820 A GetString je tu. 891 00:38:28,820 --> 00:38:29,420 A je to. 892 00:38:29,420 --> 00:38:33,080 Táto fialová linka je ďalšia preprocesor smernice, pretože 893 00:38:33,080 --> 00:38:35,550 hashtag na jeho začiatku. 894 00:38:35,550 --> 00:38:35,870 >> Dobrá. 895 00:38:35,870 --> 00:38:38,380 Takže teraz ma nechaj ísť do cs50.c. 896 00:38:38,380 --> 00:38:40,400 A nebudeme hovoriť príliš dlho na to. 897 00:38:40,400 --> 00:38:43,280 Ale aby vám pohľad na to, čo je sa deje na všetko 898 00:38:43,280 --> 00:38:46,434 čas, nechaj ma ísť 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äčšinou komentáre. 901 00:38:51,050 --> 00:38:52,060 Ale vyzerá to takto. 902 00:38:52,060 --> 00:38:54,800 Tak toto je skutočná funkcia getchar, že sme boli 903 00:38:54,800 --> 00:38:56,055 pričom za samozrejmosť existuje. 904 00:38:56,055 --> 00:38:59,370 A aj keď sme sa použiť tohle že často, ak vôbec, je to aspoň 905 00:38:59,370 --> 00:39:00,470 pomerne jednoduchý. 906 00:39:00,470 --> 00:39:02,580 Takže je to stojí za to Rýchly pohľad na tu. 907 00:39:02,580 --> 00:39:06,540 >> Takže getchar má nekonečnú slučku, zámerne tak zdanlivo. 908 00:39:06,540 --> 00:39:10,050 Potom zavolá - a to je druh pekný opätovné použitie kódu sami napísali. 909 00:39:10,050 --> 00:39:11,220 Volá GetString. 910 00:39:11,220 --> 00:39:12,460 Pretože to, čo robí znamená dostať char? 911 00:39:12,460 --> 00:39:14,730 No, môžete sa pokúsiť získať celý riadok textu od užívateľa a 912 00:39:14,730 --> 00:39:16,940 potom sa stačí pozrieť na jeden z týchto znakov. 913 00:39:16,940 --> 00:39:19,170 V súlade 60, tu je to trochu trochu zdravý rozum kontroly. 914 00:39:19,170 --> 00:39:21,610 Ak GetString vrátil null, poďme nepokračuje. 915 00:39:21,610 --> 00:39:22,820 Niečo je zle. 916 00:39:22,820 --> 00:39:28,120 >> Teraz je to trochu nepríjemné, ale konvenčné C. char max pravdepodobne 917 00:39:28,120 --> 00:39:29,960 predstavuje to, čo práve na základe jeho meno? 918 00:39:29,960 --> 00:39:31,670 Je to konštanta. 919 00:39:31,670 --> 00:39:36,040 Je to ako číselnú hodnotu Najväčší char môžete reprezentovať s 920 00:39:36,040 --> 00:39:40,370 jedno uhryznutie, čo je pravdepodobne číslo 255, čo je najväčšie číslo, ktoré 921 00:39:40,370 --> 00:39:42,720 predstavujú osem bitov, od nuly. 922 00:39:42,720 --> 00:39:47,460 Takže som sa využiť tejto funkcie, v tejto funkcii, kedy písania tohto kódu len preto, 923 00:39:47,460 --> 00:39:51,753 ak sa niečo pokazí, ale getchar jeho účel v živote je vrátiť 924 00:39:51,753 --> 00:39:54,830 char, musíte byť schopní nejako najavo, že užívateľ, ktorý 925 00:39:54,830 --> 00:39:55,840 sa niečo pokazilo. 926 00:39:55,840 --> 00:39:56,970 Nemôžeme vrátiť hodnotu null. 927 00:39:56,970 --> 00:39:58,480 Ukazuje sa, že je nulový ukazovateľ. 928 00:39:58,480 --> 00:40:01,030 A opäť, getchar má vrátiť char. 929 00:40:01,030 --> 00:40:04,760 >> Takže dohovor, ak sa niečo zle, vy, programátor, alebo 930 00:40:04,760 --> 00:40:08,160 V tomto prípade som sa do knižnice, mal som len rozhodnúť ľubovoľne, pokiaľ 931 00:40:08,160 --> 00:40:12,230 sa niečo pokazí, budem vráti číslo 255, ktorá je skutočne 932 00:40:12,230 --> 00:40:17,240 znamená, že nemôže užívateľ nemôže zadať znak reprezentovaný 933 00:40:17,240 --> 00:40:21,410 číslo 255, pretože sme mali ukradnúť ako tzv sentinelovej hodnotu 934 00:40:21,410 --> 00:40:23,410 predstavujú problém. 935 00:40:23,410 --> 00:40:27,010 Teraz sa ukazuje, že charakter 255 nie je niečo, čo môžete písať na 936 00:40:27,010 --> 00:40:28,380 klávesnice, takže to nie je veľký problém. 937 00:40:28,380 --> 00:40:30,910 Užívateľ nevšimne, že Ja som ukradol tento znak. 938 00:40:30,910 --> 00:40:34,620 Ale ak ste niekedy v manuálových stránkach na počítačový systém nejaký odkaz 939 00:40:34,620 --> 00:40:38,560 všetky čiapky konštantný, ako je táto, ktorá hovorí, v prípade chyby táto konštanta môže 940 00:40:38,560 --> 00:40:42,720 byť vrátené, to je všetko nejaký človek urobil rokmi bol svojvoľne rozhodla 941 00:40:42,720 --> 00:40:45,680 vrátiť túto špeciálnu hodnotu a hovoriť konštanta v prípade 942 00:40:45,680 --> 00:40:46,840 sa niečo pokazí. 943 00:40:46,840 --> 00:40:48,580 >> Teraz mágia stane tu. 944 00:40:48,580 --> 00:40:52,600 Po prvé, ja som vyhlásil v súlade 67 dve postavy, C1 a C2. 945 00:40:52,600 --> 00:40:57,080 A potom v rade 68, je to vlastne riadok kódu, ktorý je pripomínajúce 946 00:40:57,080 --> 00:41:01,140 náš priateľ printf vzhľadom k tomu, že má mať percent Čs v úvodzovkách. 947 00:41:01,140 --> 00:41:06,490 Nevšimnúť, čo sa tu deje. sscanf znamená reťazec skenovanie - 948 00:41:06,490 --> 00:41:11,690 znamená, že skenovanie formátu reťazec, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Čo to má znamenať? 950 00:41:12,590 --> 00:41:16,310 To znamená, že odovzdáte sscanf reťazec. 951 00:41:16,310 --> 00:41:18,420 A linka je čokoľvek používateľ zadá palcov 952 00:41:18,420 --> 00:41:23,520 Môžete prejsť na sscanf formátovací reťazec ako to, že hovorí, scanf, aké sú 953 00:41:23,520 --> 00:41:25,870 Dúfate, ktorý zadal používateľ palcov 954 00:41:25,870 --> 00:41:29,730 Tie potom odovzdať v adresách dvoch kúsky pamäti, v tomto prípade, 955 00:41:29,730 --> 00:41:31,150 pretože mám dva zástupné symboly. 956 00:41:31,150 --> 00:41:34,610 Tak som dám jej adresu C1 a C2 na adresu. 957 00:41:34,610 --> 00:41:37,700 >> A pripomínajú, že dáte funkciu, Adresa nejaké premenné, čo je 958 00:41:37,700 --> 00:41:38,950 implikácia? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Čo môže robiť, že funkcie v dôsledku dať jej adresu 961 00:41:45,050 --> 00:41:48,170 Premenná, na rozdiel od premenná sám? 962 00:41:48,170 --> 00:41:49,450 To možno zmeniť, nie? 963 00:41:49,450 --> 00:41:53,250 Ak ste mal niekoho mapu pre fyzické adresu, môžu ísť tam a urobiť 964 00:41:53,250 --> 00:41:54,750 čo chcú na tejto adrese. 965 00:41:54,750 --> 00:41:55,800 Rovnaká myšlienka tu. 966 00:41:55,800 --> 00:41:59,950 Ak neberieme do úvahy, aby sscanf, adresa, z dvoch kúsky pamäti, dokonca aj tie malé 967 00:41:59,950 --> 00:42:03,585 malé kúsky pamäti, C1 a C2, ale povieme jej adresu z nich, 968 00:42:03,585 --> 00:42:05,170 sscanf ho zmeniť. 969 00:42:05,170 --> 00:42:08,530 >> Takže sscanf je zmysel života, keď čítame manuálové stránky, je prečítať, čo 970 00:42:08,530 --> 00:42:13,420 užívateľ zadali, dúfam, že pre užívateľov s zadali znak a možno 971 00:42:13,420 --> 00:42:16,470 iný znak, a to bez ohľadu na užívateľa napísal prvý znak pokračuje 972 00:42:16,470 --> 00:42:19,310 tu, druhý znak ide tu. 973 00:42:19,310 --> 00:42:22,470 Teraz, rovnako ako stranou, a vy by len viem to z dokumentácie, 974 00:42:22,470 --> 00:42:25,570 Skutočnosť, že som dal medzeru tam jednoducho znamená, že je mi jedno, či 975 00:42:25,570 --> 00:42:28,440 používateľ narazí na medzerník málo krát, než on alebo ona má 976 00:42:28,440 --> 00:42:30,400 charakter, budem ignorovať akýkoľvek biely priestor. 977 00:42:30,400 --> 00:42:32,510 Takže, ja viem od dokumentácie. 978 00:42:32,510 --> 00:42:36,570 >> Skutočnosť, že je druhý% c nasledovaný medzerou je v skutočnosti 979 00:42:36,570 --> 00:42:37,410 úmyselné. 980 00:42:37,410 --> 00:42:41,190 Chcem byť schopní zistiť, či používateľ podelal alebo nespolupracovali. 981 00:42:41,190 --> 00:42:45,630 Takže dúfam, že len užívateľ napísal v jednom znaku, a preto dúfam, 982 00:42:45,630 --> 00:42:50,640 že sscanf je až vo chvíli vrátiť hodnota 1, pretože, opäť, keď som čítal 983 00:42:50,640 --> 00:42:55,400 dokumentácie, sscanf je účel život je pre návrat do počtu 984 00:42:55,400 --> 00:42:59,170 premenné, ktoré boli vyplnené užívateľského vstupu. 985 00:42:59,170 --> 00:43:02,270 >> Prešiel som v dvoch premenných adresy, C1 a C2. 986 00:43:02,270 --> 00:43:06,420 Dúfam však, že iba jeden z je zabitý, pretože ak sscanf 987 00:43:06,420 --> 00:43:11,130 vrací2, čo je pravdepodobne implikácia logicky? 988 00:43:11,130 --> 00:43:14,600 Že užívateľ nebol len mi jednu charakter, ako by som mu alebo jej. 989 00:43:14,600 --> 00:43:17,860 Pravdepodobne zadali pri najmenej dva znaky. 990 00:43:17,860 --> 00:43:22,430 Takže keď som namiesto toho nemal druhý % C, len som mal jeden, ktorý 991 00:43:22,430 --> 00:43:25,370 Úprimne povedané by byť viac intuitívne prístup, myslím, že prvý pohľad, 992 00:43:25,370 --> 00:43:30,220 budete nebude schopný detekovať ak bol užívateľ dáva vám viac 993 00:43:30,220 --> 00:43:31,780 Vstupné ako ste vlastne chceli. 994 00:43:31,780 --> 00:43:34,100 Tak to je implicitná forma z kontroly chýb. 995 00:43:34,100 --> 00:43:35,640 >> Ale zistíte, čo robím tu. 996 00:43:35,640 --> 00:43:39,970 Raz som si istý, že mi dal jeden užívateľ postava, som uvoľniť linku, robiť 997 00:43:39,970 --> 00:43:44,450 opak getString, čo používa malloc, a potom sa vrátim 998 00:43:44,450 --> 00:43:51,030 C1, charakter, že som dúfal, že užívateľ k dispozícii a len za predpokladu. 999 00:43:51,030 --> 00:43:54,680 Tak rýchlo zazrel len, ale všetky otázky týkajúce sa getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Vrátime sa k niektorým z ostatných. 1002 00:43:59,590 --> 00:44:03,770 >> No, nechaj ma ísť ďalej a robiť to - Predpokladám, že teraz, len motivovať 1003 00:44:03,770 --> 00:44:08,910 diskusie v týždni a navyše čas, to je súbor s názvom structs.h. 1004 00:44:08,910 --> 00:44:11,440 A opäť, je to len chuť niečoho, čo leží pred nami. 1005 00:44:11,440 --> 00:44:13,090 Ale všimnite si, že veľa toto je komentár. 1006 00:44:13,090 --> 00:44:17,440 Takže mi dovoľte zdôrazniť iba Zaujímavosťou teraz. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 tam je to rovnaké kľúčové slovo znova. 1009 00:44:19,700 --> 00:44:23,100 typedef používame deklarovať reťazec ako zvláštny typ dát. 1010 00:44:23,100 --> 00:44:27,490 Môžete použiť typedef vytvoriť zbrusu nový dátové typy, ktoré neexistovali, keď 1011 00:44:27,490 --> 00:44:28,570 C bol vynájdený. 1012 00:44:28,570 --> 00:44:32,520 Napríklad, int prichádza s C. char Dodáva sa s C. double prichádza s C. Ale 1013 00:44:32,520 --> 00:44:34,000 nie je pojem študenta. 1014 00:44:34,000 --> 00:44:37,230 A napriek tomu, že by bolo celkom užitočné mať schopní napísať program, ktorý ukladá 1015 00:44:37,230 --> 00:44:40,440 do premennej, študent ID číslo, ich meno, a ich dom. 1016 00:44:40,440 --> 00:44:42,890 Inými slovami, tri kusy dát, ako int a 1017 00:44:42,890 --> 00:44:44,420 string a iný reťazec. 1018 00:44:44,420 --> 00:44:48,220 >> S typedef, čo je dosť silný o tom, a kľúčovým slovom sturct pre 1019 00:44:48,220 --> 00:44:53,660 štruktúra, vy, programátor v roku 2013, môže skutočne definovať vlastné 1020 00:44:53,660 --> 00:44:57,530 dátové typy, ktoré neexistovali rokov staré, ale to vyhovovalo vašim požiadavkám. 1021 00:44:57,530 --> 00:45:01,910 A tak tu, v riadkoch 13 až 19, sme sa prehlasuje, že nový dátový typ, napríklad 1022 00:45:01,910 --> 00:45:04,320 int, ale nazývať to študentka. 1023 00:45:04,320 --> 00:45:09,310 A vnútri tejto premennej sa chystá tri veci - int, string, 1024 00:45:09,310 --> 00:45:09,930 a reťazec. 1025 00:45:09,930 --> 00:45:13,040 Takže si môžete myslieť, čo je naozaj stalo, aj keď je to 1026 00:45:13,040 --> 00:45:17,160 kúsok zjednodušenie pre dnešok, študent je v podstate deje 1027 00:45:17,160 --> 00:45:19,450 takhle vyzerať. 1028 00:45:19,450 --> 00:45:22,580 Jeho bude kus pamäť s ID, meno 1029 00:45:22,580 --> 00:45:25,580 pole a dom poľa. 1030 00:45:25,580 --> 00:45:30,670 A budeme môcť využiť tieto kusy pamäte a pristupovať k nim takto. 1031 00:45:30,670 --> 00:45:38,870 >> Keď idem do struct0.c, tu je pomerne dlho, ale po 1032 00:45:38,870 --> 00:45:42,630 vzor, ​​kód, ktorý používa tento nový trik. 1033 00:45:42,630 --> 00:45:45,790 Takže v prvom rade mi dovoľte, aby som vás upozornil na zaujímavých častí hore hore. 1034 00:45:45,790 --> 00:45:49,670 Sharp definuje študentmi 3, prehlasuje, konštantný tzv študenti a nadobúdatelia 1035 00:45:49,670 --> 00:45:53,450 je ľubovoľne číslo 3, len takže mám tri študentmi pomocou 1036 00:45:53,450 --> 00:45:54,830 Tento program teraz. 1037 00:45:54,830 --> 00:45:55,960 Tu je hlavný. 1038 00:45:55,960 --> 00:45:58,860 A všimnite si, ako Prehlasujem, rad študentov? 1039 00:45:58,860 --> 00:46:00,480 No, len som použiť rovnakú syntax. 1040 00:46:00,480 --> 00:46:02,110 Slovo Študent je samozrejme nové. 1041 00:46:02,110 --> 00:46:04,790 Ale študent, trieda, konzolové študenti. 1042 00:46:04,790 --> 00:46:06,720 >> Takže bohužiaľ je tu veľa opätovného použitia pojmov tu. 1043 00:46:06,720 --> 00:46:07,660 To je len číslo. 1044 00:46:07,660 --> 00:46:09,040 Takže to je ako povedať tri. 1045 00:46:09,040 --> 00:46:11,430 Trieda je len to, čo chcem volať premennú. 1046 00:46:11,430 --> 00:46:12,840 Mohol by som hovoriť, že študenti. 1047 00:46:12,840 --> 00:46:15,880 Ale trieda, to nie je trieda vo objektovo orientované Java druh spôsobom. 1048 00:46:15,880 --> 00:46:17,220 Je to len trieda študentov. 1049 00:46:17,220 --> 00:46:20,590 A dátový typ každého prvku v tomto poli je študentom. 1050 00:46:20,590 --> 00:46:23,040 Tak to je trochu inak az hovorí niečo 1051 00:46:23,040 --> 00:46:25,250 takto, je to len - 1052 00:46:25,250 --> 00:46:29,500 Hovorím, daj mi tri študentmi a volať, že triedu poľa. 1053 00:46:29,500 --> 00:46:29,800 >> Dobrá. 1054 00:46:29,800 --> 00:46:30,680 Tu je to štyri slučky. 1055 00:46:30,680 --> 00:46:33,480 Ten chlap pozná - iterate od nuly až na tri. 1056 00:46:33,480 --> 00:46:35,160 A tu je nový kus syntaxe. 1057 00:46:35,160 --> 00:46:37,710 Program stimuluje ma, človek, aby to študent 1058 00:46:37,710 --> 00:46:39,200 ID, čo je int. 1059 00:46:39,200 --> 00:46:44,650 A tu je syntax, pomocou ktorého môžete uložiť niečo do poľa ID na 1060 00:46:44,650 --> 00:46:48,630 Umiestnenie trieda držiak I. Tak táto syntax nie je nič nové. 1061 00:46:48,630 --> 00:46:51,450 To jednoducho znamená, že mi ôsmy študentov v triede. 1062 00:46:51,450 --> 00:46:52,940 Ale to je symbol novej. 1063 00:46:52,940 --> 00:46:56,320 Až do tejto chvíle sme nemožno použiť bodku, aspoň v kóde ako je táto. 1064 00:46:56,320 --> 00:47:01,490 To znamená ísť do struct známy ako študent a dať tam niečo. 1065 00:47:01,490 --> 00:47:05,670 Rovnako tak v tejto ďalší riadok, 31, prejsť dopredu a dajte, čo používateľ zadá 1066 00:47:05,670 --> 00:47:10,530 na meno tu a čo robia pre dom, to isté, choďte do toho a 1067 00:47:10,530 --> 00:47:13,230 vložte ho do. domu. 1068 00:47:13,230 --> 00:47:15,955 >> Takže to, čo robí tento program nakoniec robiť? 1069 00:47:15,955 --> 00:47:17,220 Môžete vidieť malú ukážku tam. 1070 00:47:17,220 --> 00:47:24,780 Nechaj ma ísť ďalej a robiť, aby structs 0 bodka lomítko struct 0, študent ID 1, 1071 00:47:24,780 --> 00:47:28,250 povedal David Mather, študent ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, študent ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 a jediné, čo tento program urobil, ktorý je len úplne svojvoľné, je 1075 00:47:38,380 --> 00:47:40,980 Chcel som urobiť niečo, čo s týmito dátami, teraz, keď som učil nás, ako sa 1076 00:47:40,980 --> 00:47:43,450 používať structs, je, že som jednoducho musel Táto extra slučka tu. 1077 00:47:43,450 --> 00:47:45,260 Aj iterovat cez pole študentov. 1078 00:47:45,260 --> 00:47:49,170 Použil som svoju, možno teraz známy priateľ, reťazec porovnaní, stircomp na 1079 00:47:49,170 --> 00:47:53,780 Kontrola je 8. študenta dom rovná Mather? 1080 00:47:53,780 --> 00:47:56,760 A ak áno, stačí niečo vytlačiť ľubovoľne rada, áno, je. 1081 00:47:56,760 --> 00:47:59,430 Ale na druhú stranu, len to, že mi príležitosti používať a opakovane a 1082 00:47:59,430 --> 00:48:02,270 znovu túto novú dot notácie. 1083 00:48:02,270 --> 00:48:03,250 >> Takže koho to zaujíma, že? 1084 00:48:03,250 --> 00:48:06,270 Prísť s študentského programu trochu svojvoľné, ale ukázalo sa, 1085 00:48:06,270 --> 00:48:09,800 že môžeme robiť užitočné veci s to, napríklad nasledujúcim spôsobom. 1086 00:48:09,800 --> 00:48:14,600 To je oveľa zložitejšie struct v C. Je tu tucet alebo viac polí, 1087 00:48:14,600 --> 00:48:15,880 trochu nezrozumiteľné názvy. 1088 00:48:15,880 --> 00:48:20,110 Ale ak ste niekedy počuli o grafický formát súboru s názvom bitmapa, BMP, to 1089 00:48:20,110 --> 00:48:22,830 Ukazuje sa, že bitmapový formát súboru skoro vyzerá, že. 1090 00:48:22,830 --> 00:48:24,200 Je to malá hlúpa smajlíky. 1091 00:48:24,200 --> 00:48:27,840 Je to malý obrázok, ktorý som priblíženie na dosť veľký, takže som mohol vidieť každý 1092 00:48:27,840 --> 00:48:30,410 jednotlivých bodov čiže pixelov. 1093 00:48:30,410 --> 00:48:33,800 Teraz sa ukazuje, môžeme predstavovať čierna bodka s, povedzme, číslo 0.. 1094 00:48:33,800 --> 00:48:35,520 A biela bodka s číslom 1. 1095 00:48:35,520 --> 00:48:39,140 >> Takže inými slovami, ak chcete kresliť Smajlík a okrem toho, že obraz v 1096 00:48:39,140 --> 00:48:42,680 počítač, postačí pre uloženie nuly a tie, ktoré vyzerajú ako to, kde, 1097 00:48:42,680 --> 00:48:45,250 znova, tie sú biele a nuly sú čierne. 1098 00:48:45,250 --> 00:48:48,290 A spoločne, ak skutočne máte Gird jedničiek a núl, máte 1099 00:48:48,290 --> 00:48:51,030 mriežka obrazových bodov, a ak si položiť je von, máte roztomilá 1100 00:48:51,030 --> 00:48:52,560 malý smajlíky. 1101 00:48:52,560 --> 00:48:58,150 Teraz bitmapový obrázok formátu BMP, je efektívne, že pod kapotou 1102 00:48:58,150 --> 00:49:00,970 ale s viac pixelov Sot, že môže skutočne reprezentovať farby. 1103 00:49:00,970 --> 00:49:05,170 >> Ale keď máte sofistikovanejšie formáty súborov ako BMP a JPEG a GIF 1104 00:49:05,170 --> 00:49:09,360 s ktorou by mohlo byť známe, ktoré súbory na disku zvyčajne nie je iba 1105 00:49:09,360 --> 00:49:13,760 majú núl a jednotiek na obrazových bodov, ale majú nejaký metadáta a - 1106 00:49:13,760 --> 00:49:16,960 meta v tom zmysle, že v skutočnosti nie je dát, ale to je užitočné mať. 1107 00:49:16,960 --> 00:49:21,370 Takže tieto polia tu naznačujete, a uvidíme to podrobnejšie v P-set 1108 00:49:21,370 --> 00:49:25,810 5, že pred núl a jednotiek, ktoré predstavujú obrazové body v obraze, 1109 00:49:25,810 --> 00:49:29,110 je tu banda metadát, ako veľkosť snímky a 1110 00:49:29,110 --> 00:49:30,250 šírka obrazu. 1111 00:49:30,250 --> 00:49:32,910 A všimnite si, ja som šklbanie preč niektoré ľubovoľné veci tu - 1112 00:49:32,910 --> 00:49:34,260 šírka a výška. 1113 00:49:34,260 --> 00:49:36,160 Bit obraz a niektoré ďalšie veci. 1114 00:49:36,160 --> 00:49:37,840 Takže tam je nejaký metadáta v súbore. 1115 00:49:37,840 --> 00:49:41,470 >> Ale tým, že pochopenie toho, ako sú stanovené súbory sa týmto spôsobom, môžete skutočne 1116 00:49:41,470 --> 00:49:45,890 potom manipulovať s obrázkami, obnoviť obrázky z disku, veľkosť obrázkov. 1117 00:49:45,890 --> 00:49:47,560 Ale to nejde nutne zlepšiť ich. 1118 00:49:47,560 --> 00:49:48,480 Potreboval som fotografiu. 1119 00:49:48,480 --> 00:49:52,840 Tak som šiel späť do RJ tu, ktorý si videl Na obrazovke sa pomerne dlhú dobu pred. 1120 00:49:52,840 --> 00:49:57,160 A keď otvorím Keynote tu, je to čo sa stane, keď sa pokúsite priblížiť a 1121 00:49:57,160 --> 00:49:59,380 zvýšenie RJ. 1122 00:49:59,380 --> 00:50:01,480 On nedostávajú žiadne naozaj lepší. 1123 00:50:01,480 --> 00:50:06,240 Teraz Keynote je trochu rozmazaný, že trochu, len zakrývať 1124 00:50:06,240 --> 00:50:11,040 Skutočnosť, že RJ nedostane zvlášť lepšie, keď obraz zväčšíte 1125 00:50:11,040 --> 00:50:13,310 A ak sa to urobiť týmto spôsobom, vidieť na námestí? 1126 00:50:13,310 --> 00:50:15,490 Áno, môžete určite vidieť štvorca na projektore. 1127 00:50:15,490 --> 00:50:17,690 >> To je to, čo dostanete, keď budete zvýšiť. 1128 00:50:17,690 --> 00:50:22,570 Ale v pochopení toho, ako naše RJ alebo Smajlík je realizovaný nám umožní 1129 00:50:22,570 --> 00:50:24,950 vlastne písať kód, ktorý manipuluje tieto veci. 1130 00:50:24,950 --> 00:50:29,970 A ja myslel, že by som skončiť na tejto poznámke, sa 55 sekúnd na zvýšenie je to, 1131 00:50:29,970 --> 00:50:31,230 Trúfam si povedzme trochu zavádzajúce. 1132 00:50:31,230 --> 00:50:32,990 >> [PLAYBACK] 1133 00:50:32,990 --> 00:50:34,790 >> -Klame. 1134 00:50:34,790 --> 00:50:38,310 O čo, ja neviem. 1135 00:50:38,310 --> 00:50:41,200 >> -Tak čo vieme? 1136 00:50:41,200 --> 00:50:45,280 >> -To v 09:15 Ray Santoyo bol pri bankomate. 1137 00:50:45,280 --> 00:50:47,830 >> -Takže otázka je, čo robil v 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Streľba deväť milimetrov na niečo. 1139 00:50:50,750 --> 00:50:52,615 Možno videl ostreľovača. 1140 00:50:52,615 --> 00:50:54,760 >> -Alebo sa s ním pracovať. 1141 00:50:54,760 --> 00:50:56,120 >> -Počkaj. 1142 00:50:56,120 --> 00:50:57,450 Vráťte sa jeden. 1143 00:50:57,450 --> 00:50:58,700 >> -Čo vidíš? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Prineste mu lícom nahor, na celej obrazovke. 1146 00:51:09,490 --> 00:51:09,790 >> -Jeho okuliare. 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 ich logo. 1151 00:51:24,530 --> 00:51:27,040 >> A hovorí s tým, kto je na sebe bundu. 1152 00:51:27,040 --> 00:51:27,530 >> [END PLAYBACK] 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 sa budúci týždeň. 1155 00:51:30,720 --> 00:51:32,330 >> MALE SPEAKER: Na ďalšie CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Cvrčkov] 1157 00:51:39,240 --> 00:51:41,270 >> [Prehrávanie hudby]