1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Tjedan 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Sveučilište Harvard] 3 00:00:04,860 --> 00:00:07,260 [Ovo je CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Ovo je CS50, Tjedan 5. 5 00:00:09,740 --> 00:00:12,900 Danas i ovaj tjedan, uvodimo malo svijeta forenzike 6 00:00:12,900 --> 00:00:14,850 u kontekstu problema Set 4. 7 00:00:14,850 --> 00:00:18,480 Danas će biti skraćeno predavanje jer je poseban događaj u ovdje poslije. 8 00:00:18,480 --> 00:00:21,940 Tako ćemo zaviriti i zafrkavati oba učenicima i roditeljima podjednako danas 9 00:00:21,940 --> 00:00:24,600 s neke od stvari koje su na horizontu. 10 00:00:24,600 --> 00:00:29,050 >> Među njima, od ponedjeljka, imat ćete još nekoliko kolega iz razreda. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvard i MIT novi online inicijativa za OpenCourseWare i više, 12 00:00:32,980 --> 00:00:36,730 stiže Harvarda kampusu u ponedjeljak, što znači da dolaze ponedjeljak 13 00:00:36,730 --> 00:00:40,930 imat ćete, kao prošle računati, 86.000 dodatnih razredu 14 00:00:40,930 --> 00:00:43,680 Tko će biti slijedeći zajedno s CS50 predavanja i sekcije 15 00:00:43,680 --> 00:00:45,890 i Walkthroughs i problem setovima. 16 00:00:45,890 --> 00:00:51,870 I kao dio toga, vi ćete postati članovi nastupni klasi CS50 i sada CS50x. 17 00:00:51,870 --> 00:00:56,150 Kao dio toga sada, shvatiti da će biti nekih upsides kao dobro. 18 00:00:56,150 --> 00:01:00,620 Da biste dobili spreman za to, za veliki broj studenata, 19 00:01:00,620 --> 00:01:03,820 dovoljno je reći da iako imamo 108 TFS i CAS, 20 00:01:03,820 --> 00:01:07,560 to nije sasvim najbolji student-nastavnik omjer jednom smo pogodak 80.000 učenika. 21 00:01:07,560 --> 00:01:09,830 Nećemo se ocjenjivanje toliko problema postavlja ručno, 22 00:01:09,830 --> 00:01:13,050 tako uveo ovaj tjedan u problematiku skupa će biti CS50 Ček, 23 00:01:13,050 --> 00:01:15,410 koja će biti naredbenog retka uslužni unutar aparata 24 00:01:15,410 --> 00:01:17,880 da ćete dobiti nakon što ga ažurirati kasnije ovaj vikend. 25 00:01:17,880 --> 00:01:21,030 Vi ćete biti u mogućnosti pokrenuti naredbu, check50, na svoj pset, 26 00:01:21,030 --> 00:01:24,770 a vi ćete dobiti instant povratne informacije o tome je li vaš program je točna ili netočna 27 00:01:24,770 --> 00:01:27,980 prema raznim dizajna specifikacijama koje smo dostavili. 28 00:01:27,980 --> 00:01:30,310 Više o tome u specifikaciji problema set. 29 00:01:30,310 --> 00:01:34,220 U CS50x kolege će koristiti to kao dobro. 30 00:01:34,220 --> 00:01:36,170 >> Problem Set 4 je sve o forenzici, 31 00:01:36,170 --> 00:01:38,630 i to pset stvarno bio inspiriran nekom stvarnom životu stvari 32 00:01:38,630 --> 00:01:41,210 čemu kad sam bio u dodiplomskoj školi sam interniran za vrijeme 33 00:01:41,210 --> 00:01:45,270 s Middlesex County je Županijsko državno odvjetništvo radi forenzička rad 34 00:01:45,270 --> 00:01:47,660 sa svojim olovnim forenzičkih istražitelja. 35 00:01:47,660 --> 00:01:50,280 Što to iznosi, kao što mislim da sam spomenuo prije nekoliko tjedana prošlosti, 36 00:01:50,280 --> 00:01:52,720 je masa državne policije ili drugih će doći u, 37 00:01:52,720 --> 00:01:56,150 oni će spadati stvari poput tvrdih diskova i CD-a i diskete i slično, 38 00:01:56,150 --> 00:01:58,770 i onda cilj forenzike uredu je da se utvrdi 39 00:01:58,770 --> 00:02:01,470 postoji li ili nije bio dokaz neke vrste. 40 00:02:01,470 --> 00:02:04,730 To je bio Posebna Istrage jedinica, tako da je bijelo-okovratnik kriminala. 41 00:02:04,730 --> 00:02:10,949 To je više zabrinjavajuća vrsta zločina, uključujući sve nekakav digitalnih medija. 42 00:02:10,949 --> 00:02:16,450 Ispada da nije da su mnogi ljudi pisati e-mail govoreći, "Ja sam to učinio." 43 00:02:16,450 --> 00:02:20,490 Dakle, vrlo često, te forenzički pretražuje nije pojavio sve to puno voća, 44 00:02:20,490 --> 00:02:22,820 ali ponekad ljudi će pisati takve poruke. 45 00:02:22,820 --> 00:02:25,240 Dakle, ponekad, napori bili nagrađeni. 46 00:02:25,240 --> 00:02:31,210 >> Ali da će dovesti do ovog forenzičkih pset, mi ćemo biti uvođenje u pset4 malo grafike. 47 00:02:31,210 --> 00:02:35,410 Vi ste vjerojatno uzeti ove stvari zdravo za gotovo - JPEG GIF, i kao - ovih dana. 48 00:02:35,410 --> 00:02:38,320 Ali ako zaista misle o tome, slika, baš kao i Rob lice, 49 00:02:38,320 --> 00:02:41,270 mogao biti modeliran kao niz točkica ili piksela. 50 00:02:41,270 --> 00:02:43,380 U slučaju Rob lice, tu je sve vrste boja, 51 00:02:43,380 --> 00:02:46,760 i počeli smo vidjeti pojedine točke, inače poznat kao piksela, 52 00:02:46,760 --> 00:02:48,610 kad smo počeli uvećanje u. 53 00:02:48,610 --> 00:02:54,660 Ali ako ćemo pojednostaviti svijet malo i samo reći da je ovo ovdje je Rob u crnoj i bijeloj boji, 54 00:02:54,660 --> 00:02:57,490 za zastupanje crna i bijela, možemo samo koristiti binarni. 55 00:02:57,490 --> 00:03:01,660 A ako ćemo koristiti binarni, 1 ili 0, možemo izraziti tu istu sliku 56 00:03:01,660 --> 00:03:06,140 od Rob je nasmijano lice s ovim uzorkom bitova. 57 00:03:06,140 --> 00:03:12,100 11000011 predstavlja bijela, bijela, crna, crna, crna, crna, bijela, bijela. 58 00:03:12,100 --> 00:03:16,150 I tako da to nije veliki skok onda početi govoriti o šarenim fotografijama, 59 00:03:16,150 --> 00:03:18,600 stvari koje želite vidjeti na Facebooku ili uzeti s digitalnom kamerom. 60 00:03:18,600 --> 00:03:21,410 No, svakako, kada je riječ o bojama, trebate više bitova. 61 00:03:21,410 --> 00:03:25,690 I sasvim uobičajeno u svijetu fotografije je koristiti ne 1-bitnu boju, 62 00:03:25,690 --> 00:03:29,560 jer to sugerira, ali 24-bitna boja, gdje ste zapravo dobiti milijune boja. 63 00:03:29,560 --> 00:03:32,250 Dakle, kao u slučaju kad smo zumirani na Rob oku, 64 00:03:32,250 --> 00:03:36,370 da je bilo nekoliko milijuna različitih boja mogućnosti. 65 00:03:36,370 --> 00:03:39,040 Dakle, mi ćemo uvesti to Problem Set 4 kao u prohod, 66 00:03:39,040 --> 00:03:43,370 što će biti danas u 03:30 umjesto uobičajenog 02:30 jer petak predavanje ovdje. 67 00:03:43,370 --> 00:03:46,620 No, video će biti online kao i obično sutra. 68 00:03:46,620 --> 00:03:48,820 >> Također ćemo vas upoznati s drugom formatu. 69 00:03:48,820 --> 00:03:51,270 To namjerno je značilo da izgleda zastrašujuće na prvi, 70 00:03:51,270 --> 00:03:55,670 ali to je samo neka dokumentacija za C struct. 71 00:03:55,670 --> 00:03:58,940 Ispada da je Microsoft godina pomogao popularizirati ovaj oblik 72 00:03:58,940 --> 00:04:05,150 zove bitmapa format, BMP, i to je super jednostavna, šareni grafički format 73 00:04:05,150 --> 00:04:10,150 koji je korišten za neko vrijeme, a ponekad i dalje za pozadine na stolna računala. 74 00:04:10,150 --> 00:04:14,760 Ako mislite vratiti na Windows XP i valjanje brežuljcima i plavog neba, 75 00:04:14,760 --> 00:04:17,170 to je obično BMP ili bitmap slika. 76 00:04:17,170 --> 00:04:19,959 Bitmape su zabavna za nas, jer oni imaju malo više složenosti. 77 00:04:19,959 --> 00:04:22,610 To je ne sasvim kao jednostavan kao ovaj mrežu 0S i 1S. 78 00:04:22,610 --> 00:04:27,510 Umjesto toga, imate stvari poput zaglavlju na početku datoteke. 79 00:04:27,510 --> 00:04:31,990 Dakle, drugim riječima, unutar jedne. Bmp datoteke je cijela hrpa 0S i 1s, 80 00:04:31,990 --> 00:04:34,910 ali postoji neki dodatni 0s i 1s tamo. 81 00:04:34,910 --> 00:04:38,220 I ispada da ono što smo vjerojatno uzeti zdravo za gotovo već godinama - 82 00:04:38,220 --> 00:04:45,170 Formati sviđa. doc ili. xls ili. MP3,. mp4, bez obzira na Formati 83 00:04:45,170 --> 00:04:48,480 da ste upoznati sa - što to uopće znači biti format, 84 00:04:48,480 --> 00:04:52,480 jer na kraju dana sve te datoteke možemo koristiti imaju samo 0s i 1s. 85 00:04:52,480 --> 00:04:56,810 A možda one 0s i 1s predstavljaju ABC kroz ASCII ili slično, 86 00:04:56,810 --> 00:04:58,820 ali na kraju dana, to je još uvijek samo 0s i 1s. 87 00:04:58,820 --> 00:05:02,100 Dakle ljudi samo povremeno odlučiti da izmisle novi format datoteke 88 00:05:02,100 --> 00:05:06,420 gdje su standardizirati ono obrasci bitova će zapravo znači. 89 00:05:06,420 --> 00:05:09,220 I u ovom slučaju ovdje, i ljudi koji je dizajnirao bitmap format 90 00:05:09,220 --> 00:05:15,620 rekao je da je u prvom bajtu u bitmap datoteku, kao obilježeni pomaknuta 0 tamo, 91 00:05:15,620 --> 00:05:18,940 tamo će biti neki šifrirano ime varijabla zove bfType, 92 00:05:18,940 --> 00:05:23,080 koja samo stoji za bitmap datoteke tipa, što tip od bitmap datoteku je to. 93 00:05:23,080 --> 00:05:27,700 Možete zaključiti možda iz drugog reda koji prebijanje 2, bajt broj 2, 94 00:05:27,700 --> 00:05:33,740 ima uzorak 0S i 1S koja predstavlja što? Veličina nešto. 95 00:05:33,740 --> 00:05:35,310 I to ide od tamo. 96 00:05:35,310 --> 00:05:37,410 Tako je u Problem Set 4, vi ćete biti prošetao kroz neke od tih stvari. 97 00:05:37,410 --> 00:05:39,520 Nećemo završiti brinuti o svima njima. 98 00:05:39,520 --> 00:05:47,510 Ali primijetite da počne da se zanimljivo oko bajtu 54: rgbtBlue, zelena i crvena. 99 00:05:47,510 --> 00:05:52,110 Ako ste ikada čuli akronim RGB - crvena, zelena, plava - ovo je referenca na taj 100 00:05:52,110 --> 00:05:54,610 jer ispada da mogu slikati sve dugine boje 101 00:05:54,610 --> 00:05:58,180 s nekim kombinacija crvene i plave i zelene. 102 00:05:58,180 --> 00:06:03,320 A u stvari, roditelji u sobi mogu podsjetiti na neke od najranijih projektora. 103 00:06:03,320 --> 00:06:05,890 Ovih dana, možete vidjeti samo jedan svjetlost izlazi iz objektiva, 104 00:06:05,890 --> 00:06:09,800 ali natrag u dan ste imali crvenu leću, plavu leću, i zelenu leću, 105 00:06:09,800 --> 00:06:13,380 i zajedno su usmjerene na zaslonu i formirao šarenu sliku. 106 00:06:13,380 --> 00:06:16,270 I vrlo često, srednje škole i visoke škole će imati one leće 107 00:06:16,270 --> 00:06:19,720 uvijek je tako malo iskosa, tako da su bili svojevrsni vidim dvostruko ili trostruko slike. 108 00:06:19,720 --> 00:06:24,100 No, to je bila ideja. Imali ste crvene i zelene i plave svjetlo slikarstvo sliku. 109 00:06:24,100 --> 00:06:26,590 A taj isti princip se koristi u računalima. 110 00:06:26,590 --> 00:06:30,230 >> Dakle, među izazovima onda za vas u problemu Set 4 će biti nekoliko stvari. 111 00:06:30,230 --> 00:06:34,800 Jedan od njih je da se zapravo veličinu slike, uzeti u uzorak 0S i 1s, 112 00:06:34,800 --> 00:06:40,200 shvatiti što komade 0s i 1s predstavljaju ono što u strukturi kao što je ovaj, 113 00:06:40,200 --> 00:06:43,630 i onda shvatiti kako replicirati piksela - crvenima, Blues, zeleni - 114 00:06:43,630 --> 00:06:46,660 unutar tako da kad slika izgleda ovako početku, 115 00:06:46,660 --> 00:06:49,210 to bi moglo izgledati ovako umjesto nakon toga. 116 00:06:49,210 --> 00:06:53,640 Među ostalim izazovima previše će biti da ćete se predati forenzičke sliku 117 00:06:53,640 --> 00:06:56,030 od stvarne datoteke iz digitalnog fotoaparata. 118 00:06:56,030 --> 00:06:58,960 I na tom kamerom, nekada davno, bili su cijela hrpa fotografija. 119 00:06:58,960 --> 00:07:03,760 Problem je što slučajno izbrisani ili su slika korumpiran nekako. 120 00:07:03,760 --> 00:07:05,750 Loše stvari se dogoditi s digitalnim kamerama. 121 00:07:05,750 --> 00:07:09,150 I tako smo brzo kopirati sve 0s i 1s isključen te kartice za vas, 122 00:07:09,150 --> 00:07:13,610 spasio ih sve u jednu veliku datoteku, a onda ćemo ih predati tebi u problemu Set 4 123 00:07:13,610 --> 00:07:19,320 tako da možete napisati program u C s kojima se oporavim sve one JPEG, idealno. 124 00:07:19,320 --> 00:07:23,330 A što se ispostavilo da je JPEG, iako su oni nešto složenog formatu - 125 00:07:23,330 --> 00:07:26,360 oni su puno složeniji nego ove nasmijano lice ovdje - 126 00:07:26,360 --> 00:07:31,160 ispada da je svaki JPEG počinje s istim uzorcima 0S i 1S. 127 00:07:31,160 --> 00:07:35,630 Dakle, koristeći, u konačnici, while petlja ili za petlje ili slično, 128 00:07:35,630 --> 00:07:38,880 možete ponoviti preko svega 0s i 1s u ovom forenzičke sliku, 129 00:07:38,880 --> 00:07:43,150 i svaki put kad vidim poseban uzorak koji je definiran u specifikaciji problema set, 130 00:07:43,150 --> 00:07:47,880 možete preuzeti ovdje, s vrlo visokom vjerojatnošću, početak JPEG. 131 00:07:47,880 --> 00:07:51,230 A čim vam istom obrascu neki broj bajtova 132 00:07:51,230 --> 00:07:55,430 ili kilobajta ili megabajta kasnije, možete pretpostaviti ovdje je drugi JPEG, 133 00:07:55,430 --> 00:07:57,380 slika Uzeo sam nakon prvog. 134 00:07:57,380 --> 00:08:01,370 Dopustite mi prestati čitati tu prvu sliku, počnite pisati ovu novu, 135 00:08:01,370 --> 00:08:06,310 i izlaz vašeg programa za pset4 će biti onoliko koliko 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 A ako to nije 50 JPEG, imate malo petlje. 137 00:08:09,270 --> 00:08:12,490 Ako imate beskonačan broj JPEG, imate beskonačnu petlju. 138 00:08:12,490 --> 00:08:14,910 Tako da će također biti vrlo čest slučaj. 139 00:08:14,910 --> 00:08:16,600 Tako da je ono što je na horizontu. 140 00:08:16,600 --> 00:08:21,310 >> Kviz 0 iza nas, ostvariti po moju e-mail da uvijek postoje ljudi koji su oboje sretni, 141 00:08:21,310 --> 00:08:23,640 vrsta neutralne, i tužno oko kviza 0 vremena. 142 00:08:23,640 --> 00:08:26,800 I nemojte doprijeti do mene, glava TF Zamyla, svoj TF, 143 00:08:26,800 --> 00:08:31,180 ili jedan od CA da znate ako želite razgovarati o tome kako su stvari išle. 144 00:08:31,180 --> 00:08:35,539 >> Tako da impresionirati roditelje ovdje u sobi, što je CS50 knjižnica? 145 00:08:36,429 --> 00:08:40,390 [Smijeh] Dobar posao. 146 00:08:40,390 --> 00:08:48,340 Što je CS50 knjižnica? Da. >> [Student] To je unaprijed napisani skup koda [nečujan] 147 00:08:48,340 --> 00:08:49,750 Dobro, dobro. 148 00:08:49,750 --> 00:08:53,240 To je unaprijed napisani skup koda koji smo osoblje pisao, pružamo vama, 149 00:08:53,240 --> 00:08:55,030 koja pruža neke zajedničke funkcije, 150 00:08:55,030 --> 00:08:59,020 stvari poput daj mi niz, me int - sve funkcije koje su ovdje navedene. 151 00:08:59,020 --> 00:09:02,260 >> Počevši sada, možemo početi stvarno uzeti ove obuke kotača off. 152 00:09:02,260 --> 00:09:05,050 Mi ćemo početi da odnese niz od tebe, 153 00:09:05,050 --> 00:09:08,870 koja opoziv bio samo sinonim za ono što stvarni podaci putovanja? >> [Više studenata] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Za roditelje, koji je vjerojatno bio [čini whooshing zvuk]. To je dobro. 155 00:09:12,730 --> 00:09:17,550 Char * počet ćemo vidjeti na ekranu sve više kao što smo uklonili niz od našeg vokabulara, 156 00:09:17,550 --> 00:09:19,730 barem kad je u pitanju zapravo pisanje koda. 157 00:09:19,730 --> 00:09:22,840 Isto tako, mi ćemo prestati koristiti neke od tih funkcija koliko 158 00:09:22,840 --> 00:09:25,280 jer su naši programi će dobiti sofisticiraniji. 159 00:09:25,280 --> 00:09:28,480 Umjesto samo pisati programe koji sjede tamo sa brz treperi, 160 00:09:28,480 --> 00:09:31,870 čeka korisnika upisati nešto u ćete dobiti svoje inpute od drugdje. 161 00:09:31,870 --> 00:09:35,490 Na primjer, da ćete ih dobiti od niza bitova na lokalnom tvrdom disku. 162 00:09:35,490 --> 00:09:38,580 Umjesto toga ću ih dobiti u budućnosti iz mrežne veze, 163 00:09:38,580 --> 00:09:40,230 neke web stranice negdje. 164 00:09:40,230 --> 00:09:44,110 >> Tako ćemo guliti natrag taj sloj po prvi put i podići CS50 aparati 165 00:09:44,110 --> 00:09:49,010 i ovu sliku nazvao cs50.h, koji ste bili # uključujući tjedna, 166 00:09:49,010 --> 00:09:51,140 ali budimo zapravo vidjeti što je unutar toga. 167 00:09:51,140 --> 00:09:54,430 Na vrhu datoteke u plavom je samo cijela hrpa komentara: 168 00:09:54,430 --> 00:09:57,050 Informacije o jamstvu i licenciranje. 169 00:09:57,050 --> 00:09:59,050 To je neka vrsta zajedničkog paradigme u softveru 170 00:09:59,050 --> 00:10:01,580 jer puno softvera ovih dana je ono što se zove open source, 171 00:10:01,580 --> 00:10:05,220 što znači da je netko napisao kod i napravio je slobodno dostupan 172 00:10:05,220 --> 00:10:10,470 ne samo pokrenuti i koristiti, ali da se zapravo čitati i mijenjati i integriraju u svoj rad. 173 00:10:10,470 --> 00:10:14,660 Dakle, to je ono što ste koristili, open source softvera, iako u vrlo malom obliku. 174 00:10:14,660 --> 00:10:18,560 Ako sam se pomaknite prema dolje prošlosti komentarima, iako ćemo početi vidjeti neke više poznate stvari. 175 00:10:18,560 --> 00:10:25,010 Obavijest na vrhu ovdje da cs50.h datoteka uključuje hrpu zaglavlja datoteka. 176 00:10:25,010 --> 00:10:28,560 Većina od njih, mi nismo vidjeli prije, ali jedan je poznato. 177 00:10:28,560 --> 00:10:32,270 Koja od njih smo vidjeli, iako kratko, tako daleko? >> [Student] Standardni knjižnica. 178 00:10:32,270 --> 00:10:35,810 Da, standardna biblioteka. stdlib.h ima malloc. 179 00:10:35,810 --> 00:10:38,320 Nakon što smo počeli govoriti o dinamičke memorije raspodjele, 180 00:10:38,320 --> 00:10:41,650 koje ćemo se vratiti sljedeći tjedan kao dobro, počeli smo uključujući tu datoteku. 181 00:10:41,650 --> 00:10:46,640 Ispada da bool i pravi i lažni zapravo ne postoji u C po sebi 182 00:10:46,640 --> 00:10:49,440 osim ako su ovu datoteku ovdje. 183 00:10:49,440 --> 00:10:52,710 Mi smo tjednima bili uključujući stdbool.h 184 00:10:52,710 --> 00:10:55,620 tako da možete koristiti pojam bool, istinita ili lažna. 185 00:10:55,620 --> 00:10:58,620 Bez toga, da će morati izdvojiti od lažni njega i koristiti int 186 00:10:58,620 --> 00:11:02,610 i samo proizvoljno pretpostaviti da je lažna 0 i 1 je istina. 187 00:11:02,610 --> 00:11:07,150 Ako mi se pomaknite prema dolje i dalje, ovdje je naša definicija niza. 188 00:11:07,150 --> 00:11:11,390 Ispada, kao što smo već rekli, da kada ova zvijezda je zapravo ne smeta. 189 00:11:11,390 --> 00:11:13,720 Možete čak imati prostor sve oko sebe. 190 00:11:13,720 --> 00:11:16,740 Mi to semestar su ga promovira kao da je to jasno 191 00:11:16,740 --> 00:11:18,620 da zvijezda ima veze s tipom, 192 00:11:18,620 --> 00:11:21,700 ali shvatite samo kao zajedničko, ako ne i malo više zajedničkog, 193 00:11:21,700 --> 00:11:24,430 je da ga je tamo stavio, ali funkcionalno je ista stvar. 194 00:11:24,430 --> 00:11:27,720 Ali sada, ako čitamo dolje dalje, ajmo pogledati GetInt 195 00:11:27,720 --> 00:11:32,190 jer mi se da je možda prije nego bilo što drugo ovaj semestar. 196 00:11:32,190 --> 00:11:37,440 Ovdje je GetInt. To je ono što? >> [Student] prototip. >> To je samo prototip. 197 00:11:37,440 --> 00:11:41,410 Često smo stavili prototipove na vrhovima naših. C datoteke, 198 00:11:41,410 --> 00:11:46,690 ali također možete staviti prototipove u zaglavlju datoteke,. h datoteke, kao što je ovaj jedan ovdje 199 00:11:46,690 --> 00:11:50,840 tako da kada pišete neke funkcije koje želite ostali ljudi biti u mogućnosti koristiti, 200 00:11:50,840 --> 00:11:53,550 koji je upravo slučaj s CS50 knjižnici, 201 00:11:53,550 --> 00:11:57,040 ne samo provoditi svoje funkcije u nešto poput cs50.c, 202 00:11:57,040 --> 00:12:02,790 također staviti prototipa nije na vrhu tog spisa, ali na vrhu datoteke zaglavlja. 203 00:12:02,790 --> 00:12:07,170 Zatim da header datoteka je ono što prijatelji i kolege su 204 00:12:07,170 --> 00:12:09,760 s # uključiti u vlastitom kodu. 205 00:12:09,760 --> 00:12:12,210 Dakle, sve ovo vrijeme, bio si uključujući sve ove prototipova, 206 00:12:12,210 --> 00:12:16,580 učinkovito na vrhu svoje datoteke, ali na način ovo # include mehanizam, 207 00:12:16,580 --> 00:12:20,070 koji bitno primjeraka i paste ovu sliku na svoj vlastiti. 208 00:12:20,070 --> 00:12:23,070 Ovdje je neke prilično detaljan dokumentacija. 209 00:12:23,070 --> 00:12:25,640 Mi smo prilično mnogo uzeti zdravo za gotovo da GetInt dobiva int, 210 00:12:25,640 --> 00:12:27,640 ali ispada postoje neki kutak slučajevi. 211 00:12:27,640 --> 00:12:31,810 Što ako korisnik upiše u nizu koji je način prevelika, quintillion, 212 00:12:31,810 --> 00:12:35,490 samo da se ne može stati unutar int? Što je očekivano ponašanje? 213 00:12:35,490 --> 00:12:38,020 U idealnom slučaju, to je predvidljiva. 214 00:12:38,020 --> 00:12:40,280 Dakle, u ovom slučaju, ako zapravo pročitate fine print, 215 00:12:40,280 --> 00:12:44,500 zapravo ćete vidjeti da li linija ne može pročitati, ovaj vraća INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Nikada nismo razgovarali o tome, ali na temelju svoje kapitalizacije, što je to vjerojatno? 217 00:12:48,320 --> 00:12:50,640 [Student] konstanta. >> To je konstanta. 218 00:12:50,640 --> 00:12:54,770 To je neka posebna konstanta koja je vjerojatno proglasio u jednoj od tih zaglavlja datoteka 219 00:12:54,770 --> 00:13:00,090 da je gore veći u spisu, a INT_MAX je vjerojatno nešto poput otprilike dvije milijarde, 220 00:13:00,090 --> 00:13:04,990 Ideja je da zato moramo nekako označi da je nešto pošlo po zlu, 221 00:13:04,990 --> 00:13:10,700 mi, da, ima četiri milijarde brojeve na raspolaganju: -2000000000 na do 2 milijarde, dati ili uzeti. 222 00:13:10,700 --> 00:13:14,710 Pa, ono što je zajedničko u programiranju je li ukrasti samo jednog od tih brojeva, 223 00:13:14,710 --> 00:13:18,920 možda 0, možda 2000000000, možda -2000000000, 224 00:13:18,920 --> 00:13:23,280 tako što ćete potrošiti jedan od vaših mogućih vrijednosti, tako da možete obvezati na svijetu 225 00:13:23,280 --> 00:13:26,820 da, ako nešto pođe po zlu, ja ću se vratiti ovaj super veliku vrijednost. 226 00:13:26,820 --> 00:13:31,030 Ali vi ne želite korisnički tipkati nešto grobni kao 234 ..., stvarno velik broj. 227 00:13:31,030 --> 00:13:34,060 Možete ga generalizirati, umjesto kao konstanta. 228 00:13:34,060 --> 00:13:38,060 Pa stvarno, ako su se analni posljednjih nekoliko tjedana, svaki put kad se zove GetInt, 229 00:13:38,060 --> 00:13:42,900 trebali su provjere s ako uvjet nije korisničkog tip u INT_MAX, 230 00:13:42,900 --> 00:13:46,590 ili, točnije, učinio GetInt povratnu INT_MAX, jer ako je to učinio, 231 00:13:46,590 --> 00:13:51,830 to zapravo znači da to nije tip. Nešto je pošlo po krivu u ovom slučaju. 232 00:13:51,830 --> 00:13:56,080 Dakle, to je ono što je općenito poznat kao sentinel vrijednosti, što samo znači posebna. 233 00:13:56,080 --> 00:13:58,120 >> Ajmo sad okrenuti u. C datoteci. 234 00:13:58,120 --> 00:14:01,340 C Datoteka je postojala u aparatu za neko vrijeme. 235 00:14:01,340 --> 00:14:06,840 A u stvari, aparat ima već sastavio za vas u toj stvari mi se zove objektnog koda, 236 00:14:06,840 --> 00:14:09,540 ali to jednostavno nije bitno za vas gdje je to jer sustav ne zna 237 00:14:09,540 --> 00:14:11,730 u ovom slučaju gdje je: aparat. 238 00:14:11,730 --> 00:14:17,400 Ajmo pomaknite se dolje sada GetInt i vidjeti kako GetInt je radio sve ovo vrijeme. 239 00:14:17,400 --> 00:14:19,460 Ovdje imamo slične komentare od prije. 240 00:14:19,460 --> 00:14:21,660 Dopustite mi povećali samo kod dijela. 241 00:14:21,660 --> 00:14:23,900 A ono što imamo za GetInt je sljedeće. 242 00:14:23,900 --> 00:14:25,700 To ne preuzima ulaz. 243 00:14:25,700 --> 00:14:29,510 To vraća int, dok je (istina), pa smo namjerno beskonačnu petlju, 244 00:14:29,510 --> 00:14:33,180 ali vjerojatno ćemo break out to nekako ili se vratiti u roku od ovoga. 245 00:14:33,180 --> 00:14:34,870 >> Idemo vidjeti kako to funkcionira. 246 00:14:34,870 --> 00:14:39,240 Čini se da smo se pomoću GetString u ovoj prvoj liniji unutar petlje, 166. 247 00:14:39,240 --> 00:14:43,780 Ovo je sada dobra praksa, jer pod kojim okolnostima mogao vratiti GetString 248 00:14:43,780 --> 00:14:47,660 posebna ključna NULL? >> [Student] Ako nešto pođe po zlu. 249 00:14:47,660 --> 00:14:51,630 Ako nešto pođe po zlu. A što bi moglo poći po zlu kada nazovete nešto poput GetString? 250 00:14:54,960 --> 00:14:57,640 Da. >> [Student] malloc ne dati ga na Ints. 251 00:14:57,640 --> 00:14:59,150 Da. Možda malloc ne uspije. 252 00:14:59,150 --> 00:15:03,190 Negdje ispod haube, GetString zove malloc, koja alocira memoriju, 253 00:15:03,190 --> 00:15:06,020 što omogućuje računala dućan sve znakove 254 00:15:06,020 --> 00:15:07,750 da korisnik upiše u tipkovnici. 255 00:15:07,750 --> 00:15:11,590 I pretpostavljam korisnik imao puno slobodnog vremena i upisali više, na primjer, 256 00:15:11,590 --> 00:15:16,160 od 2 milijarde znakova u, više znakova nego računalo ima čak RAM-a. 257 00:15:16,160 --> 00:15:19,250 GetString mora biti u mogućnosti da znači da s vama. 258 00:15:19,250 --> 00:15:22,560 Čak i ako je to super, super neuobičajeno kutak slučaj, 259 00:15:22,560 --> 00:15:24,340 to mora nekako biti u mogućnosti da obrađuju ovu, 260 00:15:24,340 --> 00:15:28,750 i tako GetString, ako smo se vratili i čitati njegovu dokumentaciju, ne zapravo povratak NULL. 261 00:15:28,750 --> 00:15:34,460 Pa sad, ako ne uspije GetString po povratku NULL, GetInt će uspjeti po povratku INT_MAX 262 00:15:34,460 --> 00:15:37,690 baš kao stražar. Ovo su samo ljudska konvencija. 263 00:15:37,690 --> 00:15:41,450 Jedini način da bi znali je to slučaj čitajući dokumentaciju. 264 00:15:41,450 --> 00:15:45,040 >> Ajmo pomaknite se dolje do mjesta gdje int zapravo stečen. 265 00:15:45,040 --> 00:15:51,160 Ako sam pomaknite se dolje malo dalje, u skladu 170, imamo komentar iznad ovih redaka. 266 00:15:51,160 --> 00:15:55,100 Izjavljujemo 172 int, n, i char, C, a zatim ova nova funkcije, 267 00:15:55,100 --> 00:15:58,930 što neki od vas su nabasali prije, sscanf. 268 00:15:58,930 --> 00:16:00,870 To je kratica za gudački scanf. 269 00:16:00,870 --> 00:16:05,700 Drugim riječima, daj mi niz i ja ću ga skenirati za dijelove informacije interesa. 270 00:16:05,700 --> 00:16:07,360 Što to znači? 271 00:16:07,360 --> 00:16:11,800 Pretpostavimo da sam upisati, doslovno, 123 na tipkovnici, a zatim pritisnite Enter. 272 00:16:11,800 --> 00:16:16,470 Što je tip podataka od 123, kada se vratio po GetString? >> [Student] Gudački. 273 00:16:16,470 --> 00:16:18,380 To je očito niz, zar ne? Dobio sam niz. 274 00:16:18,380 --> 00:16:23,220 Dakle, 123 je stvarno, citiram-završiti citat, 123 s \ 0 na kraju njega. 275 00:16:23,220 --> 00:16:27,110 To nije int. To nije broj. To izgleda kao broj, ali to je zapravo nije. 276 00:16:27,110 --> 00:16:29,080 Dakle, ono što ne GetInt morati učiniti? 277 00:16:29,080 --> 00:16:35,750 To je skenirati taj niz lijeva na desno - 123 \ 0 - i nekako pretvoriti u stvarni cijeli. 278 00:16:35,750 --> 00:16:37,850 Ti bi mogao shvatiti kako to učiniti. 279 00:16:37,850 --> 00:16:41,450 Ako mislite natrag pset2, što vjerojatno dobio malo ugodno s Cezarom 280 00:16:41,450 --> 00:16:44,820 ili Vigenere, tako da možete ponoviti preko niza, možete pretvoriti znakova da Ints. 281 00:16:44,820 --> 00:16:46,710 Ali dovraga, to je puno posla. 282 00:16:46,710 --> 00:16:49,860 Zašto ne pozvati funkciju kao sscanf koji radi za vas? 283 00:16:49,860 --> 00:16:54,230 Dakle sscanf očekuje argument - u ovom slučaju zove linija, koja je niz. 284 00:16:54,230 --> 00:17:01,840 Nakon toga odrediti u navodnike, vrlo slična printf, što očekujete da ćete vidjeti u ovom nizu. 285 00:17:01,840 --> 00:17:09,000 I ono što ja govorim ovdje je da očekujem da vidim decimalni broj, a možda i karakter. 286 00:17:09,000 --> 00:17:12,000 A vidjet ćemo zašto je to slučaj u samo trenutak. 287 00:17:12,000 --> 00:17:15,869 I ispada da je ova notacija je sada podsjeća stvari smo počeli govoriti o 288 00:17:15,869 --> 00:17:17,619 nešto više od tjedan dana. 289 00:17:17,619 --> 00:17:21,740 Što je & n i c & radiš za nas ovdje? >> [Student] Adresa n i adresa c. 290 00:17:21,740 --> 00:17:25,400 Da. To je što su mi dali adresu n i adresa c. Zašto je to važno? 291 00:17:25,400 --> 00:17:30,220 Vi znate da je sa funkcije u C, uvijek se možete vratiti vrijednost ili nema vrijednost na sve. 292 00:17:30,220 --> 00:17:34,530 Možete se vratiti int, string, float, char, štogod, ili možete vratiti prazninu, 293 00:17:34,530 --> 00:17:38,030 ali samo mogu vratiti jednu stvar maksimalno. 294 00:17:38,030 --> 00:17:42,760 No, ovdje želimo sscanf me vratiti možda je int, decimalni broj, 295 00:17:42,760 --> 00:17:46,220 i char, a ja ću objasniti zašto char u trenutku. 296 00:17:46,220 --> 00:17:51,460 Vi učinkovito želite sscanf vratiti dvije stvari, ali to jednostavno nije moguće u C. 297 00:17:51,460 --> 00:17:55,200 Možete raditi oko koje prolazi u dvije adrese 298 00:17:55,200 --> 00:17:57,370 jer čim predati funkciju dvije adrese, 299 00:17:57,370 --> 00:18:00,470 što može da funkcija učiniti s njima? >> [Student] Pišite tim adresama. 300 00:18:00,470 --> 00:18:02,010 To može pisati tim adresama. 301 00:18:02,010 --> 00:18:05,770 Možete koristiti operaciju zvijezda i otići tamo, da svaki od tih adresa. 302 00:18:05,770 --> 00:18:11,260 To je vrsta ovog leđa vrata mehanizam, ali vrlo uobičajena za promjenu vrijednosti varijabli 303 00:18:11,260 --> 00:18:14,870 više nego samo na jednom mjestu - u ovom slučaju, dva. 304 00:18:14,870 --> 00:18:21,340 Sada primijetite sam provjeru == 1, a zatim se vraćaju n ako to ne, u stvari, ocjenjuje da istinito. 305 00:18:21,340 --> 00:18:26,170 Dakle, što se događa? Tehnički, svi smo stvarno želite da se dogodi u GetInt je to. 306 00:18:26,170 --> 00:18:30,740 Želimo analizirati, da se tako izrazim, želimo pročitati niz - citat-završiti citat 123 - 307 00:18:30,740 --> 00:18:34,560 i ako to izgleda kao da je broj postoji, ono što smo reći sscanf učiniti 308 00:18:34,560 --> 00:18:38,190 stavi taj broj - 123 - u ova varijabla n za mene. 309 00:18:38,190 --> 00:18:42,090 Pa zašto onda sam zapravo imaju to kao dobro? 310 00:18:42,090 --> 00:18:48,220 Što je uloga sscanf rekavši također moglo dobiti karakter ovdje? 311 00:18:48,220 --> 00:18:53,470 [Nečujno odgovor učenik] >> decimalna točka zapravo mogao raditi. 312 00:18:53,470 --> 00:18:56,330 Ajmo držite da misli na trenutak. Što još? 313 00:18:56,330 --> 00:18:59,270 [Student] To bi mogla biti NULL. >> Dobra misao. To bi mogao biti znak praznoga. 314 00:18:59,270 --> 00:19:01,660 To je zapravo nije u ovom slučaju. Da. >> [Student] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Ili neka mi generalizirati čak i dalje. 316 00:19:04,340 --> 00:19:06,640 % C je samo za provjere pogreške. 317 00:19:06,640 --> 00:19:09,300 Mi ne želimo da postoji lik nakon broja, 318 00:19:09,300 --> 00:19:11,870 ali što to mi omogućuje da učiniti je sljedeće. 319 00:19:11,870 --> 00:19:18,210 Ispada da sscanf, osim pohranjivanja vrijednosti u n i c u ovom primjeru ovdje, 320 00:19:18,210 --> 00:19:24,890 ono što također ne je to vraća broj varijabli to staviti vrijednosti u. 321 00:19:24,890 --> 00:19:30,260 Dakle, ako ste samo upisati 123, onda samo% d ide na utakmicu, 322 00:19:30,260 --> 00:19:33,880 i samo n dobiva pohranjena u vrijednosti poput 123, 323 00:19:33,880 --> 00:19:35,640 i ništa ne dobiva staviti u c. 324 00:19:35,640 --> 00:19:37,620 C ostaje smeće vrijednost, da se tako izrazim - 325 00:19:37,620 --> 00:19:40,730 smeće, jer to nitko nikada nije inicijalizirana na neke vrijednosti. 326 00:19:40,730 --> 00:19:45,520 Dakle, u tom slučaju, sscanf vraća jedan jer sam naseljena jedan od tih pokazivača, 327 00:19:45,520 --> 00:19:50,190 u kojem slučaju super, imam int pa sam osloboditi liniju osloboditi memoriju 328 00:19:50,190 --> 00:19:54,000 da GetString zapravo namijenjen, a onda sam se vratiti n, 329 00:19:54,000 --> 00:19:58,500 drugo, ako ste se ikad pitali gdje da Ponoviti izjava dolazi, ona dolazi iz upravo ovdje. 330 00:19:58,500 --> 00:20:04,390 Dakle, ako, s druge strane, ja upisati u 123foo - samo su neki slučajni slijed teksta - 331 00:20:04,390 --> 00:20:08,490 sscanf će vidjeti broj, broj, broj, F, 332 00:20:08,490 --> 00:20:16,410 i to će staviti 123 u n; to će staviti f u c, a zatim se vratiti dva. 333 00:20:16,410 --> 00:20:20,640 Dakle, imamo, samo pomoću osnovnu definiciju sscanf ponašanja, vrlo jednostavan način - 334 00:20:20,640 --> 00:20:23,900 dobro, kompleks na prvi pogled, ali na kraju dana prilično jednostavan mehanizam - 335 00:20:23,900 --> 00:20:28,320 govoreći postoji int i ako je tako, da je jedina stvar koju sam našao? 336 00:20:28,320 --> 00:20:29,860 I ovdje je razmak namjerno. 337 00:20:29,860 --> 00:20:34,000 Ako ste pročitali dokumentaciju za sscanf, to vam govori da ako su komad razmakom 338 00:20:34,000 --> 00:20:38,810 na početku ili na kraju, sscanf će također omogućiti korisniku, iz bilo kojeg razloga, 339 00:20:38,810 --> 00:20:41,860 pogoditi 123 razmaknicu i da će biti legitimna. 340 00:20:41,860 --> 00:20:44,150 Nećete vikati na korisnika samo zato što su hit razmaknicu 341 00:20:44,150 --> 00:20:48,640 na početku ili na kraju, što je samo malo više user-friendly. 342 00:20:48,640 --> 00:20:52,300 >> Sva pitanja onda na GetInt? Da. >> [Student] Što ako samo stavi u char? 343 00:20:52,300 --> 00:20:54,030 Dobro pitanje. 344 00:20:54,030 --> 00:20:59,890 Što ako samo upisali u char kao f i pritisnite Enter bez tipkanja 123? 345 00:20:59,890 --> 00:21:02,420 Što mislite ponašanje ove linije koda će onda biti? 346 00:21:02,420 --> 00:21:04,730 [Nečujno učenik odgovor] 347 00:21:04,730 --> 00:21:08,790 Da, tako sscanf mogu pokriti previše, jer u tom slučaju, to se neće ispuniti N ili C. 348 00:21:08,790 --> 00:21:15,310 To će se, umjesto vratiti 0, u kojem slučaju ja sam također uhvatiti taj scenarij 349 00:21:15,310 --> 00:21:18,750 jer očekivana vrijednost želim je jednog. 350 00:21:18,750 --> 00:21:22,000 Želim samo jedna i samo jedna stvar biti popunjena. Dobro pitanje. 351 00:21:22,000 --> 00:21:24,290 >> Drugi? U redu. 352 00:21:24,290 --> 00:21:26,250 >> Nemojmo proći kroz sve funkcije u ovdje, 353 00:21:26,250 --> 00:21:29,500 ali onaj koji čini se da je možda od preostalih interesa GetString 354 00:21:29,500 --> 00:21:32,790 jer ispada da GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 sve čamac puno njihove funkcionalnosti na GetString. 356 00:21:36,260 --> 00:21:39,750 Dakle, neka je pogledati kako se on provodi ovdje. 357 00:21:39,750 --> 00:21:43,630 Ovaj jedan izgleda malo kompleksa, ali koristi iste osnove 358 00:21:43,630 --> 00:21:45,670 da smo počeli govoriti o prošlog tjedna. 359 00:21:45,670 --> 00:21:49,490 U GetString, koja ne uzima argumente po praznini ovdje 360 00:21:49,490 --> 00:21:53,730 i vraća niz, ja sam očito proglašenja niz zove tampon. 361 00:21:53,730 --> 00:21:56,270 Ja stvarno ne znam što da će se koristiti za još, ali vidjet ćemo. 362 00:21:56,270 --> 00:21:58,390 Izgleda kapacitet je po defaultu 0. 363 00:21:58,390 --> 00:22:01,350 Nije sasvim siguran gdje je to ide, ne znam što je n će se koristiti za još, 364 00:22:01,350 --> 00:22:03,590 ali sada to je sve malo više zanimljiv. 365 00:22:03,590 --> 00:22:06,520 U skladu 243, izjavljujemo int, c. 366 00:22:06,520 --> 00:22:08,800 To je neka vrsta glupe detalje. 367 00:22:08,800 --> 00:22:15,820 Char je 8 bita, a 8 bita može pohraniti koliko različite vrijednosti? >> [Student] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Problem je ako želite imati 256 različitih ASCII znakova koji se nalaze 369 00:22:20,730 --> 00:22:23,340 ako mislite natrag - i to nije nešto zapamtiti. 370 00:22:23,340 --> 00:22:25,710 No, ako se sjetim tog velikog ASCII tablici smo imali tjedana prije, 371 00:22:25,710 --> 00:22:30,600 bilo je u tom slučaju 128 ili 256 ASCII znakova. 372 00:22:30,600 --> 00:22:32,940 Koristili smo sve obrasce 0s i 1s gore. 373 00:22:32,940 --> 00:22:36,210 To je problem, ako želite biti u mogućnosti da otkrije pogrešku 374 00:22:36,210 --> 00:22:40,190 jer ako već koristite 256 vrijednosti za svoje likove, 375 00:22:40,190 --> 00:22:43,050 nisi stvarno planirati unaprijed jer sada nemate način govoreći, 376 00:22:43,050 --> 00:22:46,270 ovo nije čitljiv karakter, ovo je neka pogrešna poruka. 377 00:22:46,270 --> 00:22:50,270 Dakle, ono što svijet čini se oni koriste sljedeći najveća vrijednost, nešto poput int, 378 00:22:50,270 --> 00:22:54,720 tako da imate ludu broj bita, 32, za četiri milijarde mogućih vrijednosti 379 00:22:54,720 --> 00:22:58,860 tako da možete jednostavno završiti koristeći suštini 257 od njih, 380 00:22:58,860 --> 00:23:01,720 1 koji ima neke posebno značenje kao pogreška. 381 00:23:01,720 --> 00:23:03,120 >> Dakle, neka je vidjeti kako se to radi. 382 00:23:03,120 --> 00:23:07,760 U skladu 246, imam tu veliku while petlja koja se poziva fgetc, 383 00:23:07,760 --> 00:23:11,090 f značenje datoteku, tako getc, a zatim STDIN. 384 00:23:11,090 --> 00:23:15,520 Ispada ovo je samo precizniji način govoreći pročitati ulaz s tipkovnice. 385 00:23:15,520 --> 00:23:19,300 Standardni ulaz znači tipkovnica, standardni izlaz znači zaslon, 386 00:23:19,300 --> 00:23:23,310 i standardna pogreška, što ćemo vidjeti u pset4, znači zaslon 387 00:23:23,310 --> 00:23:27,490 ali poseban dio zaslona, ​​tako da to nije conflated sa stvarnim izlaz 388 00:23:27,490 --> 00:23:30,750 da li namjerava ispisati. Ali više o tome u budućnosti. 389 00:23:30,750 --> 00:23:34,440 Dakle fgetc samo znači pročitati jedan lik iz tipkovnice i pohraniti ga gdje? 390 00:23:34,440 --> 00:23:37,350 Čuvajte ga u c. 391 00:23:37,350 --> 00:23:41,360 I onda provjeriti - pa ja sam samo pomoću nekih Boolean veznici ovdje - 392 00:23:41,360 --> 00:23:46,000 provjerite da nije jednaka - \ n, tako da korisnik pritisnite Enter, želimo zaustaviti u tom trenutku, 393 00:23:46,000 --> 00:23:49,850 kraj petlje - i mi također želimo provjeriti za posebne stalnom EOF, 394 00:23:49,850 --> 00:23:53,610 što ako znate ili pogoditi, što to stajati? >> [Student] Kraj spisa. >> Kraj spisa. 395 00:23:53,610 --> 00:23:56,560 To je vrsta besmisleno, jer ako sam tipkati na tipkovnici, 396 00:23:56,560 --> 00:23:58,870 tamo je stvarno nema datoteka su uključeni u to, 397 00:23:58,870 --> 00:24:01,150 ali to je samo sortirati od generički termin koji se koristi za reći 398 00:24:01,150 --> 00:24:04,220 da ništa drugo ne dolazi iz ljudskog prstima. 399 00:24:04,220 --> 00:24:06,460 EOF - kraj datoteke. 400 00:24:06,460 --> 00:24:09,920 Kao na stranu, ako ste ikada pogodio Upravljačka D na tipkovnici, a ne da bi tek - 401 00:24:09,920 --> 00:24:15,230 ste hit Upravljačka C - Kontrola D šalje ovaj posebni konstanta naziva EOF. 402 00:24:15,230 --> 00:24:19,850 Tako sada imamo samo neke dinamičke raspodjele memorije. 403 00:24:19,850 --> 00:24:23,440 >> Dakle, ako (n + 1> kapacitet). Sada ću objasniti n. 404 00:24:23,440 --> 00:24:26,100 N je samo koliko bajtova su trenutno u tampon, 405 00:24:26,100 --> 00:24:28,620 string koji ste trenutno gradi od korisnika. 406 00:24:28,620 --> 00:24:33,450 Ako imate više znakova u svom tampon nego što imamo kapacitet u tampon, 407 00:24:33,450 --> 00:24:37,410 intuitivno što trebamo učiniti onda je izdvojiti više kapaciteta. 408 00:24:37,410 --> 00:24:43,330 Tako ću kliziti preko neke od aritmetičke ovdje i usredotočiti se samo na ovoj funkciji ovdje. 409 00:24:43,330 --> 00:24:46,070 Znate li što je malloc ili su barem općenito poznato. 410 00:24:46,070 --> 00:24:48,970 Uzmi pogodak što realloc radi. >> [Student] Dodaje memorije. 411 00:24:48,970 --> 00:24:52,920 To nije sasvim dodavanjem memorije. To reallocates memorije kako slijedi. 412 00:24:52,920 --> 00:24:57,220 Ako postoji još prostora na kraju niza vam dati više od toga memorije 413 00:24:57,220 --> 00:25:00,000 nego je prvotno vam daje, onda ćete dobiti taj dodatnu memoriju. 414 00:25:00,000 --> 00:25:03,460 Dakle, možete samo zadržati stavljajući stringa likove natrag na leđa natrag na leđa. 415 00:25:03,460 --> 00:25:05,830 No, ako to nije slučaj, jer ste čekali predugo 416 00:25:05,830 --> 00:25:07,940 i nešto slučajni dobio plopped u memoriji postoji 417 00:25:07,940 --> 00:25:10,290 ali tu je dodatni memorijski ovdje dolje, to je u redu. 418 00:25:10,290 --> 00:25:13,100 Realloc će učiniti sve težak za vas, 419 00:25:13,100 --> 00:25:16,750 premjestiti niz ste pročitali u tako daleko odavde, stavi ga tamo dolje, 420 00:25:16,750 --> 00:25:19,460 i onda vam dati neke više pistu u tom trenutku. 421 00:25:19,460 --> 00:25:22,550 >> Dakle, s valom ruke, dopustite mi da kažem da je ono što GetString radi 422 00:25:22,550 --> 00:25:26,330 je to počevši s malom buffer, možda jedan jedini lik, 423 00:25:26,330 --> 00:25:30,820 a ako korisnik unese u dva lika, GetString završava pozivom realloc i kaže 424 00:25:30,820 --> 00:25:33,150 jedan lik nije bio dovoljno; dajte mi dva lika. 425 00:25:33,150 --> 00:25:35,950 Zatim, ako ste pročitali kroz logiku petlje, to će reći 426 00:25:35,950 --> 00:25:39,600 korisnik upisao u tri znaka; daj mi sada ne dva, ali četiri znaka, 427 00:25:39,600 --> 00:25:42,320 onda mi dati 8, onda daj mi 16 i 32. 428 00:25:42,320 --> 00:25:45,000 Činjenica da sam udvostručenje kapaciteta svaki put 429 00:25:45,000 --> 00:25:48,570 znači da tampon ne ide sporo rastu, to će rasti superbrzo. 430 00:25:48,570 --> 00:25:51,380 A što može biti prednost to? 431 00:25:51,380 --> 00:25:54,600 Zašto sam udvostručenje veličine tampon 432 00:25:54,600 --> 00:25:58,020 iako korisnik može samo trebate jedan dodatni lik iz tipkovnice? 433 00:25:58,020 --> 00:26:01,750 [Nečujno učenik odgovor] >> Što je to? >> [Student] Ne morate ga rasti tako često. 434 00:26:01,750 --> 00:26:03,300 Točno. Ne morate ga rasti tako često. 435 00:26:03,300 --> 00:26:05,510 A to je samo vrsta ste hedging svoje oklade ovdje, 436 00:26:05,510 --> 00:26:10,850 Ideja je da ne želite nazvati realloc puno jer ima tendenciju da se spor. 437 00:26:10,850 --> 00:26:12,910 Svaki put kada se pitati operativni sustav za memoriju, 438 00:26:12,910 --> 00:26:16,990 kao da ćete uskoro vidjeti u budućem problema setu, ima tendenciju da potrajati neko vrijeme. 439 00:26:16,990 --> 00:26:20,010 Dakle umanjuje taj iznos od vrijeme, čak i ako ste gubit neki prostor, 440 00:26:20,010 --> 00:26:21,900 teži biti dobra stvar. 441 00:26:21,900 --> 00:26:24,060 >> Ali ako čitamo kroz završni dio GetString ovdje - 442 00:26:24,060 --> 00:26:27,950 i opet razumijevanje svaki jednu liniju ovdje nije toliko važno danas - 443 00:26:27,950 --> 00:26:30,530 primijetiti da je na kraju poziva malloc opet 444 00:26:30,530 --> 00:26:33,880 i to izdvaja točno onoliko bajtova kao što treba za niz 445 00:26:33,880 --> 00:26:38,060 i onda baca pozivom na besplatni pretjerano veliki tampon 446 00:26:38,060 --> 00:26:40,080 ako je to doista dobio udvostručila previše puta. 447 00:26:40,080 --> 00:26:42,730 Dakle, u kratko, to je kako GetString je radio sve ovo vrijeme. 448 00:26:42,730 --> 00:26:47,060 Sve to ne se čita jedan znak na vrijeme opet i opet i opet, 449 00:26:47,060 --> 00:26:50,750 i svaki put kad to treba neki dodatnu memoriju, ona traži operativni sustav za njega 450 00:26:50,750 --> 00:26:53,670 pozivom realloc. 451 00:26:53,670 --> 00:26:57,890 >> Ima li pitanja? U redu. 452 00:26:57,890 --> 00:26:59,270 >> Napad. 453 00:26:59,270 --> 00:27:04,060 Sada kada razumijemo naputke ili barem sve su upoznati s pokazivačima, 454 00:27:04,060 --> 00:27:06,700 ajmo uzeti u obzir kako je cijeli svijet počinje kolaps 455 00:27:06,700 --> 00:27:10,030 ako ne sasvim braniti protiv suparničkih korisnika, 456 00:27:10,030 --> 00:27:11,850 ljudi koji pokušavaju upasti u vašem sustavu, 457 00:27:11,850 --> 00:27:16,890 ljudi koji pokušavaju ukrasti vaše softver zaobilaženjem neki registracijski kod 458 00:27:16,890 --> 00:27:19,090 da bi u protivnom morati upisati u. 459 00:27:19,090 --> 00:27:22,990 >> Pogledajte ovaj primjer ovdje, što je samo C koda koji ima funkciju glavnog na dnu 460 00:27:22,990 --> 00:27:26,380 koja poziva funkciju foo. A što je to prolazi na foo? 461 00:27:26,380 --> 00:27:29,680 [Student] jedan argument. >> [Malan] jedan argument. 462 00:27:29,680 --> 00:27:33,450 Dakle, argv [1], što znači da je prva riječ da korisnik upisali u naredbeni redak 463 00:27:33,450 --> 00:27:36,360 nakon a.out ili što god se zove program. 464 00:27:36,360 --> 00:27:41,680 Tako foo na vrhu vodi u char *. No, char * je upravo ono? >> [Student] niz. 465 00:27:41,680 --> 00:27:43,350 [Malan] string, tako da nema ništa nova ovdje. 466 00:27:43,350 --> 00:27:45,420 To niz proizvoljno se zove bar. 467 00:27:45,420 --> 00:27:51,430 U ovoj liniji ovdje, char c [12], u svojevrsni polu-tehničkom engleskom jeziku, što je ova linija radi? 468 00:27:51,430 --> 00:27:55,220 [Student] niz - >> Array od? >> [Student] Likovi. >> Likovi. 469 00:27:55,220 --> 00:27:58,870 Daj mi niz od 12 znakova. Tako bismo mogli nazvati ovu tampon. 470 00:27:58,870 --> 00:28:02,920 To se zove tehnički c, ali tampon u programiranju samo znači hrpa prostora 471 00:28:02,920 --> 00:28:04,800 da možete staviti neke stvari i. 472 00:28:04,800 --> 00:28:07,940 Zatim, na kraju, memcpy nismo ste koristili prije, ali vjerojatno možete pogoditi što radi. 473 00:28:07,940 --> 00:28:10,480 Ona kopira memorije. Što to učiniti? 474 00:28:10,480 --> 00:28:19,270 To očito kopira bar, njegov ulaz, u c, ali samo do dužine traci. 475 00:28:19,270 --> 00:28:24,930 No, tu je bug ovdje. >> [Student] Trebate sizeof karakter. >> Ok. 476 00:28:24,930 --> 00:28:30,860 Tehnički, mi stvarno trebali učiniti strlen (bar) * sizeof (char)). To je točno. 477 00:28:30,860 --> 00:28:33,930 No, u najgorem slučaju ovdje, hajdemo pretpostaviti da that's - 478 00:28:33,930 --> 00:28:35,950 Ok. Zatim tu je dvije greške. 479 00:28:35,950 --> 00:28:39,160 Dakle sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Učinimo to malo šire. 481 00:28:41,290 --> 00:28:44,910 Dakle, sada ima još bug, to je ono što? >> [Nečujno učenik odgovor] 482 00:28:44,910 --> 00:28:46,990 Provjerite za što? >> [Student] Provjerite NULL. 483 00:28:46,990 --> 00:28:50,270 Mi općenito treba provjeravati NULL jer loše stvari se dogoditi 484 00:28:50,270 --> 00:28:53,200 kada pokazivač je NULL, jer možda ćete završiti ide tamo, 485 00:28:53,200 --> 00:28:57,630 i ne bi trebao ikada biti idući na NULL ga dereferencing sa zvijezda operatora. 486 00:28:57,630 --> 00:29:01,050 Dakle, to je dobro. A što drugo radimo? Logično, tu je mana ovdje. 487 00:29:01,050 --> 00:29:04,450 [Student] Provjerite je li argc je> = do 2. 488 00:29:04,450 --> 00:29:10,550 Dakle, provjerite je li argc je> = 2. Ok, tako da je tri bugovi u ovom programu ovdje. 489 00:29:10,550 --> 00:29:16,630 Sada provjeravamo je li korisnik zapravo upisali u bilo u argv [1]. Dobro. 490 00:29:16,630 --> 00:29:20,950 Dakle, što je treći bug? Da. >> [Student] C ne može biti dovoljno velika. 491 00:29:20,950 --> 00:29:23,320 Dobro. Provjerili smo jedan scenarij. 492 00:29:23,320 --> 00:29:29,520 Mi implicitno provjeriti ne kopirati više memorije nego što bi premašiti duljinu traci. 493 00:29:29,520 --> 00:29:32,510 Dakle, ako string korisnik upisao u je 10 znakova, 494 00:29:32,510 --> 00:29:36,020 to govori samo kopirati 10 znakova. I to je u redu. 495 00:29:36,020 --> 00:29:39,940 No, što ako korisnik unese u riječi na brz kao 20-znakovni riječi? 496 00:29:39,940 --> 00:29:44,900 To govori kopiju 20 znakova iz bara u čemu? 497 00:29:44,900 --> 00:29:49,750 C, inače poznat kao naš tampon, što znači da samo piše podatke 498 00:29:49,750 --> 00:29:52,540 do 8 byte lokacijama koje nemaju vlastiti, 499 00:29:52,540 --> 00:29:54,870 a vi ih ne posjedujete u smislu da ih nikada ne dodjeljuje. 500 00:29:54,870 --> 00:30:00,370 Dakle, to je ono što je općenito poznat kao napad tampon preljeva ili prelijevanja spremnika napad. 501 00:30:00,370 --> 00:30:05,580 I to je napad u smislu da ako korisnik ili program koji zove svoju funkciju 502 00:30:05,580 --> 00:30:10,490 je to zlonamjerno, što se zapravo događa sljedeći zapravo mogao biti prilično loša. 503 00:30:10,490 --> 00:30:12,450 >> Dakle, neka je pogledati ovu sliku ovdje. 504 00:30:12,450 --> 00:30:16,060 Ova slika predstavlja svoj stack memorije. 505 00:30:16,060 --> 00:30:19,580 Sjetite se da svaki put kad poziv funkciju možete dobiti ovaj malo okvir na stog 506 00:30:19,580 --> 00:30:21,520 a zatim još jedan, a zatim drugi i drugo. 507 00:30:21,520 --> 00:30:24,300 I do sada, mi smo samo vrsta iscrpljene te kao pravokutnika 508 00:30:24,300 --> 00:30:26,290 ili na brodu ili na zaslonu ovdje. 509 00:30:26,290 --> 00:30:30,580 No, ako smo povećali na jednom od tih pravokutnika, kada zovete funkciju foo, 510 00:30:30,580 --> 00:30:35,880 Ispada da postoji više na stog unutar tog okvira u tom pravokutniku 511 00:30:35,880 --> 00:30:40,060 nego samo x i y i i b, kao što nismo govorimo o zamjeni. 512 00:30:40,060 --> 00:30:44,410 Ispada da postoji neki niže razine pojedinosti, među njima i povratak Adresa. 513 00:30:44,410 --> 00:30:49,550 Tako ispada kada glavni poziva foo, glavni mora obavijestiti foo 514 00:30:49,550 --> 00:30:53,520 ono glavnih adresa je u memoriji računala 515 00:30:53,520 --> 00:30:57,770 jer inače, čim foo radi izvršenja, kao u ovom slučaju ovdje, 516 00:30:57,770 --> 00:31:00,830 kada dođete do ovog zatvorenog kovrčavu braće na kraju foo, 517 00:31:00,830 --> 00:31:05,310 kako dovraga foo znam gdje kontrolu programa je trebao ići? 518 00:31:05,310 --> 00:31:08,970 Ispada da je odgovor na to pitanje je u ovom crvenom pravokutniku ovdje. 519 00:31:08,970 --> 00:31:12,670 To predstavlja pokazivač, a to je do računala za pohranu privremeno 520 00:31:12,670 --> 00:31:17,030 na tzv stog adresa glavni, tako da čim foo radi izvršenja, 521 00:31:17,030 --> 00:31:21,120 računalo zna gdje i što linija u glavni vratiti. 522 00:31:21,120 --> 00:31:23,940 Spremljeno okvir pokazivač odnosi slično tome. 523 00:31:23,940 --> 00:31:26,310 Char * bar ovdje predstavlja što? 524 00:31:26,310 --> 00:31:31,350 Sada je to plavi segment ovdje je Foo je okvir. Što je traka? 525 00:31:31,570 --> 00:31:35,010 Bar je samo argument za foo funkciji. 526 00:31:35,010 --> 00:31:37,500 Dakle, sada smo se vratili na kakve poznate slike. 527 00:31:37,500 --> 00:31:39,850 Tu je više stvari i više rastresenost na zaslonu, 528 00:31:39,850 --> 00:31:43,380 ali to svjetlo plava segment upravo je ono što smo crtež na školsku ploču 529 00:31:43,380 --> 00:31:45,790 za nešto poput swapa. To je okvir za foo. 530 00:31:45,790 --> 00:31:51,490 A jedina stvar u tome upravo sada je bar, koji je ovaj parametar. 531 00:31:51,490 --> 00:31:55,220 No, što je još trebao biti u snopu prema ovom kodeksu ovdje? 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 Također, trebali bismo vidjeti 12 kvadrata memorije dodijeljena varijabli zove c, 534 00:32:02,810 --> 00:32:04,970 i doista mi imamo da se na zaslonu. 535 00:32:04,970 --> 00:32:08,480 Vrlo vrh je c [0], a zatim je autor ovog dijagrama 536 00:32:08,480 --> 00:32:11,850 nije smetaju crtanje sve kvadrata, ali zaista postoje 12 postoji 537 00:32:11,850 --> 00:32:16,590 jer ako pogledate u donjem desnom kutu, c [11] ako računamo od 0 je 12. bajta. 538 00:32:16,590 --> 00:32:18,400 Ali ovdje je problem. 539 00:32:18,400 --> 00:32:22,390 U kojem smjeru je c raste? 540 00:32:22,390 --> 00:32:27,080 Sortiraj odozgo prema dolje, ako to počinje na vrhu, a raste na dnu. 541 00:32:27,080 --> 00:32:30,110 To ne izgleda kao da smo ostavili sebi puno pistu ovdje uopće. 542 00:32:30,110 --> 00:32:32,090 Mi smo vrsta sebe naslikao u kutu, 543 00:32:32,090 --> 00:32:36,940 i da je c [11] je točno nasuprot baru, koji je upravo protiv Spremljene Frame pokazivač, 544 00:32:36,940 --> 00:32:39,960 koji je točno nasuprot povratna adresa. Nema više prostora. 545 00:32:39,960 --> 00:32:42,810 Dakle, ono što je implikacija onda ako zajebeš 546 00:32:42,810 --> 00:32:46,500 a vi pokušajte čitanja 20 bajtova u 12-byte buffer? 547 00:32:46,500 --> 00:32:50,060 Gdje su ti 8 dodatnih bajtova ići? >> [Student] Unutra - 548 00:32:50,060 --> 00:32:53,200 Unutra sve ostalo, od kojih su neke je super važno. 549 00:32:53,200 --> 00:32:57,260 I najvažnije, potencijalno, je crveni okvir postoji, povratna adresa, 550 00:32:57,260 --> 00:33:03,560 jer pretpostavljam da ste slučajno ili adversarially prepisati one 4 bajta, 551 00:33:03,560 --> 00:33:07,260 da pokazivač adresu, a ne samo sa smećem, ali s brojem 552 00:33:07,260 --> 00:33:09,810 da se događa da predstavlja stvarnu adresu u memoriji. 553 00:33:09,810 --> 00:33:13,880 Što je implikacija, logično? >> [Student] Funkcija će se vratiti na drugom mjestu. 554 00:33:13,880 --> 00:33:15,250 Točno. 555 00:33:15,250 --> 00:33:19,170 Kada foo vraća i hitovi koji kovrčave vitice, program će se nastaviti 556 00:33:19,170 --> 00:33:25,060 Ne biste se vratili na glavni, to će se vratiti na ono što je adresa u tom crvenom okviru. 557 00:33:25,060 --> 00:33:28,600 >> U slučaju zaobilazi softvera registracije, 558 00:33:28,600 --> 00:33:32,260 što ako je adresa koja je se vratio je funkcija koja normalno gets zove 559 00:33:32,260 --> 00:33:35,690 nakon što ste platili za softver i unesene svoj registracijski kod? 560 00:33:35,690 --> 00:33:39,870 Možete sortirati trik računala u ne ide ovdje, ali umjesto da ide gore. 561 00:33:39,870 --> 00:33:45,100 Ili ako si stvarno pametan, protivnik zapravo može upisati na tipkovnici, na primjer, 562 00:33:45,100 --> 00:33:50,690 nije stvarna riječ, a ne 20 znakova, ali pretpostavljam da on ili ona zapravo vrste u 563 00:33:50,690 --> 00:33:52,770 neki likovi koji predstavljaju kôd. 564 00:33:52,770 --> 00:33:55,320 I to neće biti C koda, to je zapravo će biti likovi 565 00:33:55,320 --> 00:33:59,290 koji predstavljaju binarni strojni kod, 0s i 1s. 566 00:33:59,290 --> 00:34:01,290 Ali pretpostavimo da su dovoljno pametni da to učinite, 567 00:34:01,290 --> 00:34:06,500 nekako zalijepiti u GetString redak nešto što je bitno sastaviti kod, 568 00:34:06,500 --> 00:34:09,980 , a zadnja 4 bajta prebrisati tu povratnu adresu. 569 00:34:09,980 --> 00:34:13,360 A što adrese to ulaz učiniti? 570 00:34:13,360 --> 00:34:18,630 To je zapravo pohranjuje u ovom crvenom pravokutniku adresa prvog bajtu tampon. 571 00:34:18,630 --> 00:34:23,070 Dakle, morate biti jako pametan, a to je puno pokušaja i pogrešaka za loših ljudi vani, 572 00:34:23,070 --> 00:34:25,639 ali ako možete shvatiti koliko je velika ta tampon je 573 00:34:25,639 --> 00:34:28,820 kao da je u posljednjih nekoliko bajtova u ulazu vam daju na programu 574 00:34:28,820 --> 00:34:33,540 dogoditi da bude jednaka na adresu početku svog tampon, možete to učiniti. 575 00:34:33,540 --> 00:34:39,320 Ako kažemo normalno pozdraviti i \ 0, to je ono što završi u spremniku. 576 00:34:39,320 --> 00:34:44,420 No, ako smo više pametan i punimo taj tampon s onim što smo općenito ću nazvati napad kod - 577 00:34:44,420 --> 00:34:48,860 AAA, napad, napad, napad - gdje je to samo nešto da učini nešto loše, 578 00:34:48,860 --> 00:34:51,820 što se događa ako si stvarno pametan, možda ćete to učiniti. 579 00:34:51,820 --> 00:34:58,610 U crvenom okviru ovdje je niz brojeva - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Primijetit ćete da to odgovara broju koji je ovdje. 581 00:35:01,610 --> 00:35:04,430 To je u obrnutom redoslijedu, ali više na tom nekom drugom vremenu. 582 00:35:04,430 --> 00:35:08,140 Primijetit ćete da je ovo povratna adresa je namjerno izmijenjeni 583 00:35:08,140 --> 00:35:12,020 jednaka adresu ovdje, a ne adresu glavni. 584 00:35:12,020 --> 00:35:17,500 Dakle, ako loš momak je super pametan, on ili ona će se uključiti u taj napad kod 585 00:35:17,500 --> 00:35:20,930 nešto poput izbrisati sve korisnikove datoteke ili kopirati lozinke 586 00:35:20,930 --> 00:35:24,680 ili stvoriti korisnički račun koji sam tada mogu prijaviti na - ništa at svi. 587 00:35:24,680 --> 00:35:26,950 >> A to je i opasnost i moć C. 588 00:35:26,950 --> 00:35:29,840 Budući da imate pristup memoriji putem upućuje 589 00:35:29,840 --> 00:35:32,520 i stoga se može pisati što god želite u memoriju računala, 590 00:35:32,520 --> 00:35:35,080 možete napraviti računalo učiniti sve što želite 591 00:35:35,080 --> 00:35:39,550 jednostavno tako što je skakati unutar vlastitog memorijskog prostora. 592 00:35:39,550 --> 00:35:44,650 I tako do današnjeg dana, tako mnogi programi i tako mnoge web stranice koje su ugrožena 593 00:35:44,650 --> 00:35:46,200 svode na ljude iskorištavanjem to. 594 00:35:46,200 --> 00:35:50,760 A to se može činiti kao super sofisticiranih napada, ali to ne mora uvijek početi na taj način. 595 00:35:50,760 --> 00:35:53,560 Realnost je da je ono što loši ljudi će obično učiniti je, 596 00:35:53,560 --> 00:35:58,200 da li je program na naredbenog retka ili GUI program ili web stranice, 597 00:35:58,200 --> 00:35:59,940 samo početi davati gluposti. 598 00:35:59,940 --> 00:36:03,980 Možete upisati u zaista velikom riječ u polje za pretraživanje i pritisnite Enter, 599 00:36:03,980 --> 00:36:05,780 i čekati da vidi je li web ruši 600 00:36:05,780 --> 00:36:09,990 ili čekate da vidi je li program pokazuje neke poruke o pogrešci 601 00:36:09,990 --> 00:36:14,330 jer ako se posreći kao negativca, a vi kažete neki ludi ulaz 602 00:36:14,330 --> 00:36:18,980 koji ruši program, to znači da programer nije predvidio svoj loše ponašanje, 603 00:36:18,980 --> 00:36:23,630 što znači da možete vjerojatno s dovoljno truda, dovoljno suđenje i pogreške, 604 00:36:23,630 --> 00:36:26,650 shvatiti kako voditi preciznije napad. 605 00:36:26,650 --> 00:36:31,410 Dakle, koliko dio sigurnosti nije samo izbjegavanje tih napada uopce 606 00:36:31,410 --> 00:36:34,100 ali ih pronađu, a zapravo gleda dnevnika 607 00:36:34,100 --> 00:36:36,780 i vidjeti što ulazi ludi smo ljudi upisali u vaše web stranice, 608 00:36:36,780 --> 00:36:38,960 što uvjete za pretraživanje ljudi su upisali u vaše web stranice 609 00:36:38,960 --> 00:36:42,870 u nadi da će prelijevanje neki tampon. 610 00:36:42,870 --> 00:36:45,500 I ovo sve se svodi na jednostavne osnove što je niz 611 00:36:45,500 --> 00:36:49,080 i što to znači izdvojiti i koristiti memoriju. 612 00:36:49,080 --> 00:36:51,710 >> Vezano uz to onda je to previše. 613 00:36:51,710 --> 00:36:54,280 Ajmo pogledati unutar hard disk opet. 614 00:36:54,280 --> 00:36:58,440 Možete se prisjetiti od tjedan ili dva prije da kad povucite datoteke na vaš koš za smeće ili kantu za smeće, 615 00:36:58,440 --> 00:37:03,710 što se događa? >> [Student] Ništa. >> Apsolutno ništa, zar ne? 616 00:37:03,710 --> 00:37:05,740 Na kraju, ako vam ponestane na disku, 617 00:37:05,740 --> 00:37:08,190 Windows ili Mac OS će početi brisanjem datoteka za vas. 618 00:37:08,190 --> 00:37:10,390 Ali ako povučete nešto tamo, da uopće nije sigurno. 619 00:37:10,390 --> 00:37:13,800 Sve tvoj cimer ili prijatelj ili član obitelji ima veze dvostruko kliknite i, voila, 620 00:37:13,800 --> 00:37:16,310 tu je sve nedorečena datoteke koje ste pokušali izbrisati. 621 00:37:16,310 --> 00:37:19,590 Većina od nas barem znati da morate desni klik ili kontrolirati klik 622 00:37:19,590 --> 00:37:22,310 i prazna kanta za smeće ili nešto slično. 623 00:37:22,310 --> 00:37:25,000 Ali čak i tada to ne sasvim učiniti trik 624 00:37:25,000 --> 00:37:28,010 jer ono što se događa kada imate datoteku na tvrdom disku 625 00:37:28,010 --> 00:37:32,770 koji predstavlja neki Word dokument ili neki JPEG, a to predstavlja vaš tvrdi disk, 626 00:37:32,770 --> 00:37:35,350 i recimo to luč ovdje predstavlja tu datoteku, 627 00:37:35,350 --> 00:37:38,390 i to je sastavljen od cijela hrpa 0S i 1S. 628 00:37:38,390 --> 00:37:42,470 Što se događa kada se ne samo povucite tu datoteku na smeće ili koš za smeće 629 00:37:42,470 --> 00:37:48,020 ali ga isprazniti? Sortiraj ničega. 630 00:37:48,020 --> 00:37:49,640 To nije apsolutno ništa sada. 631 00:37:49,640 --> 00:37:54,290 Sada je samo ništa, jer malo se nešto dogodi u obliku ovoj tablici. 632 00:37:54,290 --> 00:37:58,370 Dakle, postoji neka vrsta baze podataka ili tablice unutar memoriju računala 633 00:37:58,370 --> 00:38:03,850 bitno da ima jedan stupac za datoteke s imenima i jedan stupac za datoteke 'mjesto, 634 00:38:03,850 --> 00:38:07,720 gdje bi to moglo biti mjesto 123, samo slučajni broj. 635 00:38:07,720 --> 00:38:14,560 Tako bismo mogli imati nešto poput x.jpeg i lokaciji 123. 636 00:38:14,560 --> 00:38:18,800 Što se događa onda kada zapravo ispraznili smeće? 637 00:38:18,800 --> 00:38:20,330 To ide dalje. 638 00:38:20,330 --> 00:38:23,610 No, ono što ne ide daleko je 0s i 1s. 639 00:38:23,610 --> 00:38:26,270 >> Dakle, ono što je tada veza pset4? 640 00:38:26,270 --> 00:38:31,240 Pa, s pset4, samo zato što smo slučajno sam izbrisala Compact Flash kartice 641 00:38:31,240 --> 00:38:35,750 da je imao sve ove fotografije ili samo zato što je po peh postao korumpiran 642 00:38:35,750 --> 00:38:38,000 ne znači da 0s i 1s nisu još uvijek tamo. 643 00:38:38,000 --> 00:38:40,410 Možda neki od njih su izgubili, jer nešto dobio korumpiran 644 00:38:40,410 --> 00:38:43,320 u smislu da su neki 0s postao 1s i 0s 1s postao. 645 00:38:43,320 --> 00:38:47,240 Loše stvari se može dogoditi, jer buggy softvera ili neispravan hardver. 646 00:38:47,240 --> 00:38:50,370 No, mnogi od tih bitova, možda čak i 100% od njih su još uvijek tamo. 647 00:38:50,370 --> 00:38:55,050 To je samo da računalo ili fotoaparat ne znam gdje JPEG1 započeo 648 00:38:55,050 --> 00:38:56,910 i gdje JPEG2 počeo. 649 00:38:56,910 --> 00:39:01,070 Ali ako vas, programer, znate s malo pamet gdje ti JPEG su 650 00:39:01,070 --> 00:39:06,010 ili ono što oni izgledaju tako da možete analizirati 0s i 1s i reći JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 možete napisati program s bitno samo za ili while petlja 652 00:39:09,440 --> 00:39:12,820 da oporavi svaki od tih datoteka. 653 00:39:12,820 --> 00:39:16,030 Dakle, pouka je onda početi sigurno brisanje datoteka 654 00:39:16,030 --> 00:39:18,340 ako želite izbjeći uopce. Da. 655 00:39:18,340 --> 00:39:21,010 >> [Student] Kako to kaže na vašem računalu 656 00:39:21,010 --> 00:39:23,550 da imate više memorije nego što si učinio prije? 657 00:39:23,550 --> 00:39:27,820 Imati više memorije nego što je prije - >> [student] Više raspoložive memorije. 658 00:39:27,820 --> 00:39:29,630 Oh. Dobro pitanje. 659 00:39:29,630 --> 00:39:32,360 Pa zašto onda nakon pražnjenja otpada ne vaše računalo vam reći 660 00:39:32,360 --> 00:39:34,910 da imate više slobodnog prostora nego što si učinio prije? 661 00:39:34,910 --> 00:39:36,770 U Ukratko, jer je lagao. 662 00:39:36,770 --> 00:39:40,740 Više tehnički, imate više prostora, jer sada ste rekli 663 00:39:40,740 --> 00:39:43,680 možete staviti druge stvari gdje je datoteka nekad bio. 664 00:39:43,680 --> 00:39:45,450 No, to ne znači da se bitovi ide dalje, 665 00:39:45,450 --> 00:39:48,590 i to ne znači da se bitovi se mijenja u svim 0S, na primjer, 666 00:39:48,590 --> 00:39:50,150 za vašu zaštitu. 667 00:39:50,150 --> 00:39:54,640 Dakle, za razliku od, ako sigurno brisanje datoteka ili fizički uništiti uređaj, 668 00:39:54,640 --> 00:39:57,300 da je stvarno jedini način ponekad oko toga. 669 00:39:57,300 --> 00:40:02,020 >> Pa zašto ne odemo na tom polu-zastrašujuće note, a mi ćemo vas vidjeti u ponedjeljak. 670 00:40:02,020 --> 00:40:07,000 [Pljesak] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]