1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [5. týden] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvard University] 3 00:00:04,860 --> 00:00:07,260 [To je CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> To je CS50, 5. týden. 5 00:00:09,740 --> 00:00:12,900 Dnes a tento týden, představíme trochu světě forenzní 6 00:00:12,900 --> 00:00:14,850 v kontextu problému Set 4. 7 00:00:14,850 --> 00:00:18,480 Dnes bude zkrácen přednáška, protože tam je zvláštní událost v tu poté. 8 00:00:18,480 --> 00:00:21,940 Takže budeme se podívat a dráždit oba studenty i jejich rodiče dnes 9 00:00:21,940 --> 00:00:24,600 s některými z věcí, které jsou na obzoru. 10 00:00:24,600 --> 00:00:29,050 >> Mezi nimi, v pondělí, budete mít několik dalších spolužáků. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvard a MIT nových on-line iniciativa pro OpenCourseWare a více, 12 00:00:32,980 --> 00:00:36,730 zahajuje na akademické půdě Harvardu v pondělí, což znamená, že přijde pondělí 13 00:00:36,730 --> 00:00:40,930 budete mít, jak poslední sčítání, 86000 další spolužáky 14 00:00:40,930 --> 00:00:43,680 kteří budou sledovat spolu s přednáškami CS50 tyto a profilů 15 00:00:43,680 --> 00:00:45,890 a návody a problémové soubory. 16 00:00:45,890 --> 00:00:51,870 A jako součást tohoto, stanete se členy inaugurační třídy CS50 a teď CS50x. 17 00:00:51,870 --> 00:00:56,150 Jako součást teď si uvědomit, že tam budou nějaké upsides stejně. 18 00:00:56,150 --> 00:01:00,620 Chcete-li získat připraven na to, pro masivní počet studentů, 19 00:01:00,620 --> 00:01:03,820 stačí říct, že i když máme 108 TFS a CAS, 20 00:01:03,820 --> 00:01:07,560 to není tak docela nejlepší student-učitel poměr, jakmile se dostaneme 80.000 studentů. 21 00:01:07,560 --> 00:01:09,830 Nebudeme se třídění tolik problém nastaví ručně, 22 00:01:09,830 --> 00:01:13,050 tak představil tento týden v problémové sady budou CS50 Check, 23 00:01:13,050 --> 00:01:15,410 která se bude nástroj příkazového řádku uvnitř myčky 24 00:01:15,410 --> 00:01:17,880 že budete mít po aktualizaci později tento víkend. 25 00:01:17,880 --> 00:01:21,030 Budete moci spustit příkaz, check50, na vlastní PSet, 26 00:01:21,030 --> 00:01:24,770 a budete mít okamžitou zpětnou vazbu o tom, zda je váš program je správné nebo nesprávné 27 00:01:24,770 --> 00:01:27,980 podle různých konstrukčních specifikací, které jsme poskytli. 28 00:01:27,980 --> 00:01:30,310 Více na které v specifikaci problému set. 29 00:01:30,310 --> 00:01:34,220 V CS50x spolužáci budou používat to stejně. 30 00:01:34,220 --> 00:01:36,170 >> Problém Set 4 je všechno o kriminalistice, 31 00:01:36,170 --> 00:01:38,630 a to Pset opravdu inspirován nějakým real-life věci 32 00:01:38,630 --> 00:01:41,210 přičemž, když jsem byl v postgraduálním studiu jsem internován na chvíli 33 00:01:41,210 --> 00:01:45,270 s Middlesex County je okresní zastupitelství dělá forenzní práci 34 00:01:45,270 --> 00:01:47,660 s jejich hlavní forenzní vyšetřovatel. 35 00:01:47,660 --> 00:01:50,280 Co to činil, jak myslím, že jsem zmínil několik týdnů minulosti, 36 00:01:50,280 --> 00:01:52,720 je policie Mass stát nebo jiní by přijít, 37 00:01:52,720 --> 00:01:56,150 by odjet věci jako pevné disky a CD a disket a podobně, 38 00:01:56,150 --> 00:01:58,770 a pak cílem forenzní kanceláře bylo zjistit 39 00:01:58,770 --> 00:02:01,470 zda byl či nebyl důkaz nějakého druhu. 40 00:02:01,470 --> 00:02:04,730 To bylo zvláštní Oddělení pro vyšetřování, tak to bylo úřednický zločin. 41 00:02:04,730 --> 00:02:10,949 Bylo to více znepokojující druh trestných činů, nic zahrnující nějakou digitálních médií. 42 00:02:10,949 --> 00:02:16,450 Ukazuje se, že ne, že mnoho lidí napsat e-mail říkat, "já to udělal." 43 00:02:16,450 --> 00:02:20,490 Takže docela často, tyto forenzní vyhledávání neobjevil všude tolik ovoce, 44 00:02:20,490 --> 00:02:22,820 ale někdy lidé by psát takové e-maily. 45 00:02:22,820 --> 00:02:25,240 Takže někdy, byli odměněni úsilí. 46 00:02:25,240 --> 00:02:31,210 >> Ale vést až k tomuto forenzní PSet, budeme zavádět na pset4 trochu grafiky. 47 00:02:31,210 --> 00:02:35,410 Pravděpodobně jste se tyto věci jako samozřejmost - JPEG, GIF, a podobně - v těchto dnech. 48 00:02:35,410 --> 00:02:38,320 Ale pokud si opravdu myslíte, že o tom, obraz, podobně jako obličej Rob, 49 00:02:38,320 --> 00:02:41,270 může být modelován jako sled teček nebo pixelů. 50 00:02:41,270 --> 00:02:43,380 V případě obličeje Robertův, je tu všechny druhy barev, 51 00:02:43,380 --> 00:02:46,760 a začali jsme vidět jednotlivé body, jinak známý jako pixely, 52 00:02:46,760 --> 00:02:48,610 jakmile jsme začali pro přiblížení 53 00:02:48,610 --> 00:02:54,660 Ale pokud budeme zjednodušovat svět o trochu a jen říct, že tohle je Rob v černé a bílé, 54 00:02:54,660 --> 00:02:57,490 k reprezentaci černé a bílé, můžeme prostě použít binární. 55 00:02:57,490 --> 00:03:01,660 A pokud budeme používat binární, 1 nebo 0, můžeme vyjádřit stejný obrázek 56 00:03:01,660 --> 00:03:06,140 usmívající se tvář Robertův s tímto vzorem bitů. 57 00:03:06,140 --> 00:03:12,100 11000011 představuje bílá, bílá, černá, černá, černá, černá, bílá, bílá. 58 00:03:12,100 --> 00:03:16,150 A tak to není obrovský skok a pak začít mluvit o barevných fotografiích, 59 00:03:16,150 --> 00:03:18,600 věci, které byste vidět na Facebooku, nebo se s digitálním fotoaparátem. 60 00:03:18,600 --> 00:03:21,410 Ale jistě, pokud jde o barvy, budete potřebovat více bitů. 61 00:03:21,410 --> 00:03:25,690 A docela běžné ve světě fotografií je použít ne 1-bitové barvy, 62 00:03:25,690 --> 00:03:29,560 , protože to naznačuje, ale 24-bitové barvy, kam vlastně získat miliony barev. 63 00:03:29,560 --> 00:03:32,250 Tak jako v případě, kdy jsme se přiblížili na oko Rob, 64 00:03:32,250 --> 00:03:36,370 , který byl libovolný počet milionů různých barevných možností. 65 00:03:36,370 --> 00:03:39,040 Takže budeme zavádět to v problému Set 4 stejně jako v návodu, 66 00:03:39,040 --> 00:03:43,370 která bude dnes v 03:30 místo obvyklých 02:30, protože přednášky pátečním zde. 67 00:03:43,370 --> 00:03:46,620 Ale video bude on-line jako obvykle zítra. 68 00:03:46,620 --> 00:03:48,820 >> Budeme také představí vám do jiného formátu. 69 00:03:48,820 --> 00:03:51,270 Toto je záměrně chtěl podívat zastrašující na první, 70 00:03:51,270 --> 00:03:55,670 ale to je jen nějaká dokumentace pro struct C. 71 00:03:55,670 --> 00:03:58,940 Ukazuje se, že Microsoft před lety pomohl popularizovat tento formát 72 00:03:58,940 --> 00:04:05,150 volal bitmapový formát souboru, bmp, a to bylo super jednoduché, barevné grafické formát souboru 73 00:04:05,150 --> 00:04:10,150 , která byla použita pro docela nějaký čas, a někdy ještě pro tapety na stolní počítače. 74 00:04:10,150 --> 00:04:14,760 Pokud si myslíte, že zpět na systém Windows XP a zvlněné kopce a modrou oblohu, 75 00:04:14,760 --> 00:04:17,170 to bylo typicky bmp nebo bitmapový obraz. 76 00:04:17,170 --> 00:04:19,959 Bitmapy jsou zábavné pro nás, protože mají trochu větší komplexnost. 77 00:04:19,959 --> 00:04:22,610 Není to tak jednoduché, jak tento mřížka 0s a 1s. 78 00:04:22,610 --> 00:04:27,510 Místo toho máte věci jako záhlaví na začátku souboru. 79 00:04:27,510 --> 00:04:31,990 Takže jinými slovy, uvnitř. Soubor BMP je celá parta 0s a 1s, 80 00:04:31,990 --> 00:04:34,910 ale tam je nějaký další 0s a 1s tam. 81 00:04:34,910 --> 00:04:38,220 A ukázalo se, že to, co jsme pravděpodobně zaujatý za samozřejmost let - 82 00:04:38,220 --> 00:04:45,170 formáty souborů, jako. doc nebo. xls nebo. mp3, mp4., bez ohledu na formáty souborů 83 00:04:45,170 --> 00:04:48,480 že jste se seznámili s - co to vůbec znamená být formát souboru, 84 00:04:48,480 --> 00:04:52,480 protože na konci dne všechny tyto soubory používáme mají jen 0 a 1. 85 00:04:52,480 --> 00:04:56,810 A možná ti 0s a 1s představují ABC přes ASCII nebo jako, 86 00:04:56,810 --> 00:04:58,820 ale na konci dne, je to ještě jen 0 a 1. 87 00:04:58,820 --> 00:05:02,100 Takže lidé jen občas rozhodnou vymyslet nový formát souborů 88 00:05:02,100 --> 00:05:06,420 kde standardizovat co vzory bitů bude skutečně znamenat. 89 00:05:06,420 --> 00:05:09,220 A v tomto případě zde, že lidé, kteří navrhli bitmapový formát souboru 90 00:05:09,220 --> 00:05:15,620 řekl, že při prvním bajtu v rastrového souboru, jak je označil ofsetových 0 tam, 91 00:05:15,620 --> 00:05:18,940 tam bude nějaký nesrozumitelné názvy proměnné volal bfType, 92 00:05:18,940 --> 00:05:23,080 který právě zkratka pro bitmapový typ souboru, jaký typ rastrového souboru je to. 93 00:05:23,080 --> 00:05:27,700 Můžete vyvodit snad z druhé řady, která ofsetovou 2, byte číslo 2, 94 00:05:27,700 --> 00:05:33,740 má vzor 0s a 1s, který představuje to, co? Velikost něco. 95 00:05:33,740 --> 00:05:35,310 A to jde o odtud. 96 00:05:35,310 --> 00:05:37,410 Takže v problému Set 4, budete prošel některé z těchto věcí. 97 00:05:37,410 --> 00:05:39,520 Nebudeme skončit starat o všechny z nich. 98 00:05:39,520 --> 00:05:47,510 Povšimněme si ale, že začíná být zajímavé okolí bytu 54: rgbtBlue, zelená, červená a. 99 00:05:47,510 --> 00:05:52,110 Pokud jste někdy slyšeli zkratka RGB - červená, zelená, modrá - to je odkaz na který 100 00:05:52,110 --> 00:05:54,610 protože se ukázalo, můžete malovat všechny barvy duhy 101 00:05:54,610 --> 00:05:58,180 s nějakou kombinaci červené a modré a zelené. 102 00:05:58,180 --> 00:06:03,320 A ve skutečnosti, může rodiče v pokoji připomenout některé z prvních projektorů. 103 00:06:03,320 --> 00:06:05,890 V těchto dnech, stačí vidět jeden jasně světlo přicházející z objektivu, 104 00:06:05,890 --> 00:06:09,800 ale zpět v den, kdy měl červenou čočku, modré čočky, a zelené objektiv, 105 00:06:09,800 --> 00:06:13,380 a společně se snažily na obrazovku a tvořil barevné fotografie. 106 00:06:13,380 --> 00:06:16,270 A docela často, by střední školy a vysoké školy mají tyto čočky 107 00:06:16,270 --> 00:06:19,720 někdy tak trochu nakřivo, takže jsi trochu vidět dvoulůžkových a třílůžkových obrázků. 108 00:06:19,720 --> 00:06:24,100 Ale to byl nápad. Vy jste měli červené a zelené a modré světlo malování obrazu. 109 00:06:24,100 --> 00:06:26,590 A to stejný princip je použit v počítačích. 110 00:06:26,590 --> 00:06:30,230 >> Takže mezi úkoly pak pro vás v problému Set 4 se bude pár věcí. 111 00:06:30,230 --> 00:06:34,800 Jedním z nich je skutečně změnit velikost obrázku, aby se ve vzoru 0s a 1s, 112 00:06:34,800 --> 00:06:40,200 zjistit, které kousky 0s a 1s představují to, co do struktury jako je tento, 113 00:06:40,200 --> 00:06:43,630 a pak zjistit, jak se replikovat pixelů - v červené, blues, Zelení - 114 00:06:43,630 --> 00:06:46,660 uvnitř tak, že když obraz vypadá zpočátku, 115 00:06:46,660 --> 00:06:49,210 by to mohlo vypadat toto místo po tom. 116 00:06:49,210 --> 00:06:53,640 Mezi další problémy příliš se bude, že budete podal soudní obrázek 117 00:06:53,640 --> 00:06:56,030 o skutečném souboru z digitálního fotoaparátu. 118 00:06:56,030 --> 00:06:58,960 A na tomto fotoaparátu, kdysi, byli celá parta fotografií. 119 00:06:58,960 --> 00:07:03,760 Problém je, že jsme náhodnému smazání nebo měl obraz poškozen nějak. 120 00:07:03,760 --> 00:07:05,750 Špatné věci se stávají digitálními fotoaparáty. 121 00:07:05,750 --> 00:07:09,150 A tak jsme se rychle kopírovat všechny 0s a 1s vypnutí této karty pro Vás, 122 00:07:09,150 --> 00:07:13,610 zachránil vše v jednom velkém souboru, a pak budeme předat vám je v problému Set 4 123 00:07:13,610 --> 00:07:19,320 takže můžete napsat program v C, s nimiž se obnovit všechny tyto JPEG, ideálně. 124 00:07:19,320 --> 00:07:23,330 A ukázalo se, že JPEG, i když jsou poněkud složité formátu - 125 00:07:23,330 --> 00:07:26,360 jsou mnohem složitější, než tento úsměvem na tváři zde - 126 00:07:26,360 --> 00:07:31,160 ukazuje se, že každý JPEG začíná stejnými vzory 0s a 1s. 127 00:07:31,160 --> 00:07:35,630 Takže pomocí, nakonec, while nebo pro smyčku nebo podobné, 128 00:07:35,630 --> 00:07:38,880 můžete iterovat přes všechny 0s a 1s v tomto soudním obrazu, 129 00:07:38,880 --> 00:07:43,150 a pokaždé, když vidíte speciální vzor, ​​který je definován ve specifikaci problému set, 130 00:07:43,150 --> 00:07:47,880 můžete předpokládat, tady je, s velmi vysokou pravděpodobností, začátek JPEG. 131 00:07:47,880 --> 00:07:51,230 A jakmile zjistíte, stejný vzor určitý počet bajtů 132 00:07:51,230 --> 00:07:55,430 nebo kilobytech nebo megabytech později, můžete předpokládat, zde je druhá JPEG, 133 00:07:55,430 --> 00:07:57,380 foto jsem vzal po prvním. 134 00:07:57,380 --> 00:08:01,370 Dovolte mi, abych přestat číst, že první soubor, začněte psát tento nový, 135 00:08:01,370 --> 00:08:06,310 a výstup programu pro pset4 bude tolik jako 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 A pokud to není 50 JPEG snímků, budete mít trochu smyčky. 137 00:08:09,270 --> 00:08:12,490 Pokud máte nekonečný počet JPEG, máte nekonečnou smyčku. 138 00:08:12,490 --> 00:08:14,910 Takže i bude docela běžný případ. 139 00:08:14,910 --> 00:08:16,600 Takže to je to, co je na obzoru. 140 00:08:16,600 --> 00:08:21,310 >> Kvíz 0 za námi, si uvědomit, za můj e-mail, že vždy existují lidé, kteří jsou oba šťastní, 141 00:08:21,310 --> 00:08:23,640 druh neutrální a smutný kolem kvíz 0 času. 142 00:08:23,640 --> 00:08:26,800 A prosím, dostat se ke mně, hlavu TF Zamyla, vlastní TF, 143 00:08:26,800 --> 00:08:31,180 nebo jeden z úřadů, které budete vědět, jestli byste chtěli diskutovat o tom, jak to šlo. 144 00:08:31,180 --> 00:08:35,539 >> Takže zapůsobit na rodiče tady v pokoji, co je CS50 knihovna? 145 00:08:36,429 --> 00:08:40,390 [Smích] Dobrá práce. 146 00:08:40,390 --> 00:08:48,340 Co je to CS50 knihovna? Jo. >> [Student] Je to pre-psaný soubor kódu [neslyšitelné] 147 00:08:48,340 --> 00:08:49,750 Dobře, dobře. 148 00:08:49,750 --> 00:08:53,240 Je to pre-psaný soubor kódu, který pracovníci napsali, které vám poskytneme, 149 00:08:53,240 --> 00:08:55,030 , která poskytuje některé společné funkce, 150 00:08:55,030 --> 00:08:59,020 Věci jako se mi řetězec, abych int - všechny funkce, které jsou zde uvedeny. 151 00:08:59,020 --> 00:09:02,260 >> Od teď, začneme skutečně brát tyto vzdělávací kola off. 152 00:09:02,260 --> 00:09:05,050 Budeme začít vzít řetězec od vás, 153 00:09:05,050 --> 00:09:08,870 které připomínají byl jen synonymem pro jaký skutečný datový typ? [Více >> studenti] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Pro rodiče, to bylo asi [je whooshing zvuk]. To je dobře. 155 00:09:12,730 --> 00:09:17,550 Char * začneme vidět na obrazovce všechny více jak odstranit řetězec z našeho slovníku, 156 00:09:17,550 --> 00:09:19,730 alespoň pokud jde o skutečnosti psaní kódu. 157 00:09:19,730 --> 00:09:22,840 Podobně, přestaneme s použitím některé z těchto funkcí až 158 00:09:22,840 --> 00:09:25,280 protože naše programy se dostat sofistikovanější. 159 00:09:25,280 --> 00:09:28,480 Spíše než jen psát programy, které sedí tam s řádku bliká, 160 00:09:28,480 --> 00:09:31,870 čeká na uživatele, aby něco psát v, dostanete vaše vstupy odjinud. 161 00:09:31,870 --> 00:09:35,490 Například, budete si je z řady bitů na místní pevný disk. 162 00:09:35,490 --> 00:09:38,580 Budete místo si v budoucnu od připojení k síti, 163 00:09:38,580 --> 00:09:40,230 Některé webové stránky někde. 164 00:09:40,230 --> 00:09:44,110 >> Takže pojďme Sloupněte této vrstvy poprvé a zvedněte CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 a tento soubor s názvem cs50.h, které jste # včetně týdnů, 166 00:09:49,010 --> 00:09:51,140 ale pojďme skutečně vidět, co je uvnitř toho. 167 00:09:51,140 --> 00:09:54,430 V horní části souboru v modré barvě je jen celá parta komentářů: 168 00:09:54,430 --> 00:09:57,050 Informace o záruce a licencování. 169 00:09:57,050 --> 00:09:59,050 To je druh společného paradigmatu v softwaru 170 00:09:59,050 --> 00:10:01,580 protože spousta software v těchto dnech je to, co se nazývá open source, 171 00:10:01,580 --> 00:10:05,220 což znamená, že někdo napsal kód a dělal to volně k dispozici 172 00:10:05,220 --> 00:10:10,470 nejen spustit a používat, ale skutečně číst a měnit a integrovat do své vlastní práce. 173 00:10:10,470 --> 00:10:14,660 Takže to je to, co jste dosud používali, open source software, i když ve velmi malém formuláře. 174 00:10:14,660 --> 00:10:18,560 Kdybych posunout dolů kolem připomínky, když začneme se podívat na nějaké další známé věci. 175 00:10:18,560 --> 00:10:25,010 Upozornění na vrcholu zde soubor cs50.h obsahuje spoustu hlavičkových souborů. 176 00:10:25,010 --> 00:10:28,560 Většina z nich, jsme ještě neviděli, ale jeden je obeznámen. 177 00:10:28,560 --> 00:10:32,270 Který z nich jsme viděli, byť krátce, tak daleko? >> [Student] Standardní knihovna. 178 00:10:32,270 --> 00:10:35,810 Jo, standardní knihovny. stdlib.h má malloc. 179 00:10:35,810 --> 00:10:38,320 Jakmile jsme začali mluvit o dynamické přidělování paměti, 180 00:10:38,320 --> 00:10:41,650 které se vrátíme na příští týden, stejně, jsme začali včetně tohoto souboru. 181 00:10:41,650 --> 00:10:46,640 Ukazuje se, že bool a pravdivé a falešné dělat ne vlastně existovat v C samo o sobě 182 00:10:46,640 --> 00:10:49,440 pokud tento soubor zahrnout zde. 183 00:10:49,440 --> 00:10:52,710 Jsme celé týdny byly, včetně stdbool.h 184 00:10:52,710 --> 00:10:55,620 takže můžete použít pojem bool, true nebo false. 185 00:10:55,620 --> 00:10:58,620 Bez toho, měli byste se trochu falešné něj a použít int 186 00:10:58,620 --> 00:11:02,610 a jen svévolně předpokládat, že 0 je false a 1 je pravda. 187 00:11:02,610 --> 00:11:07,150 Pokud bychom posunout dolů dál, tady je naše definice řetězce. 188 00:11:07,150 --> 00:11:11,390 Ukázalo se, jak jsme řekli dříve, že pokud tato hvězda je opravdu nezáleží. 189 00:11:11,390 --> 00:11:13,720 Můžete dokonce mít prostor všude kolem. 190 00:11:13,720 --> 00:11:16,740 Jsme tento semestr byly její propagaci, protože to aby bylo jasné, 191 00:11:16,740 --> 00:11:18,620 že hvězda má co do činění s typem, 192 00:11:18,620 --> 00:11:21,700 ale uvědomte si, stejně běžné, ne-li o něco častější, 193 00:11:21,700 --> 00:11:24,430 je to tam dal, ale funkčně je to totéž. 194 00:11:24,430 --> 00:11:27,720 Ale teď, když čteme stanoví další, pojďme se podívat na GetInt 195 00:11:27,720 --> 00:11:32,190 protože jsme použili, že možná dřív, než cokoli jiného tento semestr. 196 00:11:32,190 --> 00:11:37,440 Tady je GetInt. To je to, co? >> [Student] prototyp. >> To je jen prototyp. 197 00:11:37,440 --> 00:11:41,410 Často, dali jsme prototypy na vrcholky našich. C soubory, 198 00:11:41,410 --> 00:11:46,690 ale můžete také dát prototypy v hlavičkových souborech,. h soubory, jako je tento zde 199 00:11:46,690 --> 00:11:50,840 takže když budete psát nějaké funkce, které chcete, aby ostatní lidé mohli používat, 200 00:11:50,840 --> 00:11:53,550 což je přesně případ knihovny CS50, 201 00:11:53,550 --> 00:11:57,040 můžete nejen realizovat své funkce v něco jako cs50.c, 202 00:11:57,040 --> 00:12:02,790 si také dát prototypů není v horní části tohoto souboru, ale v horní části záhlaví souboru. 203 00:12:02,790 --> 00:12:07,170 Pak, že hlavičkový soubor je to, co přátelé a kolegové patří 204 00:12:07,170 --> 00:12:09,760 s # include ve svém vlastním kódu. 205 00:12:09,760 --> 00:12:12,210 Takže celou tu dobu, co jste byli, včetně všech těchto prototypů, 206 00:12:12,210 --> 00:12:16,580 účinně na začátek souboru, ale prostřednictvím tohoto # zahrnují mechanismus, 207 00:12:16,580 --> 00:12:20,070 které v podstatě kopie a pasty tento soubor do své vlastní. 208 00:12:20,070 --> 00:12:23,070 Zde je několik poměrně podrobná dokumentace. 209 00:12:23,070 --> 00:12:25,640 Jsme skoro za samozřejmé, že GetInt dostane int, 210 00:12:25,640 --> 00:12:27,640 ale to dopadá tam jsou některé rohové případy. 211 00:12:27,640 --> 00:12:31,810 Co když uživatel zadá do čísla, které je příliš velké, quintillion, 212 00:12:31,810 --> 00:12:35,490 že prostě nemůže vejít z int? Co je očekávané chování? 213 00:12:35,490 --> 00:12:38,020 V ideálním případě, je to předvídatelné. 214 00:12:38,020 --> 00:12:40,280 Takže v tomto případě, pokud si skutečně přečíst drobným písmem, 215 00:12:40,280 --> 00:12:44,500 budete skutečně vidět, že v případě, že linka nemůže být přečíst, vrátí INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Nikdy jsme o tom mluvili, ale na základě jeho kapitalizace, co je to asi? 217 00:12:48,320 --> 00:12:50,640 [Student] konstantní. >> Je to konstanta. 218 00:12:50,640 --> 00:12:54,770 Je to nějaký zvláštní konstanta, která je pravděpodobně prohlášen v jednom z těchto hlavičkových souborů 219 00:12:54,770 --> 00:13:00,090 to výš v souboru, a INT_MAX je asi něco jako zhruba 2 mld. Kč, 220 00:13:00,090 --> 00:13:04,990 Myšlenka je, že proto, že musíme nějak znamenat, že něco se pokazilo, 221 00:13:04,990 --> 00:13:10,700 jsme, ano, mají 4000000000 čísla máme k dispozici: -2000000000 až na 2 miliardy, dávat nebo brát. 222 00:13:10,700 --> 00:13:14,710 No, to, co je běžné v programování je budete krást jen jedno z těchto čísel, 223 00:13:14,710 --> 00:13:18,920 Možná 0, možná 2 miliardy, možná -2000000000, 224 00:13:18,920 --> 00:13:23,280 takže strávíte jednu ze svých možných hodnot, takže můžete zavázat k světu 225 00:13:23,280 --> 00:13:26,820 že když se něco pokazí, vrátím to super velkou hodnotu. 226 00:13:26,820 --> 00:13:31,030 Ale nechcete uživatel zadáním něco mystické jako 234 ..., opravdu velké číslo. 227 00:13:31,030 --> 00:13:34,060 Můžete zobecnit to místo jako konstanta. 228 00:13:34,060 --> 00:13:38,060 Takže opravdu, pokud jste byli anální posledních pár týdnů, kdykoliv jsi zavolala GetInt, 229 00:13:38,060 --> 00:13:42,900 měli byste být kontrola s, pokud podmínka udělal typ uživatele v INT_MAX, 230 00:13:42,900 --> 00:13:46,590 nebo, přesněji, udělal GetInt zpáteční INT_MAX, protože kdyby to udělal, 231 00:13:46,590 --> 00:13:51,830 to vlastně znamená, že ani psát. Něco se pokazilo v tomto případě. 232 00:13:51,830 --> 00:13:56,080 Tak tohle je to, co je všeobecně známo jako sentinelové hodnota, což vyžaduje zvláštní. 233 00:13:56,080 --> 00:13:58,120 >> Pojďme se nyní do souboru. C. 234 00:13:58,120 --> 00:14:01,340 Soubor C existuje v zařízení nějakou dobu. 235 00:14:01,340 --> 00:14:06,840 A ve skutečnosti, přístroj má to předkompilované pro vás do této věci jsme nazvali objektový kód, 236 00:14:06,840 --> 00:14:09,540 ale to prostě není jedno, kde to je, protože systém ví, 237 00:14:09,540 --> 00:14:11,730 v tomto případě, kdy je: zařízení. 238 00:14:11,730 --> 00:14:17,400 Pojďme přejděte nyní GetInt a uvidíte, jak GetInt působí celou tu dobu. 239 00:14:17,400 --> 00:14:19,460 Zde máme podobné poznámky z období před. 240 00:14:19,460 --> 00:14:21,660 Dovolte mi, abych přiblížit jen na kódu části. 241 00:14:21,660 --> 00:14:23,900 A co máme pro GetInt je následující. 242 00:14:23,900 --> 00:14:25,700 Trvá žádný vstup. 243 00:14:25,700 --> 00:14:29,510 Vrací int, while (true), takže máme úmyslné nekonečnou smyčku, 244 00:14:29,510 --> 00:14:33,180 ale pravděpodobně budeme vypuknout to nějak nebo se vrátit v rámci tohoto. 245 00:14:33,180 --> 00:14:34,870 >> Pojďme se podívat, jak to funguje. 246 00:14:34,870 --> 00:14:39,240 Zdá se, že pomocí GetString v tomto prvním řádku uvnitř smyčky, 166. 247 00:14:39,240 --> 00:14:43,780 To je nyní dobré praxe, protože, za jakých okolností by GetString vrátit 248 00:14:43,780 --> 00:14:47,660 speciální klíčové slovo NULL? >> [Student] Pokud se něco pokazí. 249 00:14:47,660 --> 00:14:51,630 Pokud se něco pokazí. A co by se mohlo pokazit, když budete volat něco jako GetString? 250 00:14:54,960 --> 00:14:57,640 Jo. >> [Student] Malloc nedokáže dát na ints. 251 00:14:57,640 --> 00:14:59,150 Jo. Možná malloc nezdaří. 252 00:14:59,150 --> 00:15:03,190 Někde pod pokličku, GetString volá malloc, který by určoval paměť, 253 00:15:03,190 --> 00:15:06,020 která umožňuje počítači úložiště všech postav 254 00:15:06,020 --> 00:15:07,750 že uživatel zadá do klávesnice. 255 00:15:07,750 --> 00:15:11,590 A předpokládat uživatel měl spoustu volného času a napsal více, například, 256 00:15:11,590 --> 00:15:16,160 než 2 miliardy znaků, více znaků než v počítači, má dokonce i RAM. 257 00:15:16,160 --> 00:15:19,250 GetString musí být schopen znamenat, že na vás. 258 00:15:19,250 --> 00:15:22,560 I když je to super, super neobvyklé roh případ, 259 00:15:22,560 --> 00:15:24,340 musí nějak být schopny zvládnout, 260 00:15:24,340 --> 00:15:28,750 a tak GetString, kdybychom se vrátili a přečíst si jeho dokumentaci, se v NULL skutečnosti návratu. 261 00:15:28,750 --> 00:15:34,460 Takže teď, když GetString selže vrácením NULL, GetInt bude selhání vrácením INT_MAX 262 00:15:34,460 --> 00:15:37,690 stejně jako hlídka. To jsou jen lidské konvence. 263 00:15:37,690 --> 00:15:41,450 Jediný způsob, jak by vědět, že to je případ od čtení dokumentace. 264 00:15:41,450 --> 00:15:45,040 >> Pojďme přejděte na místo, kde je int skutečně dostal. 265 00:15:45,040 --> 00:15:51,160 Kdybych posunout dolů o kousek dál, v souladu 170, máme komentář nad těmito řádky. 266 00:15:51,160 --> 00:15:55,100 Prohlašujeme v 172 int, n, a char, c, a pak se toto nové funkce, 267 00:15:55,100 --> 00:15:58,930 které někteří z vás narazil dříve, sscanf. 268 00:15:58,930 --> 00:16:00,870 To je zkratka pro řetězce scanf. 269 00:16:00,870 --> 00:16:05,700 Jinými slovy, dej mi řetězec a budu testovat to na kusy informací zájmu. 270 00:16:05,700 --> 00:16:07,360 Co to znamená? 271 00:16:07,360 --> 00:16:11,800 Předpokládejme, že jsem typ v doslova, 123 na klávesnici a pak stiskněte klávesu Enter. 272 00:16:11,800 --> 00:16:16,470 Jaký je datový typ 123, když se vrátil od GetString? >> [Student] String. 273 00:16:16,470 --> 00:16:18,380 Je to samozřejmě string, ne? Mám řetězec. 274 00:16:18,380 --> 00:16:23,220 Takže 123 je opravdu, cituji-konec citátu, 123 s \ 0 na konci. 275 00:16:23,220 --> 00:16:27,110 To není int. To není číslo. Vypadá to jako číslo, ale není to vlastně. 276 00:16:27,110 --> 00:16:29,080 Takže to, co se GetInt udělat? 277 00:16:29,080 --> 00:16:35,750 To má skenovat, že řetězec zleva doprava - 123 \ 0 - a nějak převést na skutečné číslo. 278 00:16:35,750 --> 00:16:37,850 Dalo by se zjistit, jak to udělat. 279 00:16:37,850 --> 00:16:41,450 Pokud si myslíte, že zpět do pset2, můžete pravděpodobně se trochu pohodlné s Caesarem 280 00:16:41,450 --> 00:16:44,820 nebo Vigenere, takže můžete iteraci řetězec, můžete převést znaky na ints. 281 00:16:44,820 --> 00:16:46,710 Ale sakra, to je spousta práce. 282 00:16:46,710 --> 00:16:49,860 Proč ne volat funkci jako sscanf, který dělá to pro vás? 283 00:16:49,860 --> 00:16:54,230 Takže sscanf očekává argument - v tomto případě nazývá linka, která je řetězec. 284 00:16:54,230 --> 00:17:01,840 Ty pak zadat v uvozovkách, velmi podobný printf, co očekávat, že v tomto řetězci. 285 00:17:01,840 --> 00:17:09,000 A to, co tu říkám je, že jsem očekávat, že desetinné číslo a možná i charakter. 286 00:17:09,000 --> 00:17:12,000 A uvidíme, proč tomu tak je za chvíli. 287 00:17:12,000 --> 00:17:15,869 A ukázalo se, že tento záznam je nyní připomíná, co jsme začali mluvit o 288 00:17:15,869 --> 00:17:17,619 jen něco málo přes týden před. 289 00:17:17,619 --> 00:17:21,740 Co je a n a a c dělá pro nás? >> [Student] Adresa n a adresa c.. 290 00:17:21,740 --> 00:17:25,400 Jo. Je to, že mi dal adresu n a adresu c. Proč je to tak důležité? 291 00:17:25,400 --> 00:17:30,220 Víte, že s funkcí v C, můžete produkt vždy vrátit hodnotu nebo žádnou hodnotu. 292 00:17:30,220 --> 00:17:34,530 Můžete se vrátit int, je řetězec, float, char, bez ohledu na, nebo se můžete vrátit neplatné, 293 00:17:34,530 --> 00:17:38,030 ale můžete vrátit pouze jednu věc maximálně. 294 00:17:38,030 --> 00:17:42,760 Ale tady chceme sscanf vrátit mi možná int, desetinné číslo, 295 00:17:42,760 --> 00:17:46,220 a také char, a já ti to vysvětlím, proč char za chvíli. 296 00:17:46,220 --> 00:17:51,460 Ty účinně Chcete sscanf vrátit dvě věci, ale to prostě není možné v C. 297 00:17:51,460 --> 00:17:55,200 Můžete obejít, že předáním dvěma adresami 298 00:17:55,200 --> 00:17:57,370 protože jakmile podáš funkci, dvě adresy, 299 00:17:57,370 --> 00:18:00,470 co může, že funkce s nimi dělat? >> [Student] Napište těchto adres. 300 00:18:00,470 --> 00:18:02,010 To může napsat na tyto adresy. 301 00:18:02,010 --> 00:18:05,770 Můžete použít hvězdu operaci a tam, aby se každý z těchto adres. 302 00:18:05,770 --> 00:18:11,260 Je to něco tohoto typu back-mechanismu dveří, ale velmi běžné pro změnu hodnot proměnných 303 00:18:11,260 --> 00:18:14,870 více než jen jedno místo - v tomto případě dva. 304 00:18:14,870 --> 00:18:21,340 Teď všimnete jsem kontrola == 1 a pak se vracet n případě, že se ve skutečnosti, vyhodnotí na true. 305 00:18:21,340 --> 00:18:26,170 Tak co se děje? Technicky, všichni chceme skutečně stalo v GetInt je tento. 306 00:18:26,170 --> 00:18:30,740 Chceme analyzovat, abych tak řekl, chceme číst řetězec - quote-konec citátu 123 - 307 00:18:30,740 --> 00:18:34,560 a pokud to vypadá, že to číslo tam, co říkáme sscanf dělat 308 00:18:34,560 --> 00:18:38,190 je kladen na toto číslo - 123 - v této proměnné n pro mě. 309 00:18:38,190 --> 00:18:42,090 Tak proč potom jsem vlastně mají to stejně? 310 00:18:42,090 --> 00:18:48,220 Jaká je role sscanf říct, že si může také dostat charakter sem? 311 00:18:48,220 --> 00:18:53,470 [Neslyšitelné Student reakce] >> desetinná čárka skutečně mohl fungovat. 312 00:18:53,470 --> 00:18:56,330 Pojďme si myslí, že se na chvíli zamyslel. Co ještě? 313 00:18:56,330 --> 00:18:59,270 [Student] Mohlo by to být NULL. >> Dobrá myšlenka. Mohlo by to být null znak. 314 00:18:59,270 --> 00:19:01,660 Je to vlastně není v tomto případě. Jo. >> [Student] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Nebo mi dovolte zobecnit ještě dále. 316 00:19:04,340 --> 00:19:06,640 % C tam je jen pro kontrolu chyb. 317 00:19:06,640 --> 00:19:09,300 Nechceme tam být znak za číslo, 318 00:19:09,300 --> 00:19:11,870 ale co to mi umožňuje udělat, je následující. 319 00:19:11,870 --> 00:19:18,210 Ukazuje se, že sscanf, kromě ukládání hodnot v N a C v tomto příkladu zde, 320 00:19:18,210 --> 00:19:24,890 co to také dělá, je, že vrací počet proměnných je kladen hodnoty palců 321 00:19:24,890 --> 00:19:30,260 Takže pokud jste jen zadejte 123, pak jen% d bude odpovídat, 322 00:19:30,260 --> 00:19:33,880 a jen n je uložena s hodnotou, jako je 123, 323 00:19:33,880 --> 00:19:35,640 a nic dostane dát do c. 324 00:19:35,640 --> 00:19:37,620 C zůstává odpadky hodnotu, abych tak řekl - 325 00:19:37,620 --> 00:19:40,730 popelářský, protože je to nikdy nebyla inicializována na libovolnou hodnotu. 326 00:19:40,730 --> 00:19:45,520 Takže v tomto případě, sscanf vrátí 1, protože jsem naplněn 1 těchto ukazatelů, 327 00:19:45,520 --> 00:19:50,190 v takovém případě skvělý, mám int, takže jsem uvolnit linku uvolnit paměť 328 00:19:50,190 --> 00:19:54,000 že GetString skutečně přidělené, a pak jsem se vrátit n, 329 00:19:54,000 --> 00:19:58,500 else pokud jste někdy nad tím, kde to opakovat prohlášení přichází z toho pochází přímo odsud. 330 00:19:58,500 --> 00:20:04,390 Takže pokud naopak, píšu v 123foo - jen nějaký náhodný sled textu - 331 00:20:04,390 --> 00:20:08,490 sscanf uvidí číslo, číslo, číslo, f, 332 00:20:08,490 --> 00:20:16,410 a to bude dát 123 do n; to dám F v C a pak se vrátit 2. 333 00:20:16,410 --> 00:20:20,640 Takže máme, jen pomocí základní definici chování sscanf je, velmi jednoduchý způsob - 334 00:20:20,640 --> 00:20:23,900 dobře, komplex na první pohled, ale na konci dne poměrně jednoduchý mechanismus - 335 00:20:23,900 --> 00:20:28,320 říct je, že int, a pokud ano, je to, že jediná věc, kterou jsem našel? 336 00:20:28,320 --> 00:20:29,860 A mezery tady je úmyslné. 337 00:20:29,860 --> 00:20:34,000 Pokud budete číst dokumentaci k sscanf, to vám řekne, že pokud jsou kousek mezerou 338 00:20:34,000 --> 00:20:38,810 na začátku nebo na konci, sscanf příliš umožní uživateli, z jakéhokoli důvodu, 339 00:20:38,810 --> 00:20:41,860 zasáhnout mezerník 123 a to bude legitimní. 340 00:20:41,860 --> 00:20:44,150 Nebudete křičet na uživatele jen proto, že narazí na mezerník 341 00:20:44,150 --> 00:20:48,640 na začátku nebo na konci, což je jen o málo více uživatelsky příjemný. 342 00:20:48,640 --> 00:20:52,300 >> Jakékoli otázky, pak na GetInt? Jo. >> [Student] Co když jen dát do char? 343 00:20:52,300 --> 00:20:54,030 Dobrá otázka. 344 00:20:54,030 --> 00:20:59,890 Co když jste právě zadali v char jako f a stiskněte klávesu Enter, aniž by kdy psaní 123? 345 00:20:59,890 --> 00:21:02,420 Co si myslíte chování tomto řádku kódu by pak? 346 00:21:02,420 --> 00:21:04,730 [Neslyšitelné Student odpověď] 347 00:21:04,730 --> 00:21:08,790 Jo, takže sscanf může pokrývat, že i proto, že v takovém případě, že to nebude k vyplnění n nebo c.. 348 00:21:08,790 --> 00:21:15,310 Bude to místo vrátit 0, v tom případě jsem také chytí, že scénář 349 00:21:15,310 --> 00:21:18,750 protože očekávaná hodnota chci je 1. 350 00:21:18,750 --> 00:21:22,000 Chci jen jeden a jen jedna věc, kterou je třeba zaplnit. Dobrá otázka. 351 00:21:22,000 --> 00:21:24,290 >> Ostatní? Dobrá. 352 00:21:24,290 --> 00:21:26,250 >> Pojďme se projít všechny funkce v zde, 353 00:21:26,250 --> 00:21:29,500 ale ten, který se zdá být snad zbývající zájmu je GetString 354 00:21:29,500 --> 00:21:32,790 protože se ukázalo, že GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 všechny punt hodně z jejich funkčnosti na GetString. 356 00:21:36,260 --> 00:21:39,750 Takže pojďme se podívat na to, jak on je realizován zde. 357 00:21:39,750 --> 00:21:43,630 Tohle vypadá trochu složitější, ale používá stejné základy 358 00:21:43,630 --> 00:21:45,670 že jsme začali mluvit o minulý týden. 359 00:21:45,670 --> 00:21:49,490 V GetString, který nebere argument, podle prázdna sem 360 00:21:49,490 --> 00:21:53,730 a vrátí řetězec, jsem zřejmě jsem se prohlašuje, že řetězec s názvem vyrovnávací paměť. 361 00:21:53,730 --> 00:21:56,270 Já opravdu nevím, co že se to využít k ještě, ale uvidíme. 362 00:21:56,270 --> 00:21:58,390 Vypadá to, že kapacita je ve výchozím nastavení 0. 363 00:21:58,390 --> 00:22:01,350 Ne tak docela jisti, kde to bude, není si jistý, co n se bude používat pro ještě, 364 00:22:01,350 --> 00:22:03,590 ale teď je to stále trochu zajímavější. 365 00:22:03,590 --> 00:22:06,520 V souladu 243, prohlašujeme int, c. 366 00:22:06,520 --> 00:22:08,800 To je něco jako hloupé detailu. 367 00:22:08,800 --> 00:22:15,820 Char je 8 bitů, a 8 bitů lze uložit, kolik různých hodnot? >> [Student] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Problém je, pokud chcete mít 256 různých ASCII znaky, které existují 369 00:22:20,730 --> 00:22:23,340 pokud si myslíte, že zpět - a to není něco, co pamatovat. 370 00:22:23,340 --> 00:22:25,710 Ale pokud si myslíte, že zpět do té velké ASCII tabulky jsme měli před několika týdny, 371 00:22:25,710 --> 00:22:30,600 bylo v tomto případě 128 nebo 256 znaků ASCII. 372 00:22:30,600 --> 00:22:32,940 Použili jsme všechny vzory 0s a 1s nahoru. 373 00:22:32,940 --> 00:22:36,210 To je problém, pokud chcete být schopen detekovat chybu 374 00:22:36,210 --> 00:22:40,190 protože pokud jste již používáte 256 hodnot pro své postavy, 375 00:22:40,190 --> 00:22:43,050 jste opravdu plánovat dopředu, protože teď nemáte žádný způsob, jak říkat, 376 00:22:43,050 --> 00:22:46,270 to není legitimní charakter, to je nějaký chybný zprávu. 377 00:22:46,270 --> 00:22:50,270 Takže to, co svět skutečně je, že používají další největší hodnotu, něco jako int, 378 00:22:50,270 --> 00:22:54,720 tak, že máte šílený počet bitů, 32, pro 4 miliardy možných hodnot 379 00:22:54,720 --> 00:22:58,860 takže můžete jednoduše skončit s použitím v podstatě 257 z nich, 380 00:22:58,860 --> 00:23:01,720 1 z nich má nějaký zvláštní význam jako chyba. 381 00:23:01,720 --> 00:23:03,120 >> Tak uvidíme, jak to funguje. 382 00:23:03,120 --> 00:23:07,760 V souladu 246, mám velkou smyčky while, která volá fgetc, 383 00:23:07,760 --> 00:23:11,090 f znamená soubor, takže getc, a pak se stdin. 384 00:23:11,090 --> 00:23:15,520 Ukázalo se, že to je jen přesnější způsob, jak říkat čte vstup z klávesnice. 385 00:23:15,520 --> 00:23:19,300 Standardní vstupní prostředky klávesnice, standardní výkon znamená obrazovku, 386 00:23:19,300 --> 00:23:23,310 a standardní chyba, kterou uvidíme v pset4, znamená obrazovku 387 00:23:23,310 --> 00:23:27,490 ale zvláštní část obrazovky tak, aby to není sjednocen s skutečnému výstupu 388 00:23:27,490 --> 00:23:30,750 který určena pro tisk. Ale o tom více v budoucnu. 389 00:23:30,750 --> 00:23:34,440 Takže fgetc jen znamená přečíst jeden znak z klávesnice a uložit ho tam, kde? 390 00:23:34,440 --> 00:23:37,350 Uložte jej do cca. 391 00:23:37,350 --> 00:23:41,360 A pak zkontrolovat -, takže jsem jen pomocí pár logických konjunkce zde - 392 00:23:41,360 --> 00:23:46,000 ujistěte se, že není rovno - \ n, takže uživatel Enter, chceme zastavit v tomto bodě, 393 00:23:46,000 --> 00:23:49,850 konec smyčky - a také chceme, aby zjistili, zda pro zvláštní konstantní OSZ, 394 00:23:49,850 --> 00:23:53,610 která, pokud víte nebo tušíte, co to znamená? >> [Student] Konec souboru. >> Konec souboru. 395 00:23:53,610 --> 00:23:56,560 To je druh nesmyslný, protože když píšu na klávesnici, 396 00:23:56,560 --> 00:23:58,870 je to opravdu žádný soubor se na tomto, 397 00:23:58,870 --> 00:24:01,150 ale to je jen trochu generický termín použitý znamenat 398 00:24:01,150 --> 00:24:04,220 že nic jiného se blíží z lidského prsty. 399 00:24:04,220 --> 00:24:06,460 EOF - konec souboru. 400 00:24:06,460 --> 00:24:09,920 Jak stranou, pokud jste někdy hit Ovládací D na vaší klávesnici, ne že byste ještě - 401 00:24:09,920 --> 00:24:15,230 jste hit Control C - Control D pošle tento speciální konstanta tzv. EOF. 402 00:24:15,230 --> 00:24:19,850 Takže teď máme jen nějaké dynamické přidělování paměti. 403 00:24:19,850 --> 00:24:23,440 >> Takže pokud (n + 1> kapacita). Teď budu vysvětlovat n. 404 00:24:23,440 --> 00:24:26,100 N je jen, kolik bytů je v současné době ve vyrovnávací paměti, 405 00:24:26,100 --> 00:24:28,620 řetězec, který jste v současné době buduje od uživatele. 406 00:24:28,620 --> 00:24:33,450 Pokud máte více znaků ve vašem vyrovnávací paměti, než budete mít kapacitu vyrovnávací paměti, 407 00:24:33,450 --> 00:24:37,410 intuitivně, co musíme udělat, a pak je přidělit větší kapacitu. 408 00:24:37,410 --> 00:24:43,330 Takže budu sbírat v průběhu některé z aritmetického zde a soustředit se pouze na tuto funkci zde. 409 00:24:43,330 --> 00:24:46,070 Víte, co malloc je nebo jsou alespoň rámcově obeznámen. 410 00:24:46,070 --> 00:24:48,970 Hádat, co realloc dělá. >> [Student] Přidá paměti. 411 00:24:48,970 --> 00:24:52,920 To není úplně přidání paměti. To přerozděluje paměť takto. 412 00:24:52,920 --> 00:24:57,220 Pokud je stále ještě prostor na konci řetězce, aby vám více, že paměť 413 00:24:57,220 --> 00:25:00,000 než původně vám dává, pak budete moci dát další paměť. 414 00:25:00,000 --> 00:25:03,460 Takže si můžete jen držet uvedení řetězec, postavy zády k sobě, aby se zády k sobě. 415 00:25:03,460 --> 00:25:05,830 Ale pokud to není případ, protože jste čekali příliš dlouho 416 00:25:05,830 --> 00:25:07,940 a něco náhodně dostal svalil do paměti tam 417 00:25:07,940 --> 00:25:10,290 ale je tu další paměti tady, to je v pořádku. 418 00:25:10,290 --> 00:25:13,100 Realloc bude dělat vše těžkou práci za vás, 419 00:25:13,100 --> 00:25:16,750 přesunout řetězec co jste si přečetli v tak daleko odtud, dal ji tam, 420 00:25:16,750 --> 00:25:19,460 a pak vám ještě trochu dráhu v tomto bodě. 421 00:25:19,460 --> 00:25:22,550 >> Takže s mávnutím ruky, dovolte mi říci, že to, co dělá GetString 422 00:25:22,550 --> 00:25:26,330 je to začíná s malým pufru, možná jediný znak, 423 00:25:26,330 --> 00:25:30,820 a pokud uživatel zadá do dvou postav, GetString skončí volání realloc a říká, že 424 00:25:30,820 --> 00:25:33,150 jeden znak nebylo dost, dej mi dvě postavy. 425 00:25:33,150 --> 00:25:35,950 Pak, pokud budete číst přes logiky smyčky, bude to říct 426 00:25:35,950 --> 00:25:39,600 Uživatel napsal do 3 znaky, dej mi teď není 2, ale 4 znaky, 427 00:25:39,600 --> 00:25:42,320 tak mi dej 8, tak mi dej 16 a 32. 428 00:25:42,320 --> 00:25:45,000 Skutečnost, že jsem Zdvojnásobení kapacity pokaždé 429 00:25:45,000 --> 00:25:48,570 Znamená to, že vyrovnávací paměť je nebude rostou pomalu, že to bude růst velmi rychlý. 430 00:25:48,570 --> 00:25:51,380 A co by mohlo být výhodou, že? 431 00:25:51,380 --> 00:25:54,600 Proč jsem zdvojnásobení velikosti vyrovnávací paměti 432 00:25:54,600 --> 00:25:58,020 i když uživatel mohl stačí jedno extra znak z klávesnice? 433 00:25:58,020 --> 00:26:01,750 [Neslyšitelné Student odpověď] >> Co je to? >> [Student] Nemusíte pěstovat to, jak často. 434 00:26:01,750 --> 00:26:03,300 Přesně tak. Nemusíte pěstovat to, jak často. 435 00:26:03,300 --> 00:26:05,510 A to je jen trochu, že jsi zajištění své sázky zde, 436 00:26:05,510 --> 00:26:10,850 Myšlenka je, že nechcete volat realloc hodně, protože to má tendenci být pomalé. 437 00:26:10,850 --> 00:26:12,910 Kdykoliv můžete požádat operační systém pro paměti, 438 00:26:12,910 --> 00:26:16,990 jak brzy uvidíte v budoucnu problém sadě, má tendenci trvat nějaký čas. 439 00:26:16,990 --> 00:26:20,010 Takže je minimalizovat množství času, i když ztrácíme nějaké místo, 440 00:26:20,010 --> 00:26:21,900 tendenci být dobré. 441 00:26:21,900 --> 00:26:24,060 >> Ale pokud budeme číst prostřednictvím závěrečné části GetString zde - 442 00:26:24,060 --> 00:26:27,950 a znovu pochopení každý řádek zde není tak důležitá i dnes - 443 00:26:27,950 --> 00:26:30,530 Všimněte si, že to nakonec zavolá malloc znovu 444 00:26:30,530 --> 00:26:33,880 a přiděluje přesně tolik bajtů, jak je třeba pro řetězec 445 00:26:33,880 --> 00:26:38,060 a pak vyhodí voláním zdarma přílišné velkou vyrovnávací paměť 446 00:26:38,060 --> 00:26:40,080 pokud to opravdu dostal dvojnásobek příliš mnohokrát. 447 00:26:40,080 --> 00:26:42,730 Takže ve zkratce, je to, jak GetString působí celou tu dobu. 448 00:26:42,730 --> 00:26:47,060 Vše to je číst jeden znak v době, znovu a znovu a znovu, 449 00:26:47,060 --> 00:26:50,750 a pokaždé, když potřebuje nějaký další paměť, požádá operační systém pro něj 450 00:26:50,750 --> 00:26:53,670 voláním realloc. 451 00:26:53,670 --> 00:26:57,890 >> Nějaké otázky? Dobrá. 452 00:26:57,890 --> 00:26:59,270 >> Útok. 453 00:26:59,270 --> 00:27:04,060 Nyní, když jsme pochopili ukazatele nebo alespoň jsou stále obeznámeni s ukazateli, 454 00:27:04,060 --> 00:27:06,700 Pojďme zvážit, jak celý svět začne hroutit 455 00:27:06,700 --> 00:27:10,030 pokud nemáte dost bránit sporných uživatelů, 456 00:27:10,030 --> 00:27:11,850 lidé, kteří se snaží proniknout do vašeho systému, 457 00:27:11,850 --> 00:27:16,890 lidé, kteří se snaží ukrást vaše software a tím obejít nějaký registrační kód 458 00:27:16,890 --> 00:27:19,090 že by jinak mohla psát palců 459 00:27:19,090 --> 00:27:22,990 >> Podívejte se na tento příklad zde, což je jen C kód, který má funkci hlavní v dolní části 460 00:27:22,990 --> 00:27:26,380 , který volá funkci foo. A co je kolem, aby foo? 461 00:27:26,380 --> 00:27:29,680 [Student] jediný argument. >> [Malan] jediný argument. 462 00:27:29,680 --> 00:27:33,450 Takže argv [1], což znamená, že první slovo, které uživatel zadané na příkazovém řádku 463 00:27:33,450 --> 00:27:36,360 po a.out nebo cokoliv se nazývá program. 464 00:27:36,360 --> 00:27:41,680 Tak foo nahoře se v char *. Ale char * je přesně to, co? >> [Student] string. 465 00:27:41,680 --> 00:27:43,350 [Malan] řetězec, takže nic nového. 466 00:27:43,350 --> 00:27:45,420 To je řetězec libovolně se nazývá bar. 467 00:27:45,420 --> 00:27:51,430 V tomto řádku zde, char c [12], v jakési polo-technické angličtiny, co se tento řádek dělá? 468 00:27:51,430 --> 00:27:55,220 [Student] Pole - >> Array of? >> [Student] znaky. Postavy >>. 469 00:27:55,220 --> 00:27:58,870 Dej mi řadu 12 znaků. Tak bychom mohli nazvat tento vyrovnávací paměti. 470 00:27:58,870 --> 00:28:02,920 Je to odborně nazývá c, ale vyrovnávací paměť v programování znamená jen spoustu prostoru 471 00:28:02,920 --> 00:28:04,800 které si můžete dát nějaké věci dovnitř 472 00:28:04,800 --> 00:28:07,940 Pak konečně, memcpy jsme nepoužívá dříve, ale asi tušíte, co to dělá. 473 00:28:07,940 --> 00:28:10,480 Je to kopie paměti. Co to dělá? 474 00:28:10,480 --> 00:28:19,270 Je zřejmě kopíruje bar, jeho vstupní, do C, ale pouze do délky pruhu. 475 00:28:19,270 --> 00:28:24,930 Ale je tu chyba tady. >> [Student] Potřebuješ sizeof charakter. Dobře >>. 476 00:28:24,930 --> 00:28:30,860 Technicky, měli jsme opravdu strlen (bar) * sizeof (char)). To je správné. 477 00:28:30,860 --> 00:28:33,930 Ale v nejhorším případě tady, pojďme předpokládat, že to je - 478 00:28:33,930 --> 00:28:35,950 Dobře. Pak je tu dvě chyby. 479 00:28:35,950 --> 00:28:39,160 Takže sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Pojďme udělat to trochu širší. 481 00:28:41,290 --> 00:28:44,910 Takže teď je tu stále chyba, která je co? >> [Neslyšitelné Student odpověď] 482 00:28:44,910 --> 00:28:46,990 Zkontrolujte, co? >> [Student] Zkontrolujte, zda NULL. 483 00:28:46,990 --> 00:28:50,270 Měli bychom být obecně kontrola NULL, protože špatné věci se stávají 484 00:28:50,270 --> 00:28:53,200 když váš ukazatel je NULL, protože byste mohli skončit jít tam, 485 00:28:53,200 --> 00:28:57,630 a neměli byste nikdy jít na NULL dereferencing s hvězdy operátora. 486 00:28:57,630 --> 00:29:01,050 Tak to je dobře. A co jiného děláme? Logicky, je tu chyba tady taky. 487 00:29:01,050 --> 00:29:04,450 [Student] Zkontrolujte, zda argc je> = až 2. 488 00:29:04,450 --> 00:29:10,550 Tak se podívejte, pokud argc je> = 2. Dobře, takže tam tři chyby v tomto programu zde. 489 00:29:10,550 --> 00:29:16,630 Jsme nyní kontroluje, pokud uživatel skutečně zadali něco do argv [1]. Dobré. 490 00:29:16,630 --> 00:29:20,950 Takže to, co je třetí chyba? Jo. >> [Student] C nemusí být dostatečně velká. 491 00:29:20,950 --> 00:29:23,320 Dobré. Zkontrolovali jsme jeden scénář. 492 00:29:23,320 --> 00:29:29,520 My implicitně kontrolovat nekopírujte více paměti, než by došlo k překroční délky tyče. 493 00:29:29,520 --> 00:29:32,510 Takže pokud řetězec uživatel zadali, je 10 znaků, 494 00:29:32,510 --> 00:29:36,020 to říká kopírovat pouze 10 znaků. A to je v pořádku. 495 00:29:36,020 --> 00:29:39,940 Ale co když uživatel napsal ve slově na řádku jako 20-znakové slovo? 496 00:29:39,940 --> 00:29:44,900 Toto říká kopii 20 znaků z baru do čeho? 497 00:29:44,900 --> 00:29:49,750 C, jinak známá jako náš pufru, což znamená, že právě napsal dat 498 00:29:49,750 --> 00:29:52,540 na 8 byte místa, která jste nevlastníte, 499 00:29:52,540 --> 00:29:54,870 a nemáte vlastní je v tom smyslu, že jste nikdy přidělené jim. 500 00:29:54,870 --> 00:30:00,370 Tak tohle je to, co je všeobecně známo jako útok přetečení vyrovnávací paměti nebo přetečení vyrovnávací paměti útoku. 501 00:30:00,370 --> 00:30:05,580 A je to útok v tom smyslu, že v případě, že uživatel nebo program, který volá své funkce 502 00:30:05,580 --> 00:30:10,490 dělá to ve zlém úmyslu, co se vlastně bude dít dál, by mohli být docela špatné. 503 00:30:10,490 --> 00:30:12,450 >> Takže pojďme se podívat na obrázku zde. 504 00:30:12,450 --> 00:30:16,060 Tento obrázek představuje svůj stack paměti. 505 00:30:16,060 --> 00:30:19,580 Připomeňme si, že pokaždé, když volání funkce vám tento malý rámeček na zásobníku 506 00:30:19,580 --> 00:30:21,520 a pak další a pak další a další. 507 00:30:21,520 --> 00:30:24,300 A tak daleko, máme to prostě odebrané nich jako obdélníky 508 00:30:24,300 --> 00:30:26,290 buď na palubě nebo na obrazovce zde. 509 00:30:26,290 --> 00:30:30,580 Ale když se přiblížíte na jednom z těchto obdélníků, když voláte funkci foo, 510 00:30:30,580 --> 00:30:35,880 ukazuje se, že je toho víc na zásobníku uvnitř tohoto rámce v tomto obdélníku 511 00:30:35,880 --> 00:30:40,060 než jen x a y a a b, stejně jako jsme se mluvit o swapu. 512 00:30:40,060 --> 00:30:44,410 Ukazuje se, že je tu nějaké nižší úrovni podrobnosti, mezi nimi Return Address. 513 00:30:44,410 --> 00:30:49,550 Tak to dopadá, když hlavní volá foo, hlavní je informovat foo 514 00:30:49,550 --> 00:30:53,520 Jaké hlavní je adresa v paměti počítače 515 00:30:53,520 --> 00:30:57,770 protože jinak, jakmile foo se provádí provedení, jak je v tomto případě zde, 516 00:30:57,770 --> 00:31:00,830 jakmile se dostanete tento uzavřený složená závorka na konci foo, 517 00:31:00,830 --> 00:31:05,310 jak sakra se foo vědět, kde je ovládání programu má jít? 518 00:31:05,310 --> 00:31:08,970 Ukazuje se, že odpověď na tuto otázku, je v tomto červeném obdélníku zde. 519 00:31:08,970 --> 00:31:12,670 To představuje ukazatel, a to až do počítače k ​​uložení dočasně 520 00:31:12,670 --> 00:31:17,030 na tzv. zásobníku je adresa hlavní tak, že jakmile foo udělat provádění, 521 00:31:17,030 --> 00:31:21,120 počítač ví, kde a co řádek v hlavní vrátit do. 522 00:31:21,120 --> 00:31:23,940 Uloženo Frame ukazatel se týká podobně to. 523 00:31:23,940 --> 00:31:26,310 Char * bar zde představuje, co? 524 00:31:26,310 --> 00:31:31,350 Nyní je tato modrá segmentu je zde foo je rám. Co je to bar? 525 00:31:31,570 --> 00:31:35,010 Bar je jen argument k funkci foo. 526 00:31:35,010 --> 00:31:37,500 Takže teď jsme zpátky u hornin známého obrazu. 527 00:31:37,500 --> 00:31:39,850 Je tu další věci, a další rozptýlení na obrazovce, 528 00:31:39,850 --> 00:31:43,380 ale to světle modrá segmentu jen je to, co jsme byli kreslení na tabuli 529 00:31:43,380 --> 00:31:45,790 něco jako swap. To je rámec pro foo. 530 00:31:45,790 --> 00:31:51,490 A jediná věc v tom teď je bar, který je tento parametr. 531 00:31:51,490 --> 00:31:55,220 Ale co jiného by mělo být v zásobníku podle tohoto kódu zde? 532 00:31:55,220 --> 00:31:57,760 [Student] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Měli bychom také vidět 12 čtverců paměti přidělené do proměnné s názvem c, 534 00:32:02,810 --> 00:32:04,970 a opravdu máme, že na obrazovce. 535 00:32:04,970 --> 00:32:08,480 Samém vrcholu je c [0], a poté autor tohoto schématu 536 00:32:08,480 --> 00:32:11,850 neobtěžoval čerpání všech čtverců, ale skutečně existují 12 tam 537 00:32:11,850 --> 00:32:16,590 protože když se podíváte na pravém dolním rohu, c [11], pokud budete počítat od 0, je 12. jako byte. 538 00:32:16,590 --> 00:32:18,400 Ale tady je ten problém. 539 00:32:18,400 --> 00:32:22,390 V jakém směru je c roste? 540 00:32:22,390 --> 00:32:27,080 Druh shora dolů, když to začíná na vrcholu a roste na dno. 541 00:32:27,080 --> 00:32:30,110 To nevypadá jako jsme odešli sami moc dráhu tady vůbec. 542 00:32:30,110 --> 00:32:32,090 Jsme trochu maloval sebe do kouta, 543 00:32:32,090 --> 00:32:36,940 a že c [11] je správná proti baru, který je přímo proti Uložené frame pointer, 544 00:32:36,940 --> 00:32:39,960 která je přímo proti zpáteční adresa. Tam to není místo. 545 00:32:39,960 --> 00:32:42,810 Takže to, co je důsledkem pak, pokud jste zpackat 546 00:32:42,810 --> 00:32:46,500 a zkuste si přečíst 20 bajtů do 12-byte paměti? 547 00:32:46,500 --> 00:32:50,060 Pokud jsou tyto 8 dalších bytů jít? >> [Student] Inside - 548 00:32:50,060 --> 00:32:53,200 Uvnitř všechno ostatní, z nichž některé jsou super důležité. 549 00:32:53,200 --> 00:32:57,260 A to nejdůležitější, potenciálně, je červený rámeček tam, Return Address, 550 00:32:57,260 --> 00:33:03,560 protože předpokládám, že jste buď náhodně, nebo adversarially přepište tyto 4 byty, 551 00:33:03,560 --> 00:33:07,260 že ukazatel adresa, a to nejen u odpadu, ale s řadou 552 00:33:07,260 --> 00:33:09,810 , který se stane představují skutečnou adresu v paměti. 553 00:33:09,810 --> 00:33:13,880 Co je to důsledek, logicky? >> [Student] Funkce se chystá vrátit na jiné místo. 554 00:33:13,880 --> 00:33:15,250 Přesně tak. 555 00:33:15,250 --> 00:33:19,170 Když foo vrátí a hity, které rovnátka kudrnaté, program bude pokračovat 556 00:33:19,170 --> 00:33:25,060 aby se nevraceli k hlavní, že to bude návrat na cokoliv adresa je v tomto červeném poli. 557 00:33:25,060 --> 00:33:28,600 >> V případě obešly softwaru registraci, 558 00:33:28,600 --> 00:33:32,260 co když adresa, která je momentálně se vrátil k je funkce, která obvykle volána 559 00:33:32,260 --> 00:33:35,690 poté, co jste zaplatili za software a zadali vaše registrační kód? 560 00:33:35,690 --> 00:33:39,870 Můžete třídit trik počítače do nebudete zde, nýbrž bude tady. 561 00:33:39,870 --> 00:33:45,100 Nebo pokud jste opravdu chytrý, může protivník skutečně zadejte na klávesnici, například, 562 00:33:45,100 --> 00:33:50,690 není aktuální slovo, ne 20 znaků, ale předpokládám, on nebo ona skutečně Typy 563 00:33:50,690 --> 00:33:52,770 některé znaky, které představují kód. 564 00:33:52,770 --> 00:33:55,320 A to nebude C kód, je to vlastně bude znaky 565 00:33:55,320 --> 00:33:59,290 které představují binární strojový kód, 0s a 1s. 566 00:33:59,290 --> 00:34:01,290 Ale předpokládám, že to dost chytrý, aby to, že, 567 00:34:01,290 --> 00:34:06,500 nějak vložit do GetString řádku něco, co je v podstatě zkompilovaný kód, 568 00:34:06,500 --> 00:34:09,980 a poslední 4 bajty přepsat návratovou adresu. 569 00:34:09,980 --> 00:34:13,360 A co to, že adresa vstup dělat? 570 00:34:13,360 --> 00:34:18,630 Ve skutečnosti se ukládá v tomto červeném obdélníku adresu prvního bajtu pufru. 571 00:34:18,630 --> 00:34:23,070 Takže budete muset být opravdu chytrý, a to je hodně pokusů a omylů pro špatné lidi tam, 572 00:34:23,070 --> 00:34:25,639 ale pokud můžete zjistit, jak velké je toto vyrovnávací paměť je 573 00:34:25,639 --> 00:34:28,820 tak, že v posledních několika bajtů na vstupu zadat do programu 574 00:34:28,820 --> 00:34:33,540 stalo, že se rovná adresu začátku svého vyrovnávací paměti, můžete to udělat. 575 00:34:33,540 --> 00:34:39,320 Pokud říkáme normálně pozdravit a \ 0, to je to, co skončí ve vyrovnávací paměti. 576 00:34:39,320 --> 00:34:44,420 Ale když jsme chytřejší a naplníme, že vyrovnávací paměť s tím, co budeme obecně říkat útoku kódu - 577 00:34:44,420 --> 00:34:48,860 AAA, útok, útok, útok - pokud je to prostě něco, co udělá něco špatného, 578 00:34:48,860 --> 00:34:51,820 co se stane, pokud jste opravdu chytří, můžete to provést. 579 00:34:51,820 --> 00:34:58,610 V červeném poli zde je sekvence čísel - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Všimněte si, že odpovídá číslo, které je tady. 581 00:35:01,610 --> 00:35:04,430 Je to v obráceném pořadí, ale o tom až někdy jindy. 582 00:35:04,430 --> 00:35:08,140 Všimněte si, že tato zpáteční adresa byla úmyslně změněn 583 00:35:08,140 --> 00:35:12,020 rovnat adresu sem, není adresa main. 584 00:35:12,020 --> 00:35:17,500 Takže pokud ten špatný je super chytrý, on nebo ona bude zahrnovat v tomto útoku kódu 585 00:35:17,500 --> 00:35:20,930 něco jako odstranit všechny soubory uživatele, nebo zkopírovat hesla 586 00:35:20,930 --> 00:35:24,680 nebo vytvořit uživatelský účet, který pak mohu přihlásit do - vůbec nic. 587 00:35:24,680 --> 00:35:26,950 >> A to je jak nebezpečí a síla C. 588 00:35:26,950 --> 00:35:29,840 Vzhledem k tomu, že máte přístup k paměti prostřednictvím ukazatele 589 00:35:29,840 --> 00:35:32,520 a můžete tedy napsat cokoliv, co chcete do paměti počítače, 590 00:35:32,520 --> 00:35:35,080 si můžete udělat počítač dělat, co chcete 591 00:35:35,080 --> 00:35:39,550 jednoduše tím, že se skákat kolem uvnitř své vlastní paměti. 592 00:35:39,550 --> 00:35:44,650 A tak k tomuto dni tolik programů a tolik internetové stránky, které jsou ohroženy 593 00:35:44,650 --> 00:35:46,200 redukuje na lidi, kteří se výhody této. 594 00:35:46,200 --> 00:35:50,760 A to může zdát jako super sofistikované útoku, ale to není vždy začít takhle. 595 00:35:50,760 --> 00:35:53,560 Skutečností je, že to, co špatní lidé obvykle udělat, je, 596 00:35:53,560 --> 00:35:58,200 ať už je to program v příkazovém řádku nebo program, GUI nebo webové stránky, 597 00:35:58,200 --> 00:35:59,940 stačí začít poskytovat nesmysly. 598 00:35:59,940 --> 00:36:03,980 Zadáte v opravdu velkém slovo do vyhledávacího pole a stiskněte klávesu ENTER, 599 00:36:03,980 --> 00:36:05,780 a budete čekat, zda webová stránka zhroutí 600 00:36:05,780 --> 00:36:09,990 nebo počkat, zda se program projeví nějakou chybovou zprávu 601 00:36:09,990 --> 00:36:14,330 protože pokud budete mít štěstí jako padouch a poskytnout nějaké šílené vstup 602 00:36:14,330 --> 00:36:18,980 že pády programu, znamená to, že programátor nepředpokládal své špatné chování, 603 00:36:18,980 --> 00:36:23,630 což znamená, že můžete pravděpodobně dostatek úsilí, dost pokusů a omylů, 604 00:36:23,630 --> 00:36:26,650 přijít na to, jak vést přesnější útok. 605 00:36:26,650 --> 00:36:31,410 Tak jako tak součástí zabezpečení není jen vyhnout těmto útokům úplně 606 00:36:31,410 --> 00:36:34,100 ale zachytí je a vlastně se dívat na polena 607 00:36:34,100 --> 00:36:36,780 a vidět, co bláznivé vstupy mají lidé zadali do svých webových stránek, 608 00:36:36,780 --> 00:36:38,960 Co vyhledávací termíny jsou lidi napsali na svůj web 609 00:36:38,960 --> 00:36:42,870 v naději, že přetéká nějakou vyrovnávací paměti. 610 00:36:42,870 --> 00:36:45,500 A to všechno se scvrkává na jednoduchých základech toho, co je pole 611 00:36:45,500 --> 00:36:49,080 a co to znamená pro přidělování a využívání paměti. 612 00:36:49,080 --> 00:36:51,710 >> S tím souvisí pak i to je. 613 00:36:51,710 --> 00:36:54,280 Řekněme, podíval se uvnitř pevného disku ještě jednou. 614 00:36:54,280 --> 00:36:58,440 Vzpomínáte si z týden či dva před, že když přetáhnete soubory na váš recycle bin, nebo trash can, 615 00:36:58,440 --> 00:37:03,710 co se stane? >> [Student] Nothing. >> Vůbec nic, že ​​jo? 616 00:37:03,710 --> 00:37:05,740 Nakonec, pokud se dostanete nedostatek místa na disku, 617 00:37:05,740 --> 00:37:08,190 Windows nebo Mac OS začne mazat soubory pro vás. 618 00:37:08,190 --> 00:37:10,390 Ale pokud přetáhnete něco tam, že není vůbec bezpečné. 619 00:37:10,390 --> 00:37:13,800 Všechny vaše spolubydlící nebo přítel nebo člen rodiny musí udělat, je dvakrát klikněte a voila, 620 00:37:13,800 --> 00:37:16,310 tu všechny útržkovité soubory, které jste se pokusili odstranit. 621 00:37:16,310 --> 00:37:19,590 Většina z nás alespoň vím, že máte pravým tlačítkem myši nebo regulace kliknutím 622 00:37:19,590 --> 00:37:22,310 a prázdné popelnice nebo něco takového. 623 00:37:22,310 --> 00:37:25,000 Ale i pak to není úplně stačit 624 00:37:25,000 --> 00:37:28,010 protože to, co se stane, když máte soubor na pevném disku 625 00:37:28,010 --> 00:37:32,770 že reprezentuje nějaký dokument, nebo nějaký JPEG, a to představuje pevný disk, 626 00:37:32,770 --> 00:37:35,350 a řekněme, že tento kousek zde představuje tento soubor, 627 00:37:35,350 --> 00:37:38,390 a to je složeno z celé spoustu 0s a 1s. 628 00:37:38,390 --> 00:37:42,470 Co se stane, když se nejen přetáhnout tento soubor do koše nebo koše 629 00:37:42,470 --> 00:37:48,020 ale také vyprázdnit? Seřadit z ničeho. 630 00:37:48,020 --> 00:37:49,640 Není to vůbec nic teď. 631 00:37:49,640 --> 00:37:54,290 Teď je to jen proto, že nic trochu něco stane v podobě této tabulky. 632 00:37:54,290 --> 00:37:58,370 Takže tam je nějaký druh databáze nebo tabulky uvnitř paměti počítače 633 00:37:58,370 --> 00:38:03,850 že v podstatě má jeden sloupec pro soubory jmen a jeden sloupec pro soubory "místo, 634 00:38:03,850 --> 00:38:07,720 , což by mohlo být zařazení 123, jen náhodné číslo. 635 00:38:07,720 --> 00:38:14,560 Takže bychom mohli mít něco jako x.jpeg a umístění 123. 636 00:38:14,560 --> 00:38:18,800 Co se stane pak, když vyprázdnit své odpadky? 637 00:38:18,800 --> 00:38:20,330 To zmizí. 638 00:38:20,330 --> 00:38:23,610 Ale co nezmizí, je 0s a 1s. 639 00:38:23,610 --> 00:38:26,270 >> Takže to, co je pak připojení k pset4? 640 00:38:26,270 --> 00:38:31,240 No, s pset4, jen proto, že jsme omylem vymazal karty Compact Flash 641 00:38:31,240 --> 00:38:35,750 že měl všechny tyhle fotky, nebo jen proto, že smůla stal poškozen 642 00:38:35,750 --> 00:38:38,000 neznamená, že 0s a 1s nejsou tam pořád. 643 00:38:38,000 --> 00:38:40,410 Možná některé z nich jsou ztraceny, protože něco dostal poškozen 644 00:38:40,410 --> 00:38:43,320 v tom smyslu, že některé 0s stal 1s a 1s stal 0s. 645 00:38:43,320 --> 00:38:47,240 Špatné věci se může stát, protože buggy software nebo vadný hardware. 646 00:38:47,240 --> 00:38:50,370 Ale mnozí z těch kousků, možná i 100% z nich, jsou tam stále. 647 00:38:50,370 --> 00:38:55,050 Je to jen, že je počítač nebo fotoaparát neví, kde JPEG1 začala 648 00:38:55,050 --> 00:38:56,910 a kde JPEG2 začal. 649 00:38:56,910 --> 00:39:01,070 Ale pokud, programátor, vím, s trochou znalostmi, pokud tyto JPEG jsou 650 00:39:01,070 --> 00:39:06,010 nebo jak vypadají, takže můžete analyzovat 0s a 1s a říct JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 můžete napsat program s v podstatě jen pro nebo while 652 00:39:09,440 --> 00:39:12,820 , který využívá každý z těchto souborů. 653 00:39:12,820 --> 00:39:16,030 Takže lekce pak je začít bezpečně mazání souborů 654 00:39:16,030 --> 00:39:18,340 pokud byste chtěli, aby se zabránilo to úplně. Ano. 655 00:39:18,340 --> 00:39:21,010 >> [Student] Jak to, říká o vašem počítači 656 00:39:21,010 --> 00:39:23,550 že máte více paměti, než jste dělali předtím? 657 00:39:23,550 --> 00:39:27,820 Mají více paměti, než dřív a - >> [Student] Více dostupné paměti. 658 00:39:27,820 --> 00:39:29,630 Oh. Dobrá otázka. 659 00:39:29,630 --> 00:39:32,360 Tak proč potom po vyprázdnění koše se počítač říct 660 00:39:32,360 --> 00:39:34,910 že máte více volného místa, než jste dělali předtím? 661 00:39:34,910 --> 00:39:36,770 Stručně řečeno, protože lže. 662 00:39:36,770 --> 00:39:40,740 Více technicky, máte více prostoru, protože teď jste řekl 663 00:39:40,740 --> 00:39:43,680 si můžete dát další věci, kde tento soubor jednou bylo. 664 00:39:43,680 --> 00:39:45,450 Ale to neznamená, že bity jdou pryč, 665 00:39:45,450 --> 00:39:48,590 a že neznamená bity jsou změněna na všech 0s, například, 666 00:39:48,590 --> 00:39:50,150 pro vaši ochranu. 667 00:39:50,150 --> 00:39:54,640 Takže naopak, pokud si bezpečně smazat soubory nebo fyzicky zničit zařízení, 668 00:39:54,640 --> 00:39:57,300 to je opravdu jediný způsob, jak se někdy kolem toho. 669 00:39:57,300 --> 00:40:02,020 >> Tak proč bychom odjet na tomto semi-strašidelné poznámky, a uvidíme se v pondělí. 670 00:40:02,020 --> 00:40:07,000 [Potlesk] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]