1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [TJEDAN 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Sveučilište Harvard] 3 00:00:04,760 --> 00:00:11,990 [Ovo je CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Žensko] On laže, o čemu, ja ne znam. 5 00:00:17,780 --> 00:00:20,300 [Čovjek] Pa što znamo? 6 00:00:20,300 --> 00:00:24,120 [Žensko] To u 09:15, Ray Santoya bio na bankomatu. 7 00:00:24,120 --> 00:00:27,420 [Čovjek] Dakle, pitanje je, što je on radio u 09:16? 8 00:00:27,420 --> 00:00:29,980 [Žensko] Pucanje 9 mm na nešto. 9 00:00:29,980 --> 00:00:31,900 Možda je vidio snajper. 10 00:00:31,900 --> 00:00:34,000 [Čovjek] Ili je on radio s njim. 11 00:00:34,000 --> 00:00:36,330 [Žensko] Čekaj. Vrati jednom. 12 00:00:36,330 --> 00:00:38,330 [Čovjek] Što vidiš? 13 00:00:38,330 --> 00:00:44,520 [♫ neizvjesnom glazba ♫] 14 00:00:44,520 --> 00:00:48,320 [Žensko] Donesite svoje lice prema gore. Cijeli zaslon. 15 00:00:48,320 --> 00:00:51,230 [Man] Njegove naočale. >> Tu je odraz. 16 00:00:51,230 --> 00:01:00,810 [♫ neizvjesnom glazba ♫] 17 00:01:00,810 --> 00:01:03,580 [Čovjek] To je Nuevita je bejzbol momčad. To je njihov logo. 18 00:01:03,580 --> 00:01:07,790 [Žensko] A on govori da onaj tko je nosio tu jaknu. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Dakle, ovo je CS50 tjedan 5, a danas smo uništiti malo televiziju i film za vas. 20 00:01:13,730 --> 00:01:16,170 Dakle, kad god gledate show kao što je ovaj jedan ovdje, 21 00:01:16,170 --> 00:01:19,910 a policajci kažu "Možete li očistiti da gore?" ili "unaprijedili" 22 00:01:19,910 --> 00:01:21,900 nema poboljšala u stvarnom svijetu. 23 00:01:21,900 --> 00:01:25,220 U stvari, ono što stvarno dobivate je malo nešto ovako. 24 00:01:25,220 --> 00:01:27,570 Ja sam izvukao jedan od zaposlenika fotografija iz stranici. 25 00:01:27,570 --> 00:01:30,980 To je program koji se zove Photoshop. Ovo je 1 od 2 Razmak, 26 00:01:30,980 --> 00:01:36,300 1 od 3 Razmaci zapravo, danas, jer imamo gospođu Bowden ovdje, kao i sa Rob i Pavla. 27 00:01:36,300 --> 00:01:41,950 No, ovdje je Rob na zaslonu, a ako smo zoom u tom odsjajem on je uvijek imao u svom oku, 28 00:01:41,950 --> 00:01:47,600 ono što zapravo vidi da je ono što vidite je ono što dobijete. 29 00:01:47,600 --> 00:01:51,690 To je "pojačan", pa "CSI" su ga malo krivo. 30 00:01:51,690 --> 00:01:55,190 Tu je jedan drugi isječak, ako možemo pokupiti na "CSI" samo malo duže. 31 00:01:55,190 --> 00:01:58,500 Ovo je jedna lijepa fraza izreći ubuduće ako želite 32 00:01:58,500 --> 00:02:10,280 zvuči tehnički sa svojim prijateljima kada, stvarno, govoriš apsolutno ništa. 33 00:02:10,280 --> 00:02:12,970 >> [Čovjek] Za nekoliko tjedana sam istraživao taksist ubojica ubojstva 34 00:02:12,970 --> 00:02:15,360 s određenom morbidnom fascinacijom. 35 00:02:15,360 --> 00:02:17,160 [Žensko # 1] To je u stvarnom vremenu. 36 00:02:17,160 --> 00:02:22,930 [Žensko # 2] Ja ću stvoriti GUI sučelje koristeći Visual Basic, da vidim mogu li pratiti IP adresu. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Dakle, audio out of sync stranu, stvarajući GUI sučelje koristeći Visual Basic 38 00:02:29,570 --> 00:02:31,820 pratiti IP adrese je potpuna glupost. 39 00:02:31,820 --> 00:02:33,840 Ovih dana ne bi koristili Visual Basic, 40 00:02:33,840 --> 00:02:38,920 nema potrebe za GUI, a IP adresa je tehnički točno termin. 41 00:02:38,920 --> 00:02:41,730 Dakle, držati oko vanjska strana za njih, i jedan od mojih favorita: 42 00:02:41,730 --> 00:02:45,070 Ovo je malo više tajanstvena, jer morate znati drugi jezik. 43 00:02:45,070 --> 00:02:47,860 Tu je jezik zove Objective-C, koji je nadskup C. 44 00:02:47,860 --> 00:02:51,960 Što znači da je C plus neke dodatne mogućnosti, među njima objektno-orijentirani programski. 45 00:02:51,960 --> 00:02:55,070 A to je jezik koji je Apple popularizirao za iOS programiranja. 46 00:02:55,070 --> 00:02:58,760 I tako evo isječak iz različitih pokazuju potpuno zaboravljeno, iz "Brojevi" 47 00:02:58,760 --> 00:03:02,450 da, ako ste zapravo gledati usko na TiVo i pauze u pravom trenutku, 48 00:03:02,450 --> 00:03:07,700 vidjet ćete da je ono što gledamo nije baš ono što je opisano. 49 00:03:07,700 --> 00:03:11,170 I neka mi probati različite audio konektor ovdje i vidjeti ako ne možemo 50 00:03:11,170 --> 00:03:13,780 zadržati zvuk u sync ovaj put. 51 00:03:13,780 --> 00:03:20,530 Ja vam dati "Brojevi". 52 00:03:20,530 --> 00:03:23,240 >> [Čovjek # 1] To je 32-bitni IPv4 adresa. 53 00:03:23,240 --> 00:03:38,930 [Čovjek # 2] IP, to je internet. >> Privatni mreže. To je Anita je privatna mreža. 54 00:03:38,930 --> 00:03:43,810 [Malan] Ok. Ovo je Objective-C, a to je za neke dječjom bojanje programa, 55 00:03:43,810 --> 00:03:51,140 kao što možda može zaključiti iz imena varijable tamo. 56 00:03:51,140 --> 00:03:54,410 Tako da je, dakle, bio "Brojevi". Dakle, danas i ovaj tjedan ćemo predstaviti 57 00:03:54,410 --> 00:03:57,740 Malo svijeta forenzike i konteksta u problemima zbog čega. 58 00:03:57,740 --> 00:04:00,590 Danas će biti skraćeno predavanje jer je poseban događaj u ovdje 59 00:04:00,590 --> 00:04:05,530 poslije, pa ćemo zaviriti, i zafrkavati oba učenicima i roditeljima podjednako danas 60 00:04:05,530 --> 00:04:07,420 s neke od stvari koje su na horizontu. 61 00:04:07,420 --> 00:04:12,240 Među njima, od ponedjeljka, imat ćete još nekoliko kolega iz razreda. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard i MITs novi online inicijativa za otvorenu courseware 63 00:04:16,050 --> 00:04:19,120 i više, stiže Harvarda kampusu u ponedjeljak. 64 00:04:19,120 --> 00:04:21,490 Što znači da dolaze ponedjeljak da će imati - od prošlog broja, 65 00:04:21,490 --> 00:04:26,210 86.000 dodatnih kolege će se sljedeće zajedno s CS50 predavanja 66 00:04:26,210 --> 00:04:29,170 i sekcije i Walkthroughs i problem setovima. 67 00:04:29,170 --> 00:04:32,350 I kao dio toga, vi ćete postati članovi nastupni klasi 68 00:04:32,350 --> 00:04:35,090 CS50 i sada CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Kao dio toga, sada shvaćaju da će biti nekih upsides kao dobro. 70 00:04:39,310 --> 00:04:43,790 Da biste dobili spreman za to, za veliki broj studenata, 71 00:04:43,790 --> 00:04:47,180 dovoljno je reći da iako imamo 108 TFS i CAS, 72 00:04:47,180 --> 00:04:50,790 nije baš najbolji učenik / učitelj omjer jednom smo pogodak 80.000 drugih studenata. 73 00:04:50,790 --> 00:04:52,850 Pa nećemo se ocjenjivanje toliko problema postavlja ručno. 74 00:04:52,850 --> 00:04:55,920 Dakle uvela ovaj tjedan u problematiku skupa će biti CS50 Ček, 75 00:04:55,920 --> 00:04:58,450 koja će biti uslužni program naredbenog retka unutar aparata 76 00:04:58,450 --> 00:05:01,200 da ćete dobiti nakon što ga ažurirati kasnije ovaj vikend, 77 00:05:01,200 --> 00:05:03,200 a vi ćete biti u mogućnosti pokrenuti naredbu, provjerite 50, 78 00:05:03,200 --> 00:05:06,500 na svoj pset, a vi ćete dobiti neke povratne informacije o tome je li vaš program je 79 00:05:06,500 --> 00:05:11,160 točno ili netočno prema raznim dizajna specifikacijama koje smo dostavili. 80 00:05:11,160 --> 00:05:13,580 Dakle, više o tome i specifikacija Problem set i 81 00:05:13,580 --> 00:05:17,240 su CS50x kolege će biti koristeći ovaj kao dobro. 82 00:05:17,240 --> 00:05:19,230 >> Dakle Problem set 4 je sve o forenzici. 83 00:05:19,230 --> 00:05:21,940 I ovo je skladba inspirirana nekom stvarnom životu stvari, 84 00:05:21,940 --> 00:05:24,620 čemu kad sam bio u dodiplomskoj školi, ja interniran za vrijeme s 85 00:05:24,620 --> 00:05:28,650 u Middlesex County je Županijsko državno odvjetništvo radi forenzička rad 86 00:05:28,650 --> 00:05:31,650 sa svojim olovnim forenzičkih istražitelja, i što je to iznosio 87 00:05:31,650 --> 00:05:35,260 je, mislim da sam spomenuo na nekoliko tjedan prošlost, je masa Državna policija ili netko drugi 88 00:05:35,260 --> 00:05:39,000 bi došao u, oni će spadati stvari poput tvrdih diskova i CD-a i diskete 89 00:05:39,000 --> 00:05:42,340 i slično, a onda je cilj forenzike uredu je da se utvrdi da li 90 00:05:42,340 --> 00:05:44,600 nije bilo ili nije bilo dokaza o nekakvoj. 91 00:05:44,600 --> 00:05:48,010 To je bio Posebna Istrage jedinica, tako da je bijelo-okovratnik kriminala, 92 00:05:48,010 --> 00:05:52,350 to je više zabrinjavajuća vrsta zločina, 93 00:05:52,350 --> 00:05:55,990 ništa uključuje neku vrstu digitalnih medija, ispada da se ne da mnogi ljudi 94 00:05:55,990 --> 00:05:59,370 napisati e-mail govoreći: "Učinio sam to." 95 00:05:59,370 --> 00:06:03,290 Dakle, vrlo često ove forenzika traži nije pojavio sve to puno voća, 96 00:06:03,290 --> 00:06:05,850 ali ponekad ljudi će pisati takve poruke. 97 00:06:05,850 --> 00:06:08,490 Dakle, ponekad se napori bili nagrađeni. 98 00:06:08,490 --> 00:06:14,420 >> Ali da će dovesti do ovog forenzičkih pset, mi ćemo biti uvođenje u pset 4 bitni grafike. 99 00:06:14,420 --> 00:06:18,260 Dakle, vjerojatno se te stvari zdravo za gotovo, JPEG, GIF i kao ovih dana, 100 00:06:18,260 --> 00:06:21,640 ali ako vi stvarno mislite o tome, slika, baš kao i Rob lice, 101 00:06:21,640 --> 00:06:24,430 mogao biti modeliran kao niz točaka ili piksela. 102 00:06:24,430 --> 00:06:26,680 Sada, u slučaju Rob lice, tu je sve vrste boja, 103 00:06:26,680 --> 00:06:29,940 i počeli smo vidjeti pojedine točke, otherwide poznat kao piksela, 104 00:06:29,940 --> 00:06:31,610 kad smo počeli uvećanje u. 105 00:06:31,610 --> 00:06:35,590 Ali ako ćemo pojednostaviti svijet malo, a samo reći da je ovo ovdje je Rob 106 00:06:35,590 --> 00:06:40,560 crno-bijelo, dobro, da predstavljaju crna i bijela možemo samo koristiti binarni. 107 00:06:40,560 --> 00:06:44,960 A ako ćemo koristiti binarni, 1 ili 0, možemo izraziti tu istu sliku 108 00:06:44,960 --> 00:06:51,970 od Rob je nasmijano lice s ovim uzorkom bitova: 11000011 predstavlja 109 00:06:51,970 --> 00:06:55,160 bijela, bijela, crna, crna, crna, crna, bijela bijela. 110 00:06:55,160 --> 00:06:59,290 I tako da to nije veliki skok, a zatim, kako bi počeli govoriti o šarenim fotografijama. 111 00:06:59,290 --> 00:07:01,920 Stvari koje bi vidjeti na Facebooku ili uzeti s digitalnom kamerom, 112 00:07:01,920 --> 00:07:04,730 ali, svakako, kada je riječ o bojama, trebate više bitova. 113 00:07:04,730 --> 00:07:08,470 I sasvim uobičajeno u svijetu fotografije je koristiti ne 1-bitnu boju, 114 00:07:08,470 --> 00:07:12,730 jer to sugerira, ali 24-bitna boja, gdje ste zapravo dobiti milijune boja. 115 00:07:12,730 --> 00:07:15,430 Dakle, kao u slučaju kad smo zumirani na Rob oku, 116 00:07:15,430 --> 00:07:19,270 da je bilo nekoliko milijuna različitih boja mogućnosti. 117 00:07:19,270 --> 00:07:22,260 >> Dakle, mi ćemo uvesti to u problemu set 4 kao u prohod, 118 00:07:22,260 --> 00:07:27,050 što će biti danas u 03:30 umjesto uobičajenog 02:30 jer petak predavanje ovdje. 119 00:07:27,050 --> 00:07:29,930 No, video će biti online, kao i obično, sutra. 120 00:07:29,930 --> 00:07:31,880 Također ćemo vas upoznati s drugom datotečnom formatu. 121 00:07:31,880 --> 00:07:34,150 Dakle, ovo namjerno je značilo da izgleda zastrašujuće na prvi, 122 00:07:34,150 --> 00:07:38,980 ali to je samo neka dokumentacija za C struct. 123 00:07:38,980 --> 00:07:42,280 Ispada da je Microsoft, godina, pomogao popularizirati ovaj oblik, 124 00:07:42,280 --> 00:07:46,630 zove bitmapa format, BMP, i to je super jednostavan, 125 00:07:46,630 --> 00:07:50,390 šareni grafički format koji je korišten za neko vrijeme 126 00:07:50,390 --> 00:07:53,640 a ponekad i dalje za pozadine na stolna računala. 127 00:07:53,640 --> 00:07:57,410 Ako mislite vratiti na Windows XP i valjanje brežuljcima i plavog neba, 128 00:07:57,410 --> 00:08:00,660 to je obično BMP ili skenirana slika, i bitmape 129 00:08:00,660 --> 00:08:03,340 su zabavna za nas, jer oni imaju malo više složenosti. 130 00:08:03,340 --> 00:08:05,640 To je ne sasvim kao jednostavan kao ovaj rešetku 0-a i jedan je; 131 00:08:05,640 --> 00:08:10,680 umjesto toga, imate stvari poput zaglavlju na početku datoteke. 132 00:08:10,680 --> 00:08:15,520 Dakle, drugim riječima, unutar. Bmp datoteke je cijela hrpa 0-ih i jedan je, 133 00:08:15,520 --> 00:08:18,070 ali ima neke dodatne 0-a i jedan je tamo. 134 00:08:18,070 --> 00:08:21,450 I ispada da ono što smo vjerojatno uzeti zdravo za gotovo već godinama, 135 00:08:21,450 --> 00:08:27,040 Formati sviđa. doc ili. xls ili. mp3 ili. MP4, 136 00:08:27,040 --> 00:08:29,910 bez obzira na Formati da ste upoznati s. 137 00:08:29,910 --> 00:08:31,900 Pa, što to uopće znači biti format? 138 00:08:31,900 --> 00:08:35,740 Jer na kraju dana, sve ove datoteke koristimo imaju samo 0-a i jedan je 139 00:08:35,740 --> 00:08:39,950 i možda one 0 je i 1-a predstavljaju a, b, c, preko ASCII ili slično, 140 00:08:39,950 --> 00:08:42,030 ali do kraja dana, to je samo 0-a i jedan je. 141 00:08:42,030 --> 00:08:45,300 >> Dakle ljudi samo povremeno odlučiti da izmisle novi format datoteke 142 00:08:45,300 --> 00:08:49,420 gdje su standardizirati ono obrasci bitova će zapravo znači. 143 00:08:49,420 --> 00:08:52,790 I u ovom slučaju ovdje, narod koji je dizajnirao bitmap format 144 00:08:52,790 --> 00:08:58,260 rekao je da je u prvom bajtu u bitmap datoteke, što označava ofsetnom 0, tamo, 145 00:08:58,260 --> 00:09:02,320 tamo će biti neki šifrirano ime varijabla zove bfType, 146 00:09:02,320 --> 00:09:06,510 koja samo stoji za bitmap datoteke tipa; što tip bitmap datoteku ovo. 147 00:09:06,510 --> 00:09:10,780 Možete zaključiti, možda, iz drugog reda koji prebijanje 2, bajt broj 2, 148 00:09:10,780 --> 00:09:15,980 ima uzorak 0-a i jedan je da predstavlja što? 149 00:09:15,980 --> 00:09:18,320 Veličina nešto, a to ide od tamo. 150 00:09:18,320 --> 00:09:20,660 Tako je u problemu set 4, vi ćete biti prošetao kroz neke od tih stvari. 151 00:09:20,660 --> 00:09:24,480 >> Nećemo završiti brinuti o svima njima, ali primijetiti ona počinje da biste dobili zanimljiv 152 00:09:24,480 --> 00:09:30,780 oko linije ili Bajt 54, rgbtBlue, zelena i crvena. 153 00:09:30,780 --> 00:09:35,280 Ako ste ikada čuli akronim RGB, crvena zelena plava, ovo je referenca na to. 154 00:09:35,280 --> 00:09:37,840 Zbog ispada možete slikati sve dugine boje 155 00:09:37,840 --> 00:09:41,580 s nekim kombinacija crvene i plave i zelene. 156 00:09:41,580 --> 00:09:46,560 A, u stvari, roditelji u sobi mogu podsjetiti na neke od najranijih projektora. 157 00:09:46,560 --> 00:09:49,360 Ovih dana, možete vidjeti samo jedan svjetlost izlazi iz objektiva. 158 00:09:49,360 --> 00:09:52,870 No, natrag u dan, da je imala crvenu leću, plavu leću, i zelenu leću 159 00:09:52,870 --> 00:09:56,620 i zajedno su usmjerene na zaslonu i formirao šarenu sliku. 160 00:09:56,620 --> 00:09:59,590 I vrlo često srednje škole i visoke škole će imati one leće 161 00:09:59,590 --> 00:10:02,680 uvijek-tako-malo iskosa, tako da su bili svojevrsni vidim dvostruko ili trostruko slike, 162 00:10:02,680 --> 00:10:07,500 ali to je ideja. Imali ste crvene i zelene i plave svjetlo slikarstvo sliku. 163 00:10:07,500 --> 00:10:09,570 A taj isti princip se koristi u računalima. 164 00:10:09,570 --> 00:10:12,000 >> Dakle, među izazovima, a zatim, za vas u problem postaviti četiri 165 00:10:12,000 --> 00:10:16,080 će biti nekoliko stvari, jedna je da se zapravo veličinu slike. 166 00:10:16,080 --> 00:10:18,050 Da bi se u obrascu 0-a i jedan je, 167 00:10:18,050 --> 00:10:22,840 shvatiti što komade 0-a i jedan je predstavljaju ono što u strukturi kao što je ovaj, 168 00:10:22,840 --> 00:10:26,800 i onda shvatiti kako replicirati piksela: Reds, Blues, zeleni 169 00:10:26,800 --> 00:10:32,460 unutar tako da kad slika izgleda ovako na početku, može izgledati ovako umjesto nakon toga. 170 00:10:32,460 --> 00:10:35,590 Među ostalim izazovima, također, će biti da ćete se predati 171 00:10:35,590 --> 00:10:38,900 forenzička slika od stvarne datoteke iz digitalnog fotoaparata 172 00:10:38,900 --> 00:10:42,410 i na toj kameri, nekada davno, bili su cijela hrpa fotografija. 173 00:10:42,410 --> 00:10:47,030 Problem je, mi slučajno izbrisati ili imao sliku korumpiran nekako. 174 00:10:47,030 --> 00:10:51,040 Loše stvari se dogoditi s digitalnim kamerama, pa smo brzo kopirati sve 0-a i jedan je 175 00:10:51,040 --> 00:10:55,410 off tu karticu za vas, spasio ih sve u jednoj velikoj datoteku, a onda ćemo ih predati tebi 176 00:10:55,410 --> 00:11:00,000 u problem postaviti 4, tako da možete napisati program u C s kojima se oporavi 177 00:11:00,000 --> 00:11:02,660 sve one JPEG, idealno. 178 00:11:02,660 --> 00:11:06,280 A što se ispostavilo da je JPEG, iako su oni nešto složenog formatu, 179 00:11:06,280 --> 00:11:09,580 oni su puno složeniji nego ove nasmijano lice ovdje. 180 00:11:09,580 --> 00:11:14,320 Ispada da svaki JPEG počinje s istim uzorcima 0-a i jedan je. 181 00:11:14,320 --> 00:11:18,820 Dakle, koristite while petlja ili za petlje ili slično, 182 00:11:18,820 --> 00:11:22,350 možete ponoviti preko svega 0-ih i jedan je u ovom forenzičke sliku 183 00:11:22,350 --> 00:11:26,670 i svaki put kad vidim poseban uzorak koji je definiran u problemu postaviti specifikaciji, 184 00:11:26,670 --> 00:11:29,770 možete pretpostaviti, "Oh, ovdje je, s vrlo visokom vjerojatnošću, 185 00:11:29,770 --> 00:11:33,520 početak JPEG, "i čim vam isti obrazac, 186 00:11:33,520 --> 00:11:36,050 neki broj bajtova ili kilobajta megabajtima ili kasnije, 187 00:11:36,050 --> 00:11:40,550 možete pretpostaviti, "Ooh! Ovdje je drugi JPEG, slika Uzeo sam nakon prvog. 188 00:11:40,550 --> 00:11:44,720 Dopustite mi prestati čitati tu prvu sliku, počnite pisati ovu novu. ' 189 00:11:44,720 --> 00:11:49,980 A izlaz vašeg programa za pset 4 će biti onoliko koliko 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 A ako to nije 50 JPEG, imate malo petlje. 191 00:11:52,400 --> 00:11:55,580 Ako imate beskonačan broj JPEG, imate beskonačnu petlju. 192 00:11:55,580 --> 00:11:58,280 Tako da, također, će biti vrlo čest slučaj. 193 00:11:58,280 --> 00:12:00,280 To je ono što je na horizontu. 194 00:12:00,280 --> 00:12:03,740 >> Kviz 0, iza nas. Shvatite, po mom e, da uvijek postoji ljudi 195 00:12:03,740 --> 00:12:06,820 koji su oboje sretni, vrsta neutralna, i tužno oko kviza 0 puta. 196 00:12:06,820 --> 00:12:10,160 I nemojte doprijeti do mene, glava TFS, Zamyla, svoj TF 197 00:12:10,160 --> 00:12:14,120 ili jedan od CA da znate ako želite razgovarati o tome kako su stvari išle. 198 00:12:14,120 --> 00:12:16,460 >> Tako da impresionirati roditelje ovdje u sobi, 199 00:12:16,460 --> 00:12:23,990 što je CS50 knjižnica? Dobar posao. 200 00:12:23,990 --> 00:12:32,280 Što je CS50 knjižnica? Da? [Studentski odgovore, nerazumljivo] 201 00:12:32,280 --> 00:12:35,730 >> Dobro, dobro. Dakle, to je prewritten skup koda koji smo, osoblje, napisao je, 202 00:12:35,730 --> 00:12:38,460 pružamo vama, dati neke zajedničke funkcionalnosti. 203 00:12:38,460 --> 00:12:42,290 Stuff sviđa mi se niz; mi srediti int, sve funkcije koje su ovdje navedene. 204 00:12:42,290 --> 00:12:45,260 Počevši sada, možemo početi stvarno uzeti ove obuke kotača off. 205 00:12:45,260 --> 00:12:48,230 Tako da ćemo početi oduzeti "string" od vas, 206 00:12:48,230 --> 00:12:52,790 koji, podsjetimo, bio samo sinonim za ono što stvarni podaci putovanja? char *. 207 00:12:52,790 --> 00:12:57,020 Dakle, za roditelje, koji je vjerojatno bio - to je dobro, tako char * počet ćemo vidjeti 208 00:12:57,020 --> 00:13:00,810 na zaslonu sve više kao što smo ukloniti "STRING" iz našeg vokabulara, 209 00:13:00,810 --> 00:13:02,760 barem kad je u pitanju zapravo pisanje koda. 210 00:13:02,760 --> 00:13:06,240 Isto tako, mi ćemo prestati koristiti neke od tih funkcija, kao mnogo, 211 00:13:06,240 --> 00:13:08,390 jer su naši programi će se sofisticiraniji 212 00:13:08,390 --> 00:13:11,370 nego samo pisati programe koji sjede tamo sa brz treperi, 213 00:13:11,370 --> 00:13:13,580 čeka korisnika upisati nešto u. 214 00:13:13,580 --> 00:13:15,220 Vi ćete dobiti svoje inpute od drugdje. 215 00:13:15,220 --> 00:13:18,720 Na primjer, da ćete ih dobiti od niza bitova na lokalnom tvrdom disku. 216 00:13:18,720 --> 00:13:23,340 Umjesto toga ću ih dobiti u budućnosti iz mrežne veze, neke web stranice negdje. 217 00:13:23,340 --> 00:13:27,460 Tako ćemo guliti leđa ovom sloju za prvi put, i podići CS50 aparat 218 00:13:27,460 --> 00:13:32,300 i ovu sliku nazvao CS50.h, koji ste bili oštri, uključujući tjednima. 219 00:13:32,300 --> 00:13:34,380 >> Ali ajmo se zapravo vidjeti što je unutar toga. 220 00:13:34,380 --> 00:13:38,250 Dakle, na vrhu datoteke u plavom je samo cijela hrpa komentarima, 221 00:13:38,250 --> 00:13:41,340 Informacije o jamstvu i licenciranje. To je neka vrsta zajedničke paradigme 222 00:13:41,340 --> 00:13:44,600 u softveru, jer puno softvera ovih dana je ono što se zove "open source" 223 00:13:44,600 --> 00:13:46,940 što znači da je netko napisao kod 224 00:13:46,940 --> 00:13:50,060 i napravio je slobodno dostupan, a ne samo za pokretanje i korištenje, 225 00:13:50,060 --> 00:13:53,660 ali zapravo čitati i mijenjati i integriraju u svoj rad. 226 00:13:53,660 --> 00:13:55,790 Dakle, to je ono što ste koristili, open source softvera, 227 00:13:55,790 --> 00:13:58,030 iako u vrlo malom obliku. 228 00:13:58,030 --> 00:14:01,860 Ako sam se pomaknite prema dolje prošlosti komentarima, iako ćemo početi vidjeti neke više poznate stvari. 229 00:14:01,860 --> 00:14:08,090 Tako primijetiti na vrhu ovdje, da CS50.h datoteka uključuje hrpu zaglavlja datoteka. 230 00:14:08,090 --> 00:14:11,160 Sada, većina od njih nismo vidjeli, ali jedan je 231 00:14:11,160 --> 00:14:15,640 upoznati, koji od njih smo vidjeli, iako kratko, tako daleko? 232 00:14:15,640 --> 00:14:18,720 Da, standardne biblioteke. Stdlib.h ima malloc, 233 00:14:18,720 --> 00:14:21,590 pa kad smo počeli govoriti o dinamičke memorije raspodjele, 234 00:14:21,590 --> 00:14:24,960 koje ćemo se vratiti sljedeći tjedan kao dobro, počeli smo uključujući tu datoteku. 235 00:14:24,960 --> 00:14:29,660 Ispada da bool i pravi i lažni zapravo ne postoje u C, sama po sebi, 236 00:14:29,660 --> 00:14:32,460 osim ako su ovu datoteku ovdje. 237 00:14:32,460 --> 00:14:35,770 Tako smo, za nekoliko tjedana, bio uključujući standardni bool.h 238 00:14:35,770 --> 00:14:39,020 tako da možete koristiti pojam bool, istinita ili lažna. 239 00:14:39,020 --> 00:14:41,830 Bez toga, da će morati izdvojiti od lažni njega i koristiti int 240 00:14:41,830 --> 00:14:45,920 i samo proizvoljno pretpostaviti da je lažna 0 i 1 je istina. 241 00:14:45,920 --> 00:14:49,980 >> Sada, ako mi se pomaknite prema dolje i dalje, ovdje je naša definicija niza. 242 00:14:49,980 --> 00:14:54,820 Ispada, kao što smo već rekli, da ako to * je zapravo ne smeta. 243 00:14:54,820 --> 00:14:56,750 Možete čak imati prostor sve oko sebe. 244 00:14:56,750 --> 00:15:01,550 Mi, ovaj semestar, su ga promovira kao to jasno dati do znanja da je * ima veze s tipom. 245 00:15:01,550 --> 00:15:05,370 Ali shvatite, baš kao i uobičajeno, ako ne i malo više zajedničkog, je da ga je tamo stavio 246 00:15:05,370 --> 00:15:07,480 ali funkcionalno je to ista stvar. 247 00:15:07,480 --> 00:15:11,070 Ali sada, ako čitamo dolje dalje, ajmo pogledati recimo, GetInt, 248 00:15:11,070 --> 00:15:15,350 jer mi se to, možda, prije svega ovaj semestar. 249 00:15:15,350 --> 00:15:19,620 I ovdje je GetInt. To je ono što? 250 00:15:19,620 --> 00:15:24,650 To je prototip. Tako često, mi smo stavili prototipove na vrhovima naših. C datoteke, 251 00:15:24,650 --> 00:15:28,190 ali također možete staviti prototipove u zaglavlju datoteke, datoteke, h. 252 00:15:28,190 --> 00:15:32,110 kao što je ovaj jedan ovdje, tako da kada pišete neke funkcije 253 00:15:32,110 --> 00:15:36,790 da želite drugi ljudi biti u mogućnosti koristiti, što je upravo slučaj s CS50 knjižnici, 254 00:15:36,790 --> 00:15:40,900 ne samo provoditi svoje funkcije u nešto poput CS50.c, 255 00:15:40,900 --> 00:15:46,720 također staviti prototipa nije na vrhu tog spisa, ali na vrhu datoteke zaglavlja, 256 00:15:46,720 --> 00:15:50,810 zatim da header datoteka je ono što prijatelji i kolege su, 257 00:15:50,810 --> 00:15:52,800 s oštrim uključiti u vlastitom kodu. 258 00:15:52,800 --> 00:15:55,440 Dakle, sve ovo vrijeme ste bili, uključujući sve ove prototipova 259 00:15:55,440 --> 00:15:59,870 učinkovito na vrhu svoje datoteke, ali putem ove oštre uključuju mehanizam 260 00:15:59,870 --> 00:16:03,320 bitno da kopije i paste ovu sliku na svoj vlastiti. 261 00:16:03,320 --> 00:16:06,400 Sada, ovdje je neke prilično detaljan dokumentacija. 262 00:16:06,400 --> 00:16:08,880 >> Mi smo prilično mnogo uzeti zdravo za gotovo da GetInt dobiva int, 263 00:16:08,880 --> 00:16:10,740 ali ispada da je neki kutak slučajeva, zar ne? 264 00:16:10,740 --> 00:16:14,320 Što ako korisnik upiše u nizu koji je način prevelika? 265 00:16:14,320 --> 00:16:17,350 Quintillion, da jednostavno ne mogu stati unutar int? 266 00:16:17,350 --> 00:16:21,180 Što je očekivano ponašanje? Pa, u idealnom slučaju, to je predvidljiva. 267 00:16:21,180 --> 00:16:23,460 Dakle, u ovom slučaju, ako zapravo pročitate fine print, 268 00:16:23,460 --> 00:16:27,850 vidjet ćete da ako se linija ne može pročitati, ovaj vraća INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Nikada nismo razgovarali o tome, ali na temelju svoje kapitalizacije, 270 00:16:30,800 --> 00:16:33,030 što je to, vjerojatno? 271 00:16:33,030 --> 00:16:36,610 To je konstanta, tako da je to neka posebna konstanta koja je vjerojatno proglasila 272 00:16:36,610 --> 00:16:39,460 u jednoj od tih zaglavlja datoteka koje je do veće u spisu, 273 00:16:39,460 --> 00:16:43,400 i INT_MAX je vjerojatno nešto slično, otprilike, 2000000000. 274 00:16:43,400 --> 00:16:48,160 Ideja je da zato moramo nekako označi da je nešto pošlo po zlu, 275 00:16:48,160 --> 00:16:51,090 mi, da, ima četiri milijarde brojeve na raspolaganju, 276 00:16:51,090 --> 00:16:53,980 negativna 2000000000 na do 2 milijarde, dati ili uzeti. 277 00:16:53,980 --> 00:16:58,030 Pa, ono što je zajedničko u programiranju je li ukrasti samo jednog od tih brojeva. 278 00:16:58,030 --> 00:17:02,250 Možda 0, možda 2000000000, možda negativna 2000000000. 279 00:17:02,250 --> 00:17:06,720 Tako ćete potrošiti jedan od vaših mogućih vrijednosti, tako da možete obvezati na svijetu 280 00:17:06,720 --> 00:17:10,089 da, ako nešto pođe po zlu, ja ću se vratiti ovo super veliku vrijednost. 281 00:17:10,089 --> 00:17:13,329 Ali vi ne želite da korisnik typing nešto grobni kao "dva, tri, četiri ..." 282 00:17:13,329 --> 00:17:17,079 od stvarno velikom broju, gdje se generalizirati, umjesto kao konstanta. 283 00:17:17,079 --> 00:17:19,380 Pa stvarno, ako su se analni posljednjih nekoliko tjedana, 284 00:17:19,380 --> 00:17:23,800 kad god nazvati GetInt, trebali su provjere s Ako je uvjet. 285 00:17:23,800 --> 00:17:27,109 Je li korisnički tip u INT_MAX, ili točnije, 286 00:17:27,109 --> 00:17:29,900 učinio GetInt povratka INT_MAX? Jer ako je to učinio, 287 00:17:29,900 --> 00:17:35,140 to zapravo znači da to nije tip, nešto je pošlo po zlu u ovom slučaju. 288 00:17:35,140 --> 00:17:38,970 Dakle, to je ono što je općenito poznat kao "sentinel" vrijednosti, što samo znači posebna. 289 00:17:38,970 --> 00:17:41,020 >> Pa, ajmo sad okrenuti u na c. Datotekama. 290 00:17:41,020 --> 00:17:44,500 C Datoteka je postojala u aparatu za neko vrijeme, 291 00:17:44,500 --> 00:17:47,540 i, u stvari, aparat ima precompiled za vas 292 00:17:47,540 --> 00:17:49,720 u toj stvari smo nazvali "objektni kod" 293 00:17:49,720 --> 00:17:52,940 ali to jednostavno nije bitno za vas gdje je to jer sustav ne zna, 294 00:17:52,940 --> 00:17:54,780 u ovom slučaju, gdje je, aparat. 295 00:17:54,780 --> 00:18:00,620 Ali ajmo se pomaknite prema dolje sada GetInt, i vidjeti kako GetInt je radio sve ovo vrijeme. 296 00:18:00,620 --> 00:18:02,380 Dakle, ovdje imamo slične komentare od prije. 297 00:18:02,380 --> 00:18:04,930 Dopustite mi povećali samo kod dijela, 298 00:18:04,930 --> 00:18:07,410 i što imamo za GetInt je sljedeći. 299 00:18:07,410 --> 00:18:12,770 To ne preuzima ulaz i vraća int, dok je (istina), pa smo namjerno beskonačnu petlju 300 00:18:12,770 --> 00:18:16,560 ali, vjerojatno ćemo izbiti iz to nekako, ili se vratiti u roku od ovoga. 301 00:18:16,560 --> 00:18:19,890 Dakle, neka je vidjeti kako se to radi. Pa, čini se da se pomoću GetString 302 00:18:19,890 --> 00:18:22,550 U ovoj prvoj liniji unutar petlje, 166. 303 00:18:22,550 --> 00:18:25,320 Ovo je sada dobra praksa, jer pod kojim okolnostima 304 00:18:25,320 --> 00:18:30,820 mogao GetString vratiti ovu posebnu ključnih riječi, null? 305 00:18:30,820 --> 00:18:38,460 Ako nešto pođe po zlu. Što bi moglo poći po zlu kada nazovete nešto poput GetString? 306 00:18:38,460 --> 00:18:42,550 Da? [Studentski odgovor, nerazumljivo] >> Da. Dakle, možda malloc ne uspije. 307 00:18:42,550 --> 00:18:45,310 Negdje ispod poklopca motora GetString zove malloc, 308 00:18:45,310 --> 00:18:48,210 koje dodjeljuje memoriju, što omogućuje računala dućan 309 00:18:48,210 --> 00:18:50,950 svi likovi koji korisnik upiše u tipkovnici. 310 00:18:50,950 --> 00:18:53,270 I pretpostavljam da je korisnik imao puno slobodnog vremena 311 00:18:53,270 --> 00:18:56,470 i upisali više, na primjer, od dvije milijarde znakova. 312 00:18:56,470 --> 00:18:59,600 Više znakova nego računalo ima čak RAM-a. 313 00:18:59,600 --> 00:19:02,350 Pa, GetString mora biti u mogućnosti da znači da vam, 314 00:19:02,350 --> 00:19:05,650 čak i ako je to super, super neuobičajeno kutak slučaj. 315 00:19:05,650 --> 00:19:08,490 To je na neki način biti u mogućnosti da obrađuju ovu, i tako GetString, 316 00:19:08,490 --> 00:19:11,850 ako ćemo se vratiti i pročitati njegovu dokumentaciju, ne, u stvari, vratiti NULL. 317 00:19:11,850 --> 00:19:16,150 Sada, ako ne uspije GetString po povratku NULL, GetInt će uspjeti 318 00:19:16,150 --> 00:19:19,370 po povratku INT_MAX, baš kao stražar. 319 00:19:19,370 --> 00:19:22,650 Ovo su samo ljudska konvencija. Jedini način da bi znali je to slučaj 320 00:19:22,650 --> 00:19:24,840 je čitanjem dokumentacije. 321 00:19:24,840 --> 00:19:28,200 Dakle, ajmo se pomaknite prema dolje do mjesta gdje int je zapravo GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Dakle, ako sam pomaknite se dolje malo dalje, u skladu 170 imamo komentar iznad ovih redaka. 323 00:19:34,220 --> 00:19:38,470 Dakle, mi izjavljujemo, u 172, int n i char C, a zatim ova nova funkcija 324 00:19:38,470 --> 00:19:41,870 što neki od vas su nabasali prije, ali sscanf. 325 00:19:41,870 --> 00:19:44,190 To je kratica za gudački skeniranja f. 326 00:19:44,190 --> 00:19:48,580 Drugim riječima, daj mi niz i ja ću ga skenirati za dijelove informacije interesa. 327 00:19:48,580 --> 00:19:53,820 Dakle, što to znači? Pa, recimo da sam upisati, doslovno, 1 2 3 na tipkovnici, 328 00:19:53,820 --> 00:19:59,730 a zatim pritisnite enter. Koja je vrsta podataka od 1 2 3 kada se vratio po GetString? 329 00:19:59,730 --> 00:20:05,010 To je očito niz, zar ne? Dobio sam niz, pa 1 2 3 stvarno "1 2 3» 330 00:20:05,010 --> 00:20:07,260 s \ 0 na kraju njega. To nije int. 331 00:20:07,260 --> 00:20:10,420 To nije broj. To izgleda kao broj, ali to je zapravo nije. 332 00:20:10,420 --> 00:20:14,680 Dakle, ono što ne GetInt morati učiniti? To je skenirati taj niz lijeva na desno, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, i nekako ga pretvoriti u stvarni cijeli. 334 00:20:19,010 --> 00:20:21,010 Sada, mogli shvatiti kako to učiniti. 335 00:20:21,010 --> 00:20:24,240 Ako mislite natrag pset 2, što vjerojatno dobio malo ugodno 336 00:20:24,240 --> 00:20:26,810 s Cezarom ili vigenere tako da možete ponoviti preko niza, 337 00:20:26,810 --> 00:20:29,800 možete pretvoriti znakova da Ints s pick. To je puno posla. 338 00:20:29,800 --> 00:20:32,800 Zašto ne pozvati funkciju kao sscanf koji radi za vas? 339 00:20:32,800 --> 00:20:37,520 Dakle sscanf očekuje argument, u ovom slučaju zove linija, koja je niz. 340 00:20:37,520 --> 00:20:41,310 Zatim odredite, u navodnicima, vrlo slična printf, 341 00:20:41,310 --> 00:20:44,960 Što očekujete da ćete vidjeti u ovom nizu? 342 00:20:44,960 --> 00:20:52,980 Ono što sam rekao ovdje je, očekujem da ću vidjeti decimalni broj, a možda i karakter. 343 00:20:52,980 --> 00:20:54,990 A vidjet ćemo zašto je to slučaj u samo nekoliko trenutaka. 344 00:20:54,990 --> 00:20:58,440 Ispada da je ovaj zapis je sada podsjeća na stvari 345 00:20:58,440 --> 00:21:00,840 počeli smo govoriti o nešto više od tjedan dana. 346 00:21:00,840 --> 00:21:05,430 >> Što je & n i c & radiš za nas ovdje? [Studentski odgovore, nerazumljivo] 347 00:21:05,430 --> 00:21:07,610 >> Da. To je što su mi dali adresu n i adresa c. 348 00:21:07,610 --> 00:21:10,440 Sada, zašto je to važno? Pa, znate da sa funkcije u C 349 00:21:10,440 --> 00:21:13,440 uvijek možete vratiti vrijednost ili nema vrijednost na sve. 350 00:21:13,440 --> 00:21:16,630 Možete se vratiti int, string, float, char, kako god. 351 00:21:16,630 --> 00:21:21,150 Ili možete vratiti prazninu, ali možete samo vratiti jedan stvar maksimalno. 352 00:21:21,150 --> 00:21:26,100 No, ovdje želimo sscanf me vratiti možda je int, decimalni broj, 353 00:21:26,100 --> 00:21:29,240 i char, a ja ću objasniti zašto char u trenutku. 354 00:21:29,240 --> 00:21:34,250 Tako da učinkovito želite ž vratiti dvije stvari, to je jednostavno nije moguće u C. 355 00:21:34,250 --> 00:21:38,460 Tako možete raditi oko koje prolazi u dvije adrese, 356 00:21:38,460 --> 00:21:43,710 jer čim predati funkciju dvije adrese, što može da funkcija učiniti s njima? 357 00:21:43,710 --> 00:21:49,880 To može pisati tim adresama. Možete koristiti operaciju * ​​i "tamo" na svaku od tih adresa. 358 00:21:49,880 --> 00:21:54,320 To je vrsta ovog backdoor mehanizam, ali vrlo uobičajena za promjenu vrijednosti varijabli 359 00:21:54,320 --> 00:21:58,020 u više nego samo jednom mjestu, u ovom slučaju dvije. 360 00:21:58,020 --> 00:22:04,590 Sada, primijetit sam provjeru == to1, a zatim se vraćaju n ako to ne, u stvari, ocjenjuje da istinito. 361 00:22:04,590 --> 00:22:09,340 Dakle, što se događa? Pa, tehnički, svi smo stvarno želite da se dogodi u GetInt je to. 362 00:22:09,340 --> 00:22:12,340 Želimo analizirati, da se tako izrazim, želimo pročitati niz 363 00:22:12,340 --> 00:22:16,210 "1 2 3", a ako to izgleda kao da je broj postoji, 364 00:22:16,210 --> 00:22:21,360 ono što smo reći sscanf učiniti je staviti taj broj, 1 2 3, u ovom promjenjivom n za mene. 365 00:22:21,360 --> 00:22:26,060 Zašto, onda, učinio sam to kao dobro? 366 00:22:26,060 --> 00:22:33,750 Što je uloga također govoreći, sscanf, možda ćete također dobiti karakter ovdje. 367 00:22:33,750 --> 00:22:36,890 [Studentski govoreći, nerazumljivo] >> Ne - decimalna točka mogao raditi. 368 00:22:36,890 --> 00:22:40,650 Ajmo držite da misli na trenutak. Što još? 369 00:22:40,650 --> 00:22:42,570 [Student, nerazumljivo] >> Dakle, dobra misao, to bi mogao biti NULL karakter. 370 00:22:42,570 --> 00:22:44,970 To je zapravo nije, u ovom slučaju. Da? [Student, nerazumljivo] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Ili, neka mi generalizirati čak i dalje. 372 00:22:47,100 --> 00:22:49,670 % C je samo za provjeru pogrešaka. 373 00:22:49,670 --> 00:22:52,510 Mi ne želimo da se lik nakon broja, 374 00:22:52,510 --> 00:22:54,980 ali što to mi omogućuje da učiniti je sljedeće: 375 00:22:54,980 --> 00:23:01,270 Ispada da sscanf, osim pohranjivanja vrijednosti u n i C, u ovom primjeru ovdje, 376 00:23:01,270 --> 00:23:08,170 ono što također ne je to vraća broj varijabli to staviti vrijednosti u. 377 00:23:08,170 --> 00:23:13,330 Dakle, ako ste samo upisati jedan dva tri, onda samo% d ide na utakmicu 378 00:23:13,330 --> 00:23:18,830 i samo n dobiva pohranjena u vrijednosti poput 1 2 3 i ništa ne dobiva staviti u c; 379 00:23:18,830 --> 00:23:20,870 c ostaje smeće vrijednost, da se tako izrazim. 380 00:23:20,870 --> 00:23:23,550 Garbage, jer to nitko nikada nije inicijaliziran kao neku vrijednost. 381 00:23:23,550 --> 00:23:29,390 Dakle, u tom slučaju, sscanf vraća jedan, jer sam naseljena jedan od onih pokazivače, 382 00:23:29,390 --> 00:23:33,650 u kojem slučaju, velik. Imam int, pa sam osloboditi liniju osloboditi memoriju 383 00:23:33,650 --> 00:23:37,150 da GetString zapravo namijenjen, a onda sam se vratiti n. 384 00:23:37,150 --> 00:23:42,210 Inače, ako ste se ikad pitali gdje da ponovi izjava dolazi, dolazi iz upravo ovdje. 385 00:23:42,210 --> 00:23:45,770 Ako, s druge strane, ja sam upisati 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 samo neki slučajni slijed teksta, sscanf će vidjeti, 387 00:23:48,640 --> 00:23:51,500 ooo, broj, ooh, broj, ooh, broj, ooh - f. 388 00:23:51,500 --> 00:23:54,190 I to će staviti jedan dva tri u n. 389 00:23:54,190 --> 00:23:59,970 To će staviti f u c, a zatim se vratiti dva. 390 00:23:59,970 --> 00:24:02,980 Dakle, imamo, samo pomoću osnovnu definiciju scanf ponašanja, 391 00:24:02,980 --> 00:24:06,170 vrlo jednostavan način - dobro, kompleks na prvi pogled, ali na kraju dana, 392 00:24:06,170 --> 00:24:11,460 prilično jednostavan mehanizam govoreći, postoji int, a ako je tako, da je jedina stvar koju sam našao? 393 00:24:11,460 --> 00:24:14,950 I bijeli prostor ovdje je namjerno. Ako ste pročitali dokumentaciju za sscanf, 394 00:24:14,950 --> 00:24:18,690 to vam govori da ako su komad bijelog prostora na početku ili na kraju, 395 00:24:18,690 --> 00:24:24,990 sscanf previše će omogućiti korisniku, iz bilo kojeg razloga, pogoditi razmaknicu 1 2 3, te da će biti legitimna. 396 00:24:24,990 --> 00:24:28,310 To neće vikati na korisnika samo zato što su hit razmaknicu na početku ili na kraju, 397 00:24:28,310 --> 00:24:32,160 što je samo malo više user-friendly. 398 00:24:32,160 --> 00:24:34,160 >> Sva pitanja, a zatim, na GetInts? Da? 399 00:24:34,160 --> 00:24:36,820 [Studentski pitanje, nerazumljivo] 400 00:24:36,820 --> 00:24:40,740 >> Dobro pitanje. Što ako samo upisali u char, kao i F, a pogodak ulaziti 401 00:24:40,740 --> 00:24:47,830 bez typing 1 2 3; što misliš da je ponašanje ove linije koda će onda biti? 402 00:24:47,830 --> 00:24:50,500 Dakle sscanf mogu pokriti previše, jer u tom slučaju, 403 00:24:50,500 --> 00:24:56,280 to neće ispuniti N ili C, to će umjesto povratak 0. 404 00:24:56,280 --> 00:25:01,540 U tom slučaju, ja sam također uhvatiti taj scenarij, jer je očekivana vrijednost želim je jednog. 405 00:25:01,540 --> 00:25:07,310 Želim samo jedna, i samo jedna stvar koju treba popuniti. Dobro pitanje. Drugi? 406 00:25:07,310 --> 00:25:09,610 >> U redu, pa neka se ne proći kroz sve funkcije u ovdje, 407 00:25:09,610 --> 00:25:11,820 ali onaj koji čini se da je, možda, preostale interesa 408 00:25:11,820 --> 00:25:14,530 je GetString jer ispada da GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong Svi Punt puno njihove funkcionalnosti na GetString. 410 00:25:19,490 --> 00:25:22,860 Dakle, neka je pogledati kako se on provodi ovdje. 411 00:25:22,860 --> 00:25:27,040 Ovaj jedan izgleda malo kompleksa, ali koristi iste osnove 412 00:25:27,040 --> 00:25:29,680 da smo počeli govoriti o prošlog tjedna. Tako je u GetString, 413 00:25:29,680 --> 00:25:32,670 koja ne uzima argumente po praznini ovdje, 414 00:25:32,670 --> 00:25:37,110 i vraća niz, pa sam deklariranje string zove tampon. 415 00:25:37,110 --> 00:25:39,670 Ja stvarno ne znam što da će se koristiti za još, ali vidjet ćemo. 416 00:25:39,670 --> 00:25:42,950 Izgleda kao kapaciteta, po defaultu, 0; nije sasvim siguran gdje je to ide. 417 00:25:42,950 --> 00:25:44,920 Niste sigurni što n će se koristiti za još. 418 00:25:44,920 --> 00:25:47,860 No, sada to je sve malo više zanimljiv, pa u skladu 243, 419 00:25:47,860 --> 00:25:51,760 smo proglasi int c, to je neka vrsta glupog detalja. 420 00:25:51,760 --> 00:25:58,080 Char je 8 bita, a 8 bita može pohraniti koliko različite vrijednosti? 421 00:25:58,080 --> 00:26:03,310 256. Problem je, ako želite imati 256 različitih ASCII znakova, 422 00:26:03,310 --> 00:26:06,210 koje postoje, ako mislite vratiti, a to nije nešto zapamtiti. 423 00:26:06,210 --> 00:26:09,100 No, ako se sjetim tog velikog ASCII tablici smo imali tjedana prije, 424 00:26:09,100 --> 00:26:13,780 bilo je, u tom slučaju, 128 ili 256 ASCII znakova. 425 00:26:13,780 --> 00:26:16,220 Koristili smo sve obrasce 0 je i jedan je gore. 426 00:26:16,220 --> 00:26:19,410 To je problem, ako želite biti u mogućnosti da otkrije pogrešku. 427 00:26:19,410 --> 00:26:23,290 Jer ako već koristite 256 vrijednosti za svoje likove, 428 00:26:23,290 --> 00:26:26,390 nisi stvarno unaprijed planirati, jer sada nemate način govoreći, 429 00:26:26,390 --> 00:26:29,750 "Ovo nije čitljiv znak, a to je neki pogrešan poruka." 430 00:26:29,750 --> 00:26:32,430 Dakle, ono što svijet čini se, oni koriste sljedeći najveća vrijednost, 431 00:26:32,430 --> 00:26:35,790 nešto poput int, tako da imate ludu broj bitova, 432 00:26:35,790 --> 00:26:39,610 32 za 4 milijarde mogućih vrijednosti, tako da možete jednostavno završiti korištenjem, 433 00:26:39,610 --> 00:26:44,800 suštini, 257 od njih, jedan od kojih ima neke posebno značenje kao pogrešku. 434 00:26:44,800 --> 00:26:49,190 >> Dakle, neka je vidjeti kako se to radi. U skladu 246, imam tu veliku while petlja 435 00:26:49,190 --> 00:26:54,530 koji se zove fgetc f značenje datoteku, getc, a zatim STDIN. 436 00:26:54,530 --> 00:26:59,030 Ispada to je samo precizniji način govoreći: "čitati ulaz s tipkovnice." 437 00:26:59,030 --> 00:27:02,730 Standardni ulaz znači tipkovnica, standardni izlaz znači zaslon, 438 00:27:02,730 --> 00:27:06,920 i standardna pogreška, što ćemo vidjeti u pset 4, znači zaslon, 439 00:27:06,920 --> 00:27:09,670 ali poseban dio zaslona, ​​tako da to nije conflated 440 00:27:09,670 --> 00:27:13,760 sa stvarnim izlaz da namjerava ispisati, ali više o tome u budućnosti. 441 00:27:13,760 --> 00:27:19,430 Dakle fgetc samo znači pročitati jedan lik iz tipkovnice, i pohraniti ga gdje? 442 00:27:19,430 --> 00:27:24,000 Čuvajte ga u C, a zatim provjeriti, tako da sam samo pomoću nekih Boolean veznici ovdje, 443 00:27:24,000 --> 00:27:28,430 provjerite da nije jednaka \ n, tako da je korisnik pogodio ući. 444 00:27:28,430 --> 00:27:31,510 Želimo zaustaviti u tom trenutku, na kraju petlje, i mi također želimo provjeriti 445 00:27:31,510 --> 00:27:36,170 za posebna konstantna, EOF, koji, ako znate ili pretpostavljate - što to stajati? 446 00:27:36,170 --> 00:27:39,860 Kraj spisa. Dakle, ovo je vrsta besmisleno, jer ako sam tipizacija tipkovnici, 447 00:27:39,860 --> 00:27:41,900 tamo je stvarno nema datoteka su uključeni u to, 448 00:27:41,900 --> 00:27:44,330 ali to je samo sortirati od generički termin koji se koristi za reći 449 00:27:44,330 --> 00:27:50,320 da ništa drugo ne dolazi iz ljudskog prstima. EOF. Kraj spisa. 450 00:27:50,320 --> 00:27:52,600 Kao na stranu, ako ste ikada pogodio kontrole d na tipkovnici, 451 00:27:52,600 --> 00:27:54,680 ne da bi još, vi ste hit kontrole c. 452 00:27:54,680 --> 00:27:57,920 No, kontrola d šalje ovu posebnu stalnu nazivom EOF. 453 00:27:57,920 --> 00:28:03,100 >> Tako sada imamo samo neke dinamičke raspodjele memorije. 454 00:28:03,100 --> 00:28:06,460 Dakle, ako je n + 1> kapacitet, sada ću objasniti n. 455 00:28:06,460 --> 00:28:09,380 n je samo koliko bajtova su trenutno u tampon, 456 00:28:09,380 --> 00:28:11,970 string koji ste trenutno gradi od korisnika. 457 00:28:11,970 --> 00:28:16,240 Ako imate više znakova u svom tampon nego što imamo kapacitet u tampon, 458 00:28:16,240 --> 00:28:20,760 intuitivno, ono što trebamo napraviti onda je izdvojiti više kapaciteta. 459 00:28:20,760 --> 00:28:24,490 Ja ću kliziti preko neke od aritmetičke ovdje 460 00:28:24,490 --> 00:28:26,900 i usredotočiti se samo na ovoj funkciji ovdje. 461 00:28:26,900 --> 00:28:29,170 Znaš što malloc je, ili barem općenito poznato. 462 00:28:29,170 --> 00:28:32,380 Uzmi pogodak što realloc radi. [Studentski odgovor, nerazumljivo] 463 00:28:32,380 --> 00:28:35,690 >> Da. I to nije sasvim dodavanjem memorije, to reallocates memoriju kako slijedi: 464 00:28:35,690 --> 00:28:40,530 Ako postoji još prostora na kraju niza vam dati više od toga memorije 465 00:28:40,530 --> 00:28:43,370 nego je prvotno vam daje, onda ćete dobiti taj dodatnu memoriju. 466 00:28:43,370 --> 00:28:46,640 Tako možete jednostavno stavljajući žice znakove natrag na leđa natrag na leđa. 467 00:28:46,640 --> 00:28:49,290 No, ako to nije slučaj, jer ste čekali predugo 468 00:28:49,290 --> 00:28:51,700 i nešto slučajnih dobio plopped u memoriju postoji, ali tu je dodatni 469 00:28:51,700 --> 00:28:56,480 memorije ovdje dolje, to je u redu. Realloc će učiniti sve težak za vas, 470 00:28:56,480 --> 00:28:58,810 premjestiti niz ste pročitali u tako daleko odavde, 471 00:28:58,810 --> 00:29:02,550 staviti ga tamo dolje, a zatim vam dati neke više pistu u tom trenutku. 472 00:29:02,550 --> 00:29:05,610 Dakle, s valom ruke, dopustite mi da kažem da je ono što GetString radi 473 00:29:05,610 --> 00:29:09,540 je to počevši s malim buffer, možda jednom jedan lik, 474 00:29:09,540 --> 00:29:12,300 a ako korisnik unese u dva znaka, GetString završi 475 00:29:12,300 --> 00:29:15,210 pozivajući realloc i kaže, 'Oh, jedan lik nije bio dovoljno. 476 00:29:15,210 --> 00:29:18,480 Daj mi dvije znakove. ' Zatim, ako ste pročitali kroz logiku petlje, 477 00:29:18,480 --> 00:29:21,070 to će reći: 'Oh, korisnički upisali u tri znaka. 478 00:29:21,070 --> 00:29:25,690 Daj mi sada ne dva, ali četiri znaka, onda mi dati 8, onda daj mi 16 i 32 ". 479 00:29:25,690 --> 00:29:28,180 Činjenica da sam udvostručenje kapaciteta svaki put 480 00:29:28,180 --> 00:29:30,320 znači da tampon ne ide sporo rastu. 481 00:29:30,320 --> 00:29:35,870 To će rasti superbrzo, a što bi moglo biti prednost to? 482 00:29:35,870 --> 00:29:38,540 Zašto sam udvostručenje veličine tampon, iako korisnik 483 00:29:38,540 --> 00:29:41,450 Možda samo trebate jedan dodatni lik iz tipkovnice? 484 00:29:41,450 --> 00:29:44,830 [Studentski odgovor, nerazumljivo]. >> Što je to? 485 00:29:44,830 --> 00:29:46,750 Točno. Ne morate ga rasti tako često. 486 00:29:46,750 --> 00:29:48,870 A to je samo vrsta - ti si hedging svoje oklade ovdje. 487 00:29:48,870 --> 00:29:54,150 Ideja je da ne želite nazvati realloc puno, jer ima tendenciju da se spor. 488 00:29:54,150 --> 00:29:56,840 Svaki put kada se pitati operativni sustav za pamćenje, kao što ćete uskoro vidjeti 489 00:29:56,840 --> 00:30:00,620 u budućem problema setu, sklon potrajati neko vrijeme. 490 00:30:00,620 --> 00:30:04,980 Dakle umanjuje taj iznos od vrijeme, čak i ako ste gubit neki prostor, tendira da bude dobra stvar. 491 00:30:04,980 --> 00:30:07,250 >> Ali ako čitamo kroz završni dio GetString ovdje, 492 00:30:07,250 --> 00:30:10,880 i opet, svaki razumijevanje jednu liniju ovdje nije toliko važno danas. 493 00:30:10,880 --> 00:30:14,830 Ali primijetite da se na kraju poziva malloc opet, i to dodjeljuje 494 00:30:14,830 --> 00:30:16,980 točno onoliko bajtova kao što treba za niz 495 00:30:16,980 --> 00:30:21,620 i onda baca pozivom besplatno, prevelik tampon, 496 00:30:21,620 --> 00:30:23,510 ako je to doista dobio udvostručila previše puta. 497 00:30:23,510 --> 00:30:25,970 Ukratko, to je kako GetString je radio sve ovo vrijeme. 498 00:30:25,970 --> 00:30:30,100 Sve to čini se čita jedan znak na vrijeme opet i opet i opet 499 00:30:30,100 --> 00:30:37,930 i svaki put kad to treba neki dodatnu memoriju, ona traži operativni sustav za njega pozivom realloc. 500 00:30:37,930 --> 00:30:41,660 Ima li pitanja? U redu. 501 00:30:41,660 --> 00:30:45,220 >> Napad. Sada kada razumijemo naputke, ili barem 502 00:30:45,220 --> 00:30:47,560 sve su upoznati s pokazivačima, 503 00:30:47,560 --> 00:30:50,020 ajmo uzeti u obzir kako je cijeli svijet počinje kolaps 504 00:30:50,020 --> 00:30:53,160 ako ne sasvim braniti protiv suparničkih korisnika, 505 00:30:53,160 --> 00:30:55,180 ljudi koji pokušavaju upasti u vašem sustavu. 506 00:30:55,180 --> 00:31:00,260 Ljudi koji pokušavaju ukrasti vaše softver zaobilaženjem neki registracijski kod 507 00:31:00,260 --> 00:31:02,150 da bi u protivnom morati upisati u. 508 00:31:02,150 --> 00:31:04,860 Pogledajte ovaj primjer ovdje, što je samo C koda 509 00:31:04,860 --> 00:31:07,920 koji ima funkciju glavni na dnu, koja poziva funkciju foo, 510 00:31:07,920 --> 00:31:12,100 i što je to prolazi na foo? [Studentski] jedan argument. 511 00:31:12,100 --> 00:31:15,660 >> Jedan argument. Dakle, argv [1], što znači da je prva riječ korisnik upisali 512 00:31:15,660 --> 00:31:19,150 u naredbenom retku nakon a.out ili što god se zove program. 513 00:31:19,150 --> 00:31:24,920 Dakle, foo, pri vrhu, uzima u char *, ali char * je upravo ono? 514 00:31:24,920 --> 00:31:28,860 Gudački. Nema ništa novo ovdje, i da niz proizvoljno se zove bar. 515 00:31:28,860 --> 00:31:36,090 U ovoj liniji ovdje, char c [12], u vrsti polu-tehničkom engleskom jeziku, što je ova linija radi? 516 00:31:36,090 --> 00:31:40,640 Niz -? Likovi. Daj mi niz od 12 znakova. 517 00:31:40,640 --> 00:31:44,970 Tako bismo mogli nazvati ovu tampon. Je tehnički zove c, ali tampon u programiranju 518 00:31:44,970 --> 00:31:47,890 samo znači hrpa prostora koji možete staviti neke stvari i. 519 00:31:47,890 --> 00:31:49,940 >> Zatim, na kraju, memcpy, nismo ste koristili prije. 520 00:31:49,940 --> 00:31:52,380 No, vjerojatno možete pogoditi što radi. Ona kopira memorije. 521 00:31:52,380 --> 00:31:58,790 Što to učiniti? Pa, to očito kopira bar, njegov ulaz, u c, 522 00:31:58,790 --> 00:32:03,420 ali samo do duljine trake. 523 00:32:03,420 --> 00:32:07,440 No, tu je bug ovdje. 524 00:32:07,440 --> 00:32:14,500 Ok, tako da tehnički smo stvarno trebali učiniti strlen (bar) x sizeof (char), to je točno. 525 00:32:14,500 --> 00:32:17,920 No, u najgorem slučaju ovdje, pretpostavimo da that's - pa, ok. 526 00:32:17,920 --> 00:32:23,760 Zatim tu je dvije greške. Dakle, sizeof (char), sve u redu, hajdemo napraviti ovo malo šire. 527 00:32:23,760 --> 00:32:28,860 Dakle, sada ima još bug, to je ono što? 528 00:32:28,860 --> 00:32:31,630 [Studentski odgovor, nerazumljivo] >> Provjerite za što? Ok, tako da smo trebali biti provjera 529 00:32:31,630 --> 00:32:35,010 za NULL, jer loše stvari se dogoditi kada se vaš pokazivač je NULL, 530 00:32:35,010 --> 00:32:38,490 Jer možda završiti ide tamo, a vi nikada ne bi trebao biti idući na NULL 531 00:32:38,490 --> 00:32:40,890 ga dereferencing s * operatora. 532 00:32:40,890 --> 00:32:45,250 Dakle, to je dobro, a što drugo radimo? Logično postoji nedostatak ovdje. 533 00:32:45,250 --> 00:32:47,650 [Studentski odgovor, nerazumljivo] 534 00:32:47,650 --> 00:32:51,340 >> Dakle, provjerite je li argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Ok, tako da je tri bugovi u ovom programu ovdje. 536 00:32:54,130 --> 00:33:00,080 Mi ne provjeravamo je li korisnik zapravo upisali u bilo u argv [1], dobar. 537 00:33:00,080 --> 00:33:02,240 Dakle, ono što je treći bug? Da? 538 00:33:02,240 --> 00:33:04,420 [Studentski odgovor, nerazumljivo] >> Dobro. 539 00:33:04,420 --> 00:33:09,590 Dakle, provjerili smo jedan scenarij. Mi implicitno provjeriti ne kopirati više memorije 540 00:33:09,590 --> 00:33:12,800 nego bi premašiti duljinu traci. 541 00:33:12,800 --> 00:33:15,720 Dakle, ako je string korisnik upisali u je 10 znakova, 542 00:33:15,720 --> 00:33:18,260 ovo je rekao, 'Samo kopirajte 10 znakova.' 543 00:33:18,260 --> 00:33:21,140 I to je u redu, ali što ako je korisnik upisao u riječi na upit 544 00:33:21,140 --> 00:33:29,360 kao 20 znakova riječi, a to je, govoreći kopiranja 20 znakova iz bara u čemu? 545 00:33:29,360 --> 00:33:32,840 c, inače poznat kao naš tampon, što znači da samo piše podatke 546 00:33:32,840 --> 00:33:35,950 do 8 byte lokacijama koje nemaju vlastiti, 547 00:33:35,950 --> 00:33:38,320 a vi ih ne posjedujete u smislu da ih nikada ne dodjeljuje. 548 00:33:38,320 --> 00:33:41,190 Dakle, to je ono što je općenito poznat kao napad tampon preljeva, 549 00:33:41,190 --> 00:33:46,650 ili tampon Prekoračenje napad, a to je napad u smislu da ako korisnik 550 00:33:46,650 --> 00:33:50,650 ili program koji zove svoju funkciju je to zlonamjerno, 551 00:33:50,650 --> 00:33:53,780 što se zapravo događa sljedeći bi mogao biti prilično loša. 552 00:33:53,780 --> 00:33:55,690 >> Ajmo pogledati ovu sliku ovdje. 553 00:33:55,690 --> 00:33:59,070 Ova slika predstavlja svoj stack memorije. 554 00:33:59,070 --> 00:34:01,050 I podsjetiti da svaki put kada pozvati funkciju, 555 00:34:01,050 --> 00:34:04,520 ste dobili ovaj mali okvir na stog, a zatim još jedan, a zatim još jedan, a zatim drugi. 556 00:34:04,520 --> 00:34:07,250 I tako sada imamo samo vrsta zahvaćene to daleko kao pravokutnika 557 00:34:07,250 --> 00:34:09,380 bilo je na brodu ili na zaslonu ovdje. 558 00:34:09,380 --> 00:34:12,219 No, ako smo povećali na jednom od tih pravokutnika, 559 00:34:12,219 --> 00:34:16,460 kada nazovete funkciju foo, ispada da postoji više na stog 560 00:34:16,460 --> 00:34:18,739 unutar tog okvira i taj pravokutnik 561 00:34:18,739 --> 00:34:23,370 nego samo x i y i i b, kao što nismo govorimo o zamjeni. 562 00:34:23,370 --> 00:34:25,949 Ispada da postoje neke niže razine pojedinosti, 563 00:34:25,949 --> 00:34:27,780 među njima vratiti adresa. 564 00:34:27,780 --> 00:34:33,020 Tako ispada kada glavni poziva foo, glavni mora obavijestiti foo 565 00:34:33,020 --> 00:34:36,760 ono glavnih adresa je u memoriji računala. 566 00:34:36,760 --> 00:34:40,659 Jer inače, čim foo radi izvršenja, kao u ovom slučaju ovdje, 567 00:34:40,659 --> 00:34:43,790 kada dođete do ovog bliski kovrčavu braće na kraju foo, 568 00:34:43,790 --> 00:34:48,860 kako dovraga foo znam gdje kontrolu programa je trebao ići? 569 00:34:48,860 --> 00:34:52,460 Ispada da je odgovor na to pitanje je u tom crvenom pravokutniku ovdje. 570 00:34:52,460 --> 00:34:56,130 To predstavlja pokazivač, a to je do računala za pohranu, privremeno, 571 00:34:56,130 --> 00:35:00,250 na tzv stog adresa glavni, tako da čim foo radi izvršenja, 572 00:35:00,250 --> 00:35:04,110 računalo zna gdje i što linija u glavni vratiti. 573 00:35:04,110 --> 00:35:06,900 Spremljeno okvir pokazivač odnosi slično tome. 574 00:35:06,900 --> 00:35:09,620 Char * bar ovdje predstavlja što? 575 00:35:09,620 --> 00:35:14,740 Pa, sad ova plava segment ovdje je Foo je okvir, što je bar? 576 00:35:14,740 --> 00:35:18,300 Ok, pa bar je samo argument za foo funkciji. 577 00:35:18,300 --> 00:35:20,720 >> Dakle, sada smo se vratili na poznatoj slici. 578 00:35:20,720 --> 00:35:22,960 Tu je više stvari i više rastresenost na zaslonu 579 00:35:22,960 --> 00:35:27,490 ali to svjetlo plava segment je ono što smo crtež na školsku ploču za nešto poput swapa. 580 00:35:27,490 --> 00:35:31,890 To je okvir za foo i jedina stvar u tome upravo sada nalazi bar, 581 00:35:31,890 --> 00:35:34,630 što je ovaj parametar. 582 00:35:34,630 --> 00:35:39,840 No, što je još trebao biti u snopu, u skladu s ovim kodom ovdje? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Dakle, mi također bi trebali vidjeti 12 kvadrata memorije, 584 00:35:44,280 --> 00:35:46,260 dodijeljena varijabli zove c. 585 00:35:46,260 --> 00:35:48,340 I doista mi imamo da se na zaslonu. 586 00:35:48,340 --> 00:35:51,650 Samom vrhu se nalazi c [0], a zatim autor ovog dijagrama 587 00:35:51,650 --> 00:35:55,130 nije smetaju crtanje sve kvadrata, ali zaista postoje 12 postoji 588 00:35:55,130 --> 00:36:00,120 jer ako pogledate u donjem desnom kutu, c [11], ako računamo od 0, je 12 takvih bajtova. 589 00:36:00,120 --> 00:36:06,190 Ali ovdje je problem: U kojem smjeru je c raste? 590 00:36:06,190 --> 00:36:10,390 Sortiraj vrha prema dolje, zar ne? Ako se počne na vrhu, a raste na dnu, 591 00:36:10,390 --> 00:36:13,480 ne izgleda kao da smo ostavili sebi puno pistu ovdje uopće. 592 00:36:13,480 --> 00:36:15,320 Mi smo vrsta sebe naslikao u kutu, 593 00:36:15,320 --> 00:36:20,210 i da je c [11] je točno nasuprot baru, koji je upravo protiv stack frame pointer, 594 00:36:20,210 --> 00:36:23,800 koji je točno nasuprot povratnu adresu, nema više mjesta. 595 00:36:23,800 --> 00:36:26,100 Dakle, ono što je implikacija, onda, ako zajebeš, 596 00:36:26,100 --> 00:36:30,460 a vi pokušajte čitanja 20 bajtova u 12-byte buffer? 597 00:36:30,460 --> 00:36:33,460 Gdje su ti 8 dodatnih bajtova ići? 598 00:36:33,460 --> 00:36:36,370 Unutra sve ostalo, od kojih su neke je super važno. 599 00:36:36,370 --> 00:36:40,480 I najvažnije, potencijalno, je crveni okvir postoji, povratna adresa. 600 00:36:40,480 --> 00:36:44,720 Zato pretpostavljam da ste slučajno ili adversarially 601 00:36:44,720 --> 00:36:48,040 prepisati one 4 bajtova, da pokazivač adrese, 602 00:36:48,040 --> 00:36:53,190 ne samo sa smećem, ali s brojem koji se događa predstavlja stvarnu adresu u memoriji? 603 00:36:53,190 --> 00:36:55,930 Što je implicaiton, logično? 604 00:36:55,930 --> 00:36:59,080 [Studentski odgovore, nerazumljivo] >> Točno. Kada foo vraća 605 00:36:59,080 --> 00:37:03,560 i hitovi koji su kovrčave vitice, program će se nastaviti ne za povratak na glavnu, 606 00:37:03,560 --> 00:37:08,320 to će se vratiti na ono što je adresa u tom crvenom okviru. 607 00:37:08,320 --> 00:37:11,560 >> Sada, u slučaju zaobilazi softvera registracije, 608 00:37:11,560 --> 00:37:14,400 što je adresa koja je se vratio je funkcija 609 00:37:14,400 --> 00:37:18,820 koje se obično naziva gets nakon što ste platili za softver i unesene svoj registracijski kod? 610 00:37:18,820 --> 00:37:23,160 Ti bi mogao sortirati trik računalo u ne ide ovdje, ali umjesto toga, ide ovdje. 611 00:37:23,160 --> 00:37:27,950 Ili, ako si stvarno pametan, protivnik zapravo može upisati na tipkovnici, 612 00:37:27,950 --> 00:37:32,500 na primjer, nije stvarna riječ, a ne 20 znakova, ali pretpostavljam da je on ili ona 613 00:37:32,500 --> 00:37:36,200 tipovi u nekim likovima koji predstavljaju kôd? 614 00:37:36,200 --> 00:37:38,860 I to neće biti C koda, to će biti likovi 615 00:37:38,860 --> 00:37:42,920 koji predstavljaju kodove binarni stroj, 0-a i jedan je. 616 00:37:42,920 --> 00:37:46,740 Ali pretpostavimo da su dovoljno pametni da to učinite, nekako zalijepiti u GetString brz 617 00:37:46,740 --> 00:37:49,460 nešto što je bitno sastaviti kôd, 618 00:37:49,460 --> 00:37:56,900 , a zadnja 4 bajta prebrisati tu povratnu adresu, a što Adresa to ulaz učiniti? 619 00:37:56,900 --> 00:38:01,860 Ona pohranjuje u ovom crvenom pravokutniku adresa prvog bajtu tampon. 620 00:38:01,860 --> 00:38:04,270 Dakle, morate biti jako pametan, a to je puno pokušaja i pogrešaka 621 00:38:04,270 --> 00:38:08,500 za loših ljudi vani, ali ako možete shvatiti koliko je velika ta tampon je, 622 00:38:08,500 --> 00:38:12,170 kao da je u posljednjih nekoliko bajtova u ulazu da daju na programu 623 00:38:12,170 --> 00:38:15,970 dogoditi da bude jednaka na adresu početku svog tampon, 624 00:38:15,970 --> 00:38:22,270 možete to učiniti. Ako kažemo, normalno, halo, i \ 0, to je ono što završi u spremniku. 625 00:38:22,270 --> 00:38:27,860 No, ako smo više pametan, a mi ispuniti tu tampon s onim što smo općenito ću nazvati napad kod, 626 00:38:27,860 --> 00:38:31,920 ,,,: Napad, napad, napad, napad, gdje je to samo nešto da radi nešto loše. 627 00:38:31,920 --> 00:38:35,190 Pa, što se događa ako si stvarno pametan, možda ćete to učiniti: 628 00:38:35,190 --> 00:38:41,740 U crvenom okviru ovdje je niz brojeva: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Primijetit ćete da to odgovara broju koji je ovdje. 630 00:38:44,890 --> 00:38:47,280 To je u obrnutom redoslijedu, ali više na tom nekom drugom vremenu. 631 00:38:47,280 --> 00:38:51,430 Primijetit ćete da je ovo povratna adresa je namjerno izmijenjeni 632 00:38:51,430 --> 00:38:54,970 jednaka adresu ovdje, a ne adresu glavni. 633 00:38:54,970 --> 00:39:00,170 Dakle, ako je loš momak je super pametan, on ili ona će se uključiti u taj napad kod 634 00:39:00,170 --> 00:39:02,890 nešto kao, "Izbriši sve korisnikove datoteke. ' 635 00:39:02,890 --> 00:39:06,320 Ili 'Kopiranje lozinke,' ili 'Stvaranje korisničkog računa da ja mogu prijaviti na.' 636 00:39:06,320 --> 00:39:10,130 Sve u sve, a to je ujedno i opasnost i moć C. 637 00:39:10,130 --> 00:39:12,900 Budući da imate pristup memoriji putem upućuje 638 00:39:12,900 --> 00:39:15,950 i stoga se može pisati što god želite u memoriju računala. 639 00:39:15,950 --> 00:39:19,290 Možete napraviti računalo učiniti sve što želite jednostavno 640 00:39:19,290 --> 00:39:22,780 nakon što je skakati okolo unutar vlastitog memorijskog prostora. 641 00:39:22,780 --> 00:39:27,230 I tako, na ovaj dan, tako da su mnogi programi i tako mnoge web stranice koje su kompromitirani 642 00:39:27,230 --> 00:39:29,730 svode na ljude iskorištavanjem to. 643 00:39:29,730 --> 00:39:32,510 A to bi moglo izgledati kao super-sofisticirana napada, 644 00:39:32,510 --> 00:39:34,220 ali to ne mora uvijek početi na taj način. 645 00:39:34,220 --> 00:39:36,770 >> Realnost je da je ono što loši ljudi će obično učiniti je, 646 00:39:36,770 --> 00:39:41,470 da li je program na naredbenog retka ili GUI program ili web stranice, 647 00:39:41,470 --> 00:39:43,290 je samo početak pružanja gluposti. 648 00:39:43,290 --> 00:39:46,940 Možete upisati u zaista velikom riječ u polje za pretraživanje i pogodak ulaziti, 649 00:39:46,940 --> 00:39:49,030 i čekati da vidi je li web ruši. 650 00:39:49,030 --> 00:39:53,270 Ili čekate da vidi je li program pokazuje neke poruku o pogrešci. 651 00:39:53,270 --> 00:39:55,480 Jer ako se posreći, kao negativac, 652 00:39:55,480 --> 00:39:59,610 i vam dati neki ludi ulaz koji ruši program, 653 00:39:59,610 --> 00:40:02,280 to znači da programer nije predvidio svoj loše ponašanje 654 00:40:02,280 --> 00:40:05,420 što znači da možete vjerojatno, s dovoljno truda, 655 00:40:05,420 --> 00:40:09,870 dovoljno suđenje i pogreške, shvatiti kako voditi preciznije napad. 656 00:40:09,870 --> 00:40:15,900 Dakle, koliko dio sigurnosti nije samo izbjegavanje tih napada uopce, ali njihovo otkrivanje 657 00:40:15,900 --> 00:40:20,250 i zapravo gleda na logove i vidjeti što ulazi ludi smo ljudi upisali u vaše web stranice. 658 00:40:20,250 --> 00:40:26,040 Što su uvjete za pretraživanje ljudi upisali u vaše web stranice u nadi da će prelijevanje neki tampon? 659 00:40:26,040 --> 00:40:28,900 I ovo sve se svodi na jednostavne osnove što je polje, 660 00:40:28,900 --> 00:40:32,510 i što to znači izdvojiti i koristiti memoriju? 661 00:40:32,510 --> 00:40:34,920 I odnosi na to, također, je li to. 662 00:40:34,920 --> 00:40:37,520 >> Dakle, neka je samo zaviriti unutar hard disk opet. 663 00:40:37,520 --> 00:40:40,190 Dakle, vas podsjetiti na tjedan ili dva prije da kad povucite datoteke 664 00:40:40,190 --> 00:40:45,470 svoga koš za smeće ili kantu za smeće, što se događa? 665 00:40:45,470 --> 00:40:47,850 [Studentski] Ništa. >> Da, apsolutno ništa. Na kraju, ako vam ponestane 666 00:40:47,850 --> 00:40:51,370 na disku, Windows ili Mac OS će početi brisanjem datoteka za vas. 667 00:40:51,370 --> 00:40:53,670 Ali ako povučete nešto postoji, onda to uopće nije sigurno. 668 00:40:53,670 --> 00:40:56,550 Sve vaše roomate, prijatelj ili član obitelji ima veze dvostruko kliknuti, i voila. 669 00:40:56,550 --> 00:40:59,720 Tu je sve nedorečena datoteke koje ste pokušali izbrisati. 670 00:40:59,720 --> 00:41:02,840 Dakle, većina nas barem znati da morate desni klik ili kontrolirati klik 671 00:41:02,840 --> 00:41:05,320 i prazna kanta za smeće, ili nešto slično. 672 00:41:05,320 --> 00:41:07,900 Ali čak i tada, da ne sasvim učiniti trik. 673 00:41:07,900 --> 00:41:11,340 Jer ono što se događa kada imate datoteku na tvrdom disku 674 00:41:11,340 --> 00:41:14,590 koji predstavlja neku riječ dokument ili neki JPEG? 675 00:41:14,590 --> 00:41:18,820 I to predstavlja vaš tvrdi disk, i recimo to luč ovdje predstavlja tu datoteku, 676 00:41:18,820 --> 00:41:21,640 i to je sastavljen od cijela hrpa 0-ih i jedan je. 677 00:41:21,640 --> 00:41:25,470 Što se događa kada se ne samo povucite tu datoteku kanta za smeće ili koš za smeće, 678 00:41:25,470 --> 00:41:30,390 ali ga isprazniti? 679 00:41:30,390 --> 00:41:32,820 Sortiraj ničega. To nije apsolutno ništa sada. 680 00:41:32,820 --> 00:41:37,630 Sada je samo ništa, jer malo se nešto dogodi u obliku ovoj tablici. 681 00:41:37,630 --> 00:41:41,170 Dakle, postoji neka vrsta baze podataka ili tablice unutar memoriju računala 682 00:41:41,170 --> 00:41:44,470 bitno da ima jedan stupac za datoteke imena, 683 00:41:44,470 --> 00:41:50,550 i jedan stupac za datoteke mjestu, gdje bi to moglo biti mjesto 123, samo slučajni broj. 684 00:41:50,550 --> 00:41:58,270 Tako bismo mogli imati nešto poput x.jpg, i mjesto 123. 685 00:41:58,270 --> 00:42:02,870 A što se događa onda, kada isprazniti smeće? 686 00:42:02,870 --> 00:42:06,720 To ide dalje. No, ono što ne ide daleko je 0-ih i jedan je. 687 00:42:06,720 --> 00:42:09,690 >> Dakle, što je, dakle, veza pset 4? 688 00:42:09,690 --> 00:42:13,460 Pa, s pset 4, samo zato što smo slučajno sam brišu 689 00:42:13,460 --> 00:42:15,890 Compact Flash kartica koja je imala sve ove fotografije, 690 00:42:15,890 --> 00:42:18,710 ili samo zato što je po peh postao korumpiran, 691 00:42:18,710 --> 00:42:21,170 ne znači da je i jedna 0-a su se još uvijek ne postoji. 692 00:42:21,170 --> 00:42:23,920 Možda neki od njih su izgubili, jer nešto dobio korumpiran 693 00:42:23,920 --> 00:42:26,530 u smislu da su neki 0 je postao 1 i 1 je postala 0 je. 694 00:42:26,530 --> 00:42:30,460 Loše stvari se može dogoditi, jer buggy softvera ili neispravan hardver. 695 00:42:30,460 --> 00:42:33,510 No, mnogi od tih bitova, možda čak i 100% od njih su još uvijek tu, 696 00:42:33,510 --> 00:42:38,330 to je samo da je računalo ili fotoaparat ne znam gdje JPEG jednom počeo 697 00:42:38,330 --> 00:42:41,660 i gdje JPEG dva počela, ali ako, programer, 698 00:42:41,660 --> 00:42:45,800 Znate, s malo pamet, gdje su ti JPEG su ili ono što oni izgledaju, 699 00:42:45,800 --> 00:42:49,570 možete analizirati 0-a i jedan je i reći, 'Ooh. JPEG. Ooh, JPEG. ' 700 00:42:49,570 --> 00:42:52,830 Možete napisati program s bitno samo za ili while petlja 701 00:42:52,830 --> 00:42:56,100 koji oporavi svaki jednu od tih datoteka. 702 00:42:56,100 --> 00:42:59,360 Dakle, pouka dakle, za početak "sigurno" brisanje datoteke 703 00:42:59,360 --> 00:43:01,720 ako želite izbjeći uopce. Da? 704 00:43:01,720 --> 00:43:06,940 [Studentski pitanje, nerazumljivo] 705 00:43:06,940 --> 00:43:11,150 >> Imati više memorije nego što je prije - 706 00:43:11,150 --> 00:43:14,790 Oh! Dobro pitanje. Pa zašto, onda, nakon pražnjenja otpada, 707 00:43:14,790 --> 00:43:18,300 ne vaše računalo vam reći da imate više slobodnog prostora nego što je prije? 708 00:43:18,300 --> 00:43:22,450 U Ukratko, jer je lagao. Više tehnički, imate više prostora. 709 00:43:22,450 --> 00:43:26,720 Jer sada si rekao, možete staviti druge stvari gdje je datoteka nekad bio, 710 00:43:26,720 --> 00:43:28,930 ali to ne znači da se bitovi ide dalje, 711 00:43:28,930 --> 00:43:33,070 i to ne znači da se bitovi se promijenio sve 0-a, na primjer, za svoju zaštitu. 712 00:43:33,070 --> 00:43:37,520 Nasuprot tome, ako "sigurno" Erase datoteke ili fizički uništiti uređaj, 713 00:43:37,520 --> 00:43:40,810 da stvarno je jedini način, ponekad, oko toga. 714 00:43:40,810 --> 00:43:45,300 Pa zašto ne odemo na tom polu-zastrašujuće note, a mi ćemo vas vidjeti u ponedjeljak. 715 00:43:45,300 --> 00:43:52,810 CS50.TV