1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [NÄDAL 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [See on CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Naine] Ta valetab; mida, ma ei tea. 5 00:00:17,780 --> 00:00:20,300 [Mees] Mida me siis teame? 6 00:00:20,300 --> 00:00:24,120 [Naine] See kell 9.15, Ray Santoya oli ATM. 7 00:00:24,120 --> 00:00:27,420 [Mees] Seega on küsimus selles, mida ta seal 9:16? 8 00:00:27,420 --> 00:00:29,980 [Naine] Laskmine 9 mm juures midagi. 9 00:00:29,980 --> 00:00:31,900 Äkki nägi ta snaiper. 10 00:00:31,900 --> 00:00:34,000 [Mees] Või ta töötas koos temaga. 11 00:00:34,000 --> 00:00:36,330 [Naine] Oota. Mine tagasi üks. 12 00:00:36,330 --> 00:00:38,330 [Mees] Mida sa näed? 13 00:00:38,330 --> 00:00:44,520 [♫ suspenseful muusika ♫] 14 00:00:44,520 --> 00:00:48,320 [Naine] Tooge ta nägu üles. Täisekraan. 15 00:00:48,320 --> 00:00:51,230 [Mees] Tema prillid. >> Seal on peegeldus. 16 00:00:51,230 --> 00:01:00,810 [♫ suspenseful muusika ♫] 17 00:01:00,810 --> 00:01:03,580 [Inimene] See on Nuevita on pesapalli meeskond. See on nende logo. 18 00:01:03,580 --> 00:01:07,790 [Naine] Ja ta räägib kes iganes kannab, et jope. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Niisiis, see on CS50 5. nädalal, ja täna me rikume natuke televisiooni ja filmi jaoks. 20 00:01:13,730 --> 00:01:16,170 Nii et kui te vaatate näidata, nagu see siin, 21 00:01:16,170 --> 00:01:19,910 ja politseisse öelda "Kas te puhastate, et up?" või "Tõsta" 22 00:01:19,910 --> 00:01:21,900 puudub suurendada reaalses maailmas. 23 00:01:21,900 --> 00:01:25,220 Tegelikult, mida sa tõesti on natuke midagi sellist. 24 00:01:25,220 --> 00:01:27,570 Olen tõmmata üks töötaja fotod lehel. 25 00:01:27,570 --> 00:01:30,980 See on programm nimega Photoshop. See on 1, 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 of 3 Bowdens tegelikult, täna, sest meil on proua Bowden siin samuti koos Rob ja Paul. 27 00:01:36,300 --> 00:01:41,950 Aga siin on Rob ekraanil, ja kui me suurendada selle helk ta on alati olnud oma silmaga, 28 00:01:41,950 --> 00:01:47,600 mida sa tegelikult näha on, et mida sa näed on, mida sa saad. 29 00:01:47,600 --> 00:01:51,690 See on "täiustatud" nii "CSI" on see natuke vale. 30 00:01:51,690 --> 00:01:55,190 Seal on üks teine ​​klipp, kui me suudame valima "CSI" natuke kauem. 31 00:01:55,190 --> 00:01:58,500 See üks on kena fraas kuuldavale edaspidi, kui soovite 32 00:01:58,500 --> 00:02:10,280 hea tehniline oma sõpradega, kui tõesti, sa räägid midagi. 33 00:02:10,280 --> 00:02:12,970 >> [Mees] Nädalaid Olen uurinud Cabby Killer mõrvad 34 00:02:12,970 --> 00:02:15,360 teatud morbid vaimustus. 35 00:02:15,360 --> 00:02:17,160 [Naine # 1] See on reaalajas. 36 00:02:17,160 --> 00:02:22,930 [Naine # 2] ma luua graafiliselt kasutades Visual Basic, vaatan, kas saan jälgida IP-aadress. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Nii audio sünkroonist välja kõrvale, luues graafiliselt kasutades Visual Basic 38 00:02:29,570 --> 00:02:31,820 jälgida IP-aadress on täielik nonsenss. 39 00:02:31,820 --> 00:02:33,840 Nendel päevadel te ei kasuta Visual Basic, 40 00:02:33,840 --> 00:02:38,920 pole mingit vajadust GUI, ja IP aadress oli tehniliselt täpne termin. 41 00:02:38,920 --> 00:02:41,730 Nii et hoidke silma peal neid, ja üks mu lemmikuid: 42 00:02:41,730 --> 00:02:45,070 See üks on natuke kauge, sest sa pead teadma eri keeles. 43 00:02:45,070 --> 00:02:47,860 Seal keeles nimetatakse Objective-C, mis on ülemhulk C. 44 00:02:47,860 --> 00:02:51,960 Mis tähendab see C pluss mõned täiendavad funktsioonid, nende seas objektorienteeritud programmeerimine. 45 00:02:51,960 --> 00:02:55,070 Ja see on keel, et Apple on populariseerinud iOS programmeerimine. 46 00:02:55,070 --> 00:02:58,760 Ja et siin on klipi mitmesuguste ürituste kokku, alates "Numbrid" 47 00:02:58,760 --> 00:03:02,450 et kui sa tegelikult vaatad tähelepanelikult oma TiVo ja pausi õigel ajal, 48 00:03:02,450 --> 00:03:07,700 te näete, et see, mida nad otsivad juures ei ole päris, mida kirjeldatakse. 49 00:03:07,700 --> 00:03:11,170 Ja lubage mul proovida erinevaid audio pistik siin ja vaata, kui me ei 50 00:03:11,170 --> 00:03:13,780 hoida heli sünkroonis seekord. 51 00:03:13,780 --> 00:03:20,530 Ma annan sulle "Numbrid". 52 00:03:20,530 --> 00:03:23,240 >> [Mees # 1] See on 32-bitine IPv4 aadress. 53 00:03:23,240 --> 00:03:38,930 [Mees # 2] IP, see on Internet. >> Eravõrkude. See on Anita eravõrk. 54 00:03:38,930 --> 00:03:43,810 [Malan] Okei. See on Objective-C, ja see sinu jaoks mingi lapse värvimine programmi 55 00:03:43,810 --> 00:03:51,140 kui saad ehk järeldada muutuja nimi seal. 56 00:03:51,140 --> 00:03:54,410 Nii et siis oli "Numbrid". Nii et täna ja sel nädalal tutvustame 57 00:03:54,410 --> 00:03:57,740 natuke maailma kohtuekspertiisi ja konteksti probleeme seetõttu. 58 00:03:57,740 --> 00:04:00,590 Täna on lühendatud loeng sest seal on eriline sündmus siin 59 00:04:00,590 --> 00:04:05,530 pärastki, et me võtame piiluda, ja tease nii õpilased kui ka vanemad täna 60 00:04:05,530 --> 00:04:07,420 mõned asjad, mis on silmapiiril. 61 00:04:07,420 --> 00:04:12,240 Neist alates esmaspäevast, siis on veel mõned klassikaaslased. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvardi ja MIT uus online algatus avatud õppematerjali 63 00:04:16,050 --> 00:04:19,120 ja rohkem, on käivitades Harvardi ülikooli esmaspäeval. 64 00:04:19,120 --> 00:04:21,490 Mis tähendab, tulevad esmaspäeval Teil on - nagu eelmise loota, 65 00:04:21,490 --> 00:04:26,210 86000 täiendavaid klassikaaslastega saab pärast koos CS50 loengud 66 00:04:26,210 --> 00:04:29,170 ja lõigud ja walkthroughs ja probleem seab. 67 00:04:29,170 --> 00:04:32,350 Ja osa sellest, siis muutub liikmed avaistung klass 68 00:04:32,350 --> 00:04:35,090 CS50 ja nüüd CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Osana sellest, nüüd aru, et seal on mõned plussid ka. 70 00:04:39,310 --> 00:04:43,790 Et saada selleks valmis, sest tohutu hulk üliõpilasi, 71 00:04:43,790 --> 00:04:47,180 piisab, kui öelda, et kuigi meil on 108 TF ja pädevad, 72 00:04:47,180 --> 00:04:50,790 mitte päris parim õpilane / õpetaja suhe kui me tabanud 80000 teistele õpilastele. 73 00:04:50,790 --> 00:04:52,850 Nii et me ei kavatse olla klassifitseerimine nii palju probleem seab käsitsi. 74 00:04:52,850 --> 00:04:55,920 Nii tutvustas sel nädalal probleem komplekti saab CS50 Kontrolli, 75 00:04:55,920 --> 00:04:58,450 mis saab olema käsurea utiliit jooksul seade 76 00:04:58,450 --> 00:05:01,200 et sa saad kui sa uuendada seda hiljem sel nädalavahetusel, 77 00:05:01,200 --> 00:05:03,200 ja sa pead olema võimeline sõitma käsu kontrollida 50, 78 00:05:03,200 --> 00:05:06,500 ise pset, ja saad mõned tagasisidet selle kohta, kas teie programm on 79 00:05:06,500 --> 00:05:11,160 õige või vale vastavalt erinevatele konstruktsiooni kirjeldused, et oleme andnud. 80 00:05:11,160 --> 00:05:13,580 Nii et rohkem sellest ja lahendamist spetsifikatsioon ja 81 00:05:13,580 --> 00:05:17,240 CS50x klassikaaslastega kasutate seda samuti. 82 00:05:17,240 --> 00:05:19,230 >> Nii et probleem komplekt 4 on kõik umbes ekspertiisi. 83 00:05:19,230 --> 00:05:21,940 Ja see tükk oli inspireeritud mõned reaalse elu kraami, 84 00:05:21,940 --> 00:05:24,620 kusjuures kui ma olin lõpetanud keskkooli, ma interneeritud mõnda aega koos 85 00:05:24,620 --> 00:05:28,650 Middlesex County District Attorney kantseleis tehes kohtuekspertiisi töö 86 00:05:28,650 --> 00:05:31,650 oma plii kohtuekspertiisi uurija ja milline see oli 87 00:05:31,650 --> 00:05:35,260 on, ma arvan, ma mainisin mõne nädala Varem on Mass riigi politsei või teised 88 00:05:35,260 --> 00:05:39,000 oleks tulnud, oleksid nad lahkuvad asjad nagu kõvakettad ja CDd ja disketid 89 00:05:39,000 --> 00:05:42,340 jms, ja siis eesmärk kohtuekspertiisi büroo oli teha kindlaks, kas 90 00:05:42,340 --> 00:05:44,600 seal oli või ei olnud tõendeid mingi. 91 00:05:44,600 --> 00:05:48,010 See oli Special uurimise osakond, nii et see oli valgekraede kuritegevuse, 92 00:05:48,010 --> 00:05:52,350 see oli rohkem vaeva omamoodi kuritegusid, 93 00:05:52,350 --> 00:05:55,990 midagi seotud mingi digitaalse meedia; välja, et ei, et paljud inimesed 94 00:05:55,990 --> 00:05:59,370 kirjutage talle öelda "ma tegin seda." 95 00:05:59,370 --> 00:06:03,290 Nii et üsna sageli need kohtuekspertiisi otsingud ei ilmu kõik, et palju vilja, 96 00:06:03,290 --> 00:06:05,850 kuid mõnikord inimesed kirjutavad selliseid e-kirju. 97 00:06:05,850 --> 00:06:08,490 Nii et mõnikord jõupingutusi premeeriti. 98 00:06:08,490 --> 00:06:14,420 >> Aga elada kuni see kohtuekspertiisi pset, saadame kehtestades pset 4 a bit graafika. 99 00:06:14,420 --> 00:06:18,260 Nii et te ilmselt teha neid asju anda, JPEG, GIF ja nagu nendel päevadel, 100 00:06:18,260 --> 00:06:21,640 aga kui sa tõesti arvad, pilt, palju nagu Rob nägu, 101 00:06:21,640 --> 00:06:24,430 eeskujuks võiks olla jadana täpid, või pikslit. 102 00:06:24,430 --> 00:06:26,680 Nüüd, kui tegemist on Rob nägu, seal on igasuguseid värve, 103 00:06:26,680 --> 00:06:29,940 ja hakkasime näha üksikuid punkte, otherwide tuntakse pikslit, 104 00:06:29,940 --> 00:06:31,610 kui hakkasime suumimiseks 105 00:06:31,610 --> 00:06:35,590 Aga kui me lihtsustada maailma natuke, ja lihtsalt öelda, et see siin on Rob 106 00:06:35,590 --> 00:06:40,560 must-valge, hästi esindama must ja valge saame lihtsalt kasutada binaarse. 107 00:06:40,560 --> 00:06:44,960 Ja kui me ei kavatse kasutada binaarne, 1 või 0, saame väljendada seda sama pilt 108 00:06:44,960 --> 00:06:51,970 Rob naeratav nägu see muster bitti: 11000011 esindab 109 00:06:51,970 --> 00:06:55,160 valge, valge, must, must, must, must, valge valge. 110 00:06:55,160 --> 00:06:59,290 Ja nii see ei ole väga suur samm, siis hakkama rääkima värvilisi fotosid. 111 00:06:59,290 --> 00:07:01,920 Asjad, mis sa näeksid Facebookis või võtta digikaamera, 112 00:07:01,920 --> 00:07:04,730 kuid kindlasti, kui tegemist on värve, mida vaja rohkem bitte. 113 00:07:04,730 --> 00:07:08,470 Ja üsna levinud maailma piltidest on kasutada mitte 1-bitine värv, 114 00:07:08,470 --> 00:07:12,730 kui see ütleb, kuid 24-bitine värv, kus sa tegelikult saad miljoneid värve. 115 00:07:12,730 --> 00:07:15,430 Nii nagu siis, kui me suurendada sisse Rob silma, 116 00:07:15,430 --> 00:07:19,270 see oli suvaline arv miljoneid erinevaid värvikaid võimalusi. 117 00:07:19,270 --> 00:07:22,260 >> Nii et me tutvustada seda Ülesanded nr 4, samuti ülevaadet, 118 00:07:22,260 --> 00:07:27,050 mis on täna kell 03:30 asemel tavalisi 02:30 tõttu reedel loeng siin. 119 00:07:27,050 --> 00:07:29,930 Aga video on Internetis, nagu tavaliselt, homme. 120 00:07:29,930 --> 00:07:31,880 Me ka tutvustada teile teises failivormingus. 121 00:07:31,880 --> 00:07:34,150 Nii et see on tahtlikult mõeldud vaatama hirmutavalt esimesel, 122 00:07:34,150 --> 00:07:38,980 aga see on lihtsalt mingi dokumentatsioon C struct. 123 00:07:38,980 --> 00:07:42,280 Selgub, et Microsoft aastat tagasi aitasid populariseerida seda formaati, 124 00:07:42,280 --> 00:07:46,630 nimetatakse bitmap faili formaat, BMP, ja see oli super-lihtne, 125 00:07:46,630 --> 00:07:50,390 värviline graafiline vorming, mida kasutati juba mõnda aega 126 00:07:50,390 --> 00:07:53,640 ja mõnikord veel taustapilte lauale. 127 00:07:53,640 --> 00:07:57,410 Kui te arvate tagasi Windows XP ja jooksva mäed ja sinine taevas, 128 00:07:57,410 --> 00:08:00,660 mis oli tavaliselt BMP, või bitmap pilt ja rasterpildid 129 00:08:00,660 --> 00:08:03,340 on lõbus juures, sest neil on natuke rohkem keeruline. 130 00:08:03,340 --> 00:08:05,640 See ei ole päris nii lihtne see ruudustik 0-ja 1-d; 131 00:08:05,640 --> 00:08:10,680 selle asemel, sa pead asjad päise alguses faili. 132 00:08:10,680 --> 00:08:15,520 Nii teisisõnu sees. Bmp fail on terve hunnik 0-ja 1-d, 133 00:08:15,520 --> 00:08:18,070 kuid seal on mõned täiendavad 0-ja 1 on seal. 134 00:08:18,070 --> 00:08:21,450 Ja selgub, et me oleme tõenäoliselt iseenesestmõistetavaks aastaid, 135 00:08:21,450 --> 00:08:27,040 failivorminguid nagu. doc või. xls või. mp3 või. mp4, 136 00:08:27,040 --> 00:08:29,910 olenemata failivorminguid, et te olete juba tuttav. 137 00:08:29,910 --> 00:08:31,900 Noh, mis see üldse tähendab olla failivorming? 138 00:08:31,900 --> 00:08:35,740 Sest lõpus päev, kõik need failid, mida me kasutame on lihtsalt 0-ja 1 aasta 139 00:08:35,740 --> 00:08:39,950 ja võibolla need 0-ja 1 on esindada, b, c kaudu ASCII vms, 140 00:08:39,950 --> 00:08:42,030 kuid läbi lõpuks, see on lihtsalt 0-ja 1 aasta. 141 00:08:42,030 --> 00:08:45,300 >> Nii et inimesed lihtsalt aeg-ajalt otsustada leiutada uus failivorming 142 00:08:45,300 --> 00:08:49,420 kus nad standardida mida mustrid bitti tähendab tegelikult. 143 00:08:49,420 --> 00:08:52,790 Ja selles asjas, inimesed, kes loodud bitmap faili formaat 144 00:08:52,790 --> 00:08:58,260 ütles, et kõige esimene bait bitmap faili, kui tähistatakse plokist 0, seal, 145 00:08:58,260 --> 00:09:02,320 seal saab olema mingi cryptically nimega muutuja nimega bfType, 146 00:09:02,320 --> 00:09:06,510 mis lihtsalt seisab bitmap faili tüüp; millist tüüpi bitmap faili see on. 147 00:09:06,510 --> 00:09:10,780 Võite järeldada, ehk alates teisest reast, et kompenseerida 2 baidi number 2, 148 00:09:10,780 --> 00:09:15,980 on muster 0-ja 1 aasta, mis tähistab mis? 149 00:09:15,980 --> 00:09:18,320 Suurust midagi, ja see läheb edasi sealt. 150 00:09:18,320 --> 00:09:20,660 Nii et probleem komplekt 4, siis saad kõndis läbi mõned neist asjadest. 151 00:09:20,660 --> 00:09:24,480 >> Me ei jõua hooliv neid kõiki, kuid märgata ta hakkab saama huvitav 152 00:09:24,480 --> 00:09:30,780 ümber rida või bait 54, rgbtBlue, roheline ja punane. 153 00:09:30,780 --> 00:09:35,280 Kui olete kunagi kuulnud akronüüm RGB, punane roheline sinine, see on viide sellele. 154 00:09:35,280 --> 00:09:37,840 Sest tuleb välja, võid joonistada kõik värvid vikerkaar 155 00:09:37,840 --> 00:09:41,580 mõned kombinatsioon punane ja sinine ja roheline. 156 00:09:41,580 --> 00:09:46,560 Ja tegelikult, vanemad ruumis võiks meenutada, mõned varem projektorid. 157 00:09:46,560 --> 00:09:49,360 Nendel päevadel, sa lihtsalt vaata 1 eredat valgust tulevad välja objektiiv. 158 00:09:49,360 --> 00:09:52,870 Aga juba järgmisel päeval, siis tuli punane lääts, sinine objektiiv, ja roheline lääts 159 00:09:52,870 --> 00:09:56,620 ja koos nad on suunatud ekraani ja moodustasid värviline pilt. 160 00:09:56,620 --> 00:09:59,590 Ja üsna sageli keskastme koolide ja gümnaasiumid oleksid need läätsed 161 00:09:59,590 --> 00:10:02,680 kunagi-nii-veidi viltu, et sa olid omamoodi näeme topelt-või kolmekordne pilte, 162 00:10:02,680 --> 00:10:07,500 aga see oli mõte. Sul oli punane ja roheline ja sinine valgus maali pilt. 163 00:10:07,500 --> 00:10:09,570 Ja see sama põhimõtet on kasutatud ka arvutid. 164 00:10:09,570 --> 00:10:12,000 >> Nii väljakutsete hulgas, siis sinu jaoks probleem komplekt 4 165 00:10:12,000 --> 00:10:16,080 ei kavatse olla mõned asjad, üks on tegelikult resize pilt. 166 00:10:16,080 --> 00:10:18,050 Et võtta muster 0-ja 1-d, 167 00:10:18,050 --> 00:10:22,840 aru saada, mis tükkideks 0-ja 1 on esindada Mida struktuur niimoodi, 168 00:10:22,840 --> 00:10:26,800 ja siis nuputada, kuidas imiteerida piksleid: punased, sinised, rohelised 169 00:10:26,800 --> 00:10:32,460 sees nii, et kui pilt näeb välja selline esialgu tunduda see mitte pärast seda. 170 00:10:32,460 --> 00:10:35,590 Muude probleemidega, liiga, saab olema, et saad kätte 171 00:10:35,590 --> 00:10:38,900 kohtuekspertiisi pilt tegeliku faili digikaamera 172 00:10:38,900 --> 00:10:42,410 ja selle kaamerast, kunagi ammu, olid terve hunnik pilte. 173 00:10:42,410 --> 00:10:47,030 Probleem on selles, me kogemata kustutada või oli pilt rikutud kuidagi. 174 00:10:47,030 --> 00:10:51,040 Halvad asjad juhtuvad digitaalkaamerad, ja nii me kiiresti kopeerida kõik 0-ja 1 aasta 175 00:10:51,040 --> 00:10:55,410 ära selle kaardi sulle, salvestatakse need kõik 1 suur fail, ja siis me aga neid teile 176 00:10:55,410 --> 00:11:00,000 Probleemse komplekt 4 nii, et saate kirjutada programm C keeles, mille abil taastada 177 00:11:00,000 --> 00:11:02,660 kõik need JPEG, ideaalis. 178 00:11:02,660 --> 00:11:06,280 Ja selgub, et JPEG, kuigi nad on mõnevõrra keeruline failivorming, 179 00:11:06,280 --> 00:11:09,580 nad on palju keerulisem kui see naeratav nägu siin. 180 00:11:09,580 --> 00:11:14,320 Tuleb välja, et iga JPEG algab samade mustrite 0-ja 1 aasta. 181 00:11:14,320 --> 00:11:18,820 Nii et kasutades samas loop või loop vms, 182 00:11:18,820 --> 00:11:22,350 saate kinnitada, üle kõigi 0-ja 1 on selles kohtuekspertiisi pilt 183 00:11:22,350 --> 00:11:26,670 ja iga kord näed eriline muster, mis on määratletud probleemi komplekt spetsifikatsioonile, 184 00:11:26,670 --> 00:11:29,770 võite eeldada, "Oh, siin on väga suur tõenäosus, 185 00:11:29,770 --> 00:11:33,520 algust JPEG, ja niipea kui sa leiad sama mudeli 186 00:11:33,520 --> 00:11:36,050 mõned baitide arvu või kilobaiti või megabaiti hiljem 187 00:11:36,050 --> 00:11:40,550 võite eeldada, "Ooh! Siin on teine ​​JPEG, foto võtsin pärast esimest. 188 00:11:40,550 --> 00:11:44,720 Lubage mul lõpetada lugemine, et esimese faili, hakake seda uuega. " 189 00:11:44,720 --> 00:11:49,980 Ja väljund oma programmi pset 4 kavatse olla koguni 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 Ja kui see on mitte 50 JPEG, sul on natuke silmus. 191 00:11:52,400 --> 00:11:55,580 Kui teil on lõpmatu arv JPEG, teil on lõputu silmuse. 192 00:11:55,580 --> 00:11:58,280 Nii et, liiga, on üsna levinud puhul. 193 00:11:58,280 --> 00:12:00,280 Seda on silmapiiril. 194 00:12:00,280 --> 00:12:03,740 >> Viktoriin 0, seljataga. Aru, ühe minu e-posti, et alati on olemas inimesed 195 00:12:03,740 --> 00:12:06,820 kes on mõlemad õnnelikud, justkui neutraalne, ja kurb ümber viktoriin 0 korda. 196 00:12:06,820 --> 00:12:10,160 Ja palun ärge jõuda mind, pea TFS, Zamyla, oma TF 197 00:12:10,160 --> 00:12:14,120 või üks CAd, et sa tead, kui sa tahaksid arutada, kuidas asjad läksid. 198 00:12:14,120 --> 00:12:16,460 >> Nii muljet vanemad siin ruumis, 199 00:12:16,460 --> 00:12:23,990 Mis on CS50 raamatukogu? Hea töö. 200 00:12:23,990 --> 00:12:32,280 Mis CS50 raamatukogu? Jah? [Student vastuseid, arusaamatult] 201 00:12:32,280 --> 00:12:35,730 >> Olgu, hästi. Nii et see on prewritten komplekt kood, mis me, töötajad, kirjutas 202 00:12:35,730 --> 00:12:38,460 pakume teile pakkuda mõned ühised funktsioonid. 203 00:12:38,460 --> 00:12:42,290 Asju mulle string; mind int, kõik funktsioonid, mis on loetletud siin. 204 00:12:42,290 --> 00:12:45,260 Alustades nüüd, hakkame tõesti võtta need abirattad maha. 205 00:12:45,260 --> 00:12:48,230 Nii et me ei kavatse hakata ära võtta "string" sinult, 206 00:12:48,230 --> 00:12:52,790 mis, mäletate, oli lihtsalt sünonüüm, mida tegelik andmetüüp? char *. 207 00:12:52,790 --> 00:12:57,020 Nii et vanemad, et ilmselt - see on hea, nii char * me hakkame nägema 208 00:12:57,020 --> 00:13:00,810 ekraanil enam kui me eemaldada "string" oma sõnavarast, 209 00:13:00,810 --> 00:13:02,760 vähemalt kui tegemist on tegelikult kirjalikult koodi. 210 00:13:02,760 --> 00:13:06,240 Samamoodi, siis lõpetame kasutades mõned neist funktsioonidest nii palju, 211 00:13:06,240 --> 00:13:08,390 sest meie programmid ei hakka keerukamaid 212 00:13:08,390 --> 00:13:11,370 mitte lihtsalt kirjutada programme, mis seal istuda koos kiire vilkumine, 213 00:13:11,370 --> 00:13:13,580 ootab kasutaja tüüp midagi sisse 214 00:13:13,580 --> 00:13:15,220 Sa saad oma sisendeid mujalt. 215 00:13:15,220 --> 00:13:18,720 Näiteks saad neid ka mitme bitti kohalikul kõvakettal. 216 00:13:18,720 --> 00:13:23,340 Sul asemel saada neid tulevikus võrguühenduse mõned koduleheküljel kusagil. 217 00:13:23,340 --> 00:13:27,460 Nii et olgem koor tagasi see kiht esimest korda, ja tõmba CS50 seadme 218 00:13:27,460 --> 00:13:32,300 ja see fail nimega CS50.h, mis sa oled olnud terav ka nädalaid. 219 00:13:32,300 --> 00:13:34,380 >> Kuid olgem tegelikult näha, mis seal sees sellest. 220 00:13:34,380 --> 00:13:38,250 Nii ülemisel faili sinine on lihtsalt terve hunnik märkusi, 221 00:13:38,250 --> 00:13:41,340 garantii ja litsentsimist. See on omamoodi ühise paradigma 222 00:13:41,340 --> 00:13:44,600 tarkvara, sest palju tarkvara nendel päevadel on, mida nimetatakse "open source" 223 00:13:44,600 --> 00:13:46,940 mis tähendab, et keegi on kirjutanud kood 224 00:13:46,940 --> 00:13:50,060 ja teinud seda vabalt kättesaadavad, mitte ainult joosta ja kasutada, 225 00:13:50,060 --> 00:13:53,660 kuid tegelikult lugeda ja muuta ja integreerida oma töö. 226 00:13:53,660 --> 00:13:55,790 Nii see on, mida olete kasutanud, avatud lähtekoodiga tarkvara, 227 00:13:55,790 --> 00:13:58,030 kuigi väga väike vorm. 228 00:13:58,030 --> 00:14:01,860 Kui ma keri minevikku kommentaare, aga me hakkame nägema mõned tuttavad asjad. 229 00:14:01,860 --> 00:14:08,090 Nii märkate ülaosas siin, et CS50.h fail sisaldab terve hunniku päisefaile. 230 00:14:08,090 --> 00:14:11,160 Nüüd, enamik neist ei ole me näinud, kuid üks on 231 00:14:11,160 --> 00:14:15,640 tuttav; kumb neist oleme näinud, kuigi lühidalt, siiani? 232 00:14:15,640 --> 00:14:18,720 Jah, standard raamatukogud. Stdlib.h on malloc, 233 00:14:18,720 --> 00:14:21,590 nii kui me hakkasime rääkima dünaamiline mälu eraldamise, 234 00:14:21,590 --> 00:14:24,960 mis me tuleme tagasi järgmisel nädalal ning alustasime ka selle faili. 235 00:14:24,960 --> 00:14:29,660 Selgub, et bool ja õige ja vale tegelikult ei eksisteeri C iseenesest 236 00:14:29,660 --> 00:14:32,460 kui sa lisada see fail siin. 237 00:14:32,460 --> 00:14:35,770 Nii oleme, nädalaid, on ka standard bool.h 238 00:14:35,770 --> 00:14:39,020 nii, et saate kasutada mõistet bool, õige või vale. 239 00:14:39,020 --> 00:14:41,830 Ilma selleta oleks teil sorteerida võltsitud ja kasutab int 240 00:14:41,830 --> 00:14:45,920 ja lihtsalt suvaliselt eeldada, et 0 on vale ja 1 on tõsi. 241 00:14:45,920 --> 00:14:49,980 >> Nüüd, kui me kerige edasi, siin on meie mõiste string. 242 00:14:49,980 --> 00:14:54,820 Selgub, nagu me oleme varem öelnud, et kui see * on ei ole tegelikult küsimus. 243 00:14:54,820 --> 00:14:56,750 Võite isegi ruumi kõikjalt. 244 00:14:56,750 --> 00:15:01,550 Meie, see semester, on selle edendamisel see selgeks teha, et * on pistmist tüüp. 245 00:15:01,550 --> 00:15:05,370 Aga aru, lihtsalt nii levinud, kui mitte veidi rohkem levinud, on panna see sinna 246 00:15:05,370 --> 00:15:07,480 kuid funktsionaalselt on see sama asi. 247 00:15:07,480 --> 00:15:11,070 Aga nüüd, kui me loeme ette veelgi, võtame pilk öelda, GetInt, 248 00:15:11,070 --> 00:15:15,350 sest me kasutasime, et ehk enne midagi muud see semester. 249 00:15:15,350 --> 00:15:19,620 Ja siin on GetInt. See on see, mida? 250 00:15:19,620 --> 00:15:24,650 See on prototüüp. Nii tihti, oleme pannud prototüüpide tippude meie. C faili, 251 00:15:24,650 --> 00:15:28,190 kuid võite ka panna prototüüpide päisefaile. h failid, 252 00:15:28,190 --> 00:15:32,110 nagu see siin, nii et kui kirjutad teatud funktsioonide 253 00:15:32,110 --> 00:15:36,790 et sa tahad, et teised inimesed saaksid kasutada, mis on täpselt puhul CS50 raamatukogu, 254 00:15:36,790 --> 00:15:40,900 te mitte ainult ellu oma ülesandeid midagi CS50.c, 255 00:15:40,900 --> 00:15:46,720 sa ka panna prototüüpe ei ülaosas et faili, kuid ülaosas päisefail, 256 00:15:46,720 --> 00:15:50,810 siis päisefail on see, mida sõbrad ja kolleegid hõlmavad 257 00:15:50,810 --> 00:15:52,800 teravate lisada oma koodi. 258 00:15:52,800 --> 00:15:55,440 Nii et kõik see aeg olete olnud ka kõik need prototüübid 259 00:15:55,440 --> 00:15:59,870 tõhusalt ülaosas oma faili, kuid teel selle terava sisaldama mehhanismi 260 00:15:59,870 --> 00:16:03,320 et sisuliselt koopiad ja pastad see fail oma. 261 00:16:03,320 --> 00:16:06,400 Nüüd, siin on mõned üsna üksikasjalikud dokumendid. 262 00:16:06,400 --> 00:16:08,880 >> Me oleme päris palju enesestmõistetavaks, et GetInt saab int, 263 00:16:08,880 --> 00:16:10,740 aga tuleb välja, seal on mõnes nurgas juhtudel, eks? 264 00:16:10,740 --> 00:16:14,320 Mis siis, kui kasutaja liigid number, mis on liiga suur? 265 00:16:14,320 --> 00:16:17,350 Kvintiljon, et lihtsalt ei sobi sees int? 266 00:16:17,350 --> 00:16:21,180 Milline on oodatav käitumine? Noh, ideaalis, see on ennustatav. 267 00:16:21,180 --> 00:16:23,460 Nii et sel juhul, kui te tegelikult lugeda trahvi print, 268 00:16:23,460 --> 00:16:27,850 te näete, et kui liin ei saa lugeda, see naaseb INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Me pole kunagi sellest rääkinud, kuid põhineb kapitaliseerimine, 270 00:16:30,800 --> 00:16:33,030 mis see on, ilmselt? 271 00:16:33,030 --> 00:16:36,610 See on pidev, nii et see on mingi eriline konstant, mis on arvatavasti kuulutatud 272 00:16:36,610 --> 00:16:39,460 ühes neist päisefaile et teoksil suurem fail, 273 00:16:39,460 --> 00:16:43,400 ja INT_MAX on ilmselt midagi, jämedalt, 2 miljardi euroni. 274 00:16:43,400 --> 00:16:48,160 Idee on selles, et kuna me peame kuidagi tähendada, et midagi läks valesti, 275 00:16:48,160 --> 00:16:51,090 me, jah, on 4000000000 numbrid meie käsutuses, 276 00:16:51,090 --> 00:16:53,980 negatiivne 2 miljardit kuni 2 miljardit anda või võtta. 277 00:16:53,980 --> 00:16:58,030 Noh, mis on levinud programmeerimine sa varastada vaid üks nendest numbritest. 278 00:16:58,030 --> 00:17:02,250 Võibolla 0, võibolla 2 miljardit ehk negatiivne 2 miljardit eurot. 279 00:17:02,250 --> 00:17:06,720 Nii et sa kulutad ühe oma võimalikest väärtustest, nii et saate pühenduda maailma 280 00:17:06,720 --> 00:17:10,089 et kui midagi läheb valesti, ma tulen tagasi selle super-suur väärtus. 281 00:17:10,089 --> 00:17:13,329 Aga sa ei taha kasutaja kirjutades midagi segasena nagu "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 tõesti suur number, kuhu üldistada selle asemel pidevalt. 283 00:17:17,079 --> 00:17:19,380 Nii et tõesti, kui sa olid anal viimastel nädalatel, 284 00:17:19,380 --> 00:17:23,800 millal helistada GetInt, sa oleks pidanud kontrollides kui seisukorras. 285 00:17:23,800 --> 00:17:27,109 Kas kasutaja kirjuta INT_MAX, või täpsemalt, 286 00:17:27,109 --> 00:17:29,900 tegin GetInt tagasi INT_MAX? Sest kui ta seda tegi, 287 00:17:29,900 --> 00:17:35,140 et tegelikult tähendab, et nad ei kirjuta see, midagi läks valesti antud juhul. 288 00:17:35,140 --> 00:17:38,970 Nii et see on see, mis üldiselt tuntud kui "kontroll" väärtus, mis tähendab lihtsalt eriline. 289 00:17:38,970 --> 00:17:41,020 >> Noh, nüüd saab sisse. C faile. 290 00:17:41,020 --> 00:17:44,500 C fail on olemas seadet mõnda aega, 291 00:17:44,500 --> 00:17:47,540 ja tegelikult on seadmel see kompileeritud teile 292 00:17:47,540 --> 00:17:49,720 arvesse, et asi nimega "objekti kood" 293 00:17:49,720 --> 00:17:52,940 aga see lihtsalt ei loe teile kus see on, sest süsteem teab, 294 00:17:52,940 --> 00:17:54,780 sel juhul, kui see on seadme. 295 00:17:54,780 --> 00:18:00,620 Kuid olgem kerige nüüd GetInt, ja vaata, kuidas GetInt on töötanud kogu selle aja. 296 00:18:00,620 --> 00:18:02,380 Nii et siin on meil sarnane kommentaarid enne. 297 00:18:02,380 --> 00:18:04,930 Lubage mul suumida lihtsalt koodi osa, 298 00:18:04,930 --> 00:18:07,410 ja mida meil on GetInt on järgmine. 299 00:18:07,410 --> 00:18:12,770 See ei võta sisend ja tagastab int, while (true), nii et meil on tahtlik lõputu silmuse 300 00:18:12,770 --> 00:18:16,560 kuid kõigi eelduste kohaselt me ​​murda läbi selle kuidagi, või naasta seest seda. 301 00:18:16,560 --> 00:18:19,890 Nii et vaatame, kuidas see töötab. Noh, me näivad kasutavat getString 302 00:18:19,890 --> 00:18:22,550 Selles esimeses reas sees silmus, 166. 303 00:18:22,550 --> 00:18:25,320 See on nüüd hea tava sest millistel tingimustel 304 00:18:25,320 --> 00:18:30,820 võiks getString tagasi see eriline märksõna, NULL? 305 00:18:30,820 --> 00:18:38,460 Kui midagi läheb valesti. Mis saaks valesti minna, kui helistate midagi getString? 306 00:18:38,460 --> 00:18:42,550 Jah? [Student vastus, arusaamatult] >> Jah. Nii et äkki malloc ebaõnnestub. 307 00:18:42,550 --> 00:18:45,310 Kuskil all kapuuts getString helistatakse malloc, 308 00:18:45,310 --> 00:18:48,210 mis eraldab mälu, mis võimaldab arvutisse salvestada 309 00:18:48,210 --> 00:18:50,950 kõik märgid, et kasutaja sisestada klaviatuurilt. 310 00:18:50,950 --> 00:18:53,270 Ja oletame kasutaja oli palju vaba aega 311 00:18:53,270 --> 00:18:56,470 ja trükitud rohkem, näiteks kui 2 miljardit märki. 312 00:18:56,470 --> 00:18:59,600 Rohkem märke kui arvuti on isegi RAM. 313 00:18:59,600 --> 00:19:02,350 Noh, getString peab suutma tähenda, et teile, 314 00:19:02,350 --> 00:19:05,650 isegi kui see on super, super aeg-ajalt nurga puhul. 315 00:19:05,650 --> 00:19:08,490 See peab kuidagi suutma sellega hakkama, ja nii getString, 316 00:19:08,490 --> 00:19:11,850 kui me läheme tagasi ja loe selle dokumentatsiooni, ei, tegelikult tagasi NULL. 317 00:19:11,850 --> 00:19:16,150 Nüüd kui getString ei tagastades NULL, GetInt läheb pankrotti minna 318 00:19:16,150 --> 00:19:19,370 tagastades INT_MAX, nagu sentinel. 319 00:19:19,370 --> 00:19:22,650 Need on vaid inimese konventsioonidega. Ainus viis sa teaksid, see on nii 320 00:19:22,650 --> 00:19:24,840 on lugedes dokumentatsiooni. 321 00:19:24,840 --> 00:19:28,200 Nii et olgem kerige kus int on tegelikult GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Nii et kui ma keri natuke edasi, lähtudes 170 meil kommentaar eespool nimetatud liinidel. 323 00:19:34,220 --> 00:19:38,470 Nii et me kuulutame, 172, int n ja char c, ja siis see uus funktsioon 324 00:19:38,470 --> 00:19:41,870 mis mõned teist on komistas kogu enne, kuid sscanf. 325 00:19:41,870 --> 00:19:44,190 See tähistab stringi scan f. 326 00:19:44,190 --> 00:19:48,580 Teisisõnu, mulle nööri ja ma skaneerida seda tükki huvipakkuvat informatsiooni. 327 00:19:48,580 --> 00:19:53,820 Nii et mida see tähendab? Noh, oletame, et ma kirjutada, sõna otseses mõttes, 1 2 3 juures klaviatuur, 328 00:19:53,820 --> 00:19:59,730 ja seejärel vajutage enter. Mis on andmete tüüpi 1 2 3 kui tagastatud getString? 329 00:19:59,730 --> 00:20:05,010 See on ilmselt string, eks? Mul on string, nii 1 2 3 ei ole tegelikult "1 2 3" 330 00:20:05,010 --> 00:20:07,260 koos \ 0 lõpus ta. See ei ole int. 331 00:20:07,260 --> 00:20:10,420 See pole number. Tundub arv, kuid see ei ole tegelikult. 332 00:20:10,420 --> 00:20:14,680 Mis siis GetInt pead tegema? See on skaneerida et string vasakult paremale, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, ja kuidagi teisendada see tegelik täisarv. 334 00:20:19,010 --> 00:20:21,010 Nüüd võid nuputada, kuidas seda teha. 335 00:20:21,010 --> 00:20:24,240 Kui te arvate tagasi pset 2, siis arvatavasti on üks väike mugav 336 00:20:24,240 --> 00:20:26,810 Caesar või vigenere siis võite kinnitada, üle nööri, 337 00:20:26,810 --> 00:20:29,800 saate teisendada jutumärke ints koos valida. See on palju tööd. 338 00:20:29,800 --> 00:20:32,800 Miks mitte helistada funktsioon nagu sscanf et kas see sinu jaoks? 339 00:20:32,800 --> 00:20:37,520 Nii sscanf loodab argument, sel juhul nimetatakse joont, mis on string. 340 00:20:37,520 --> 00:20:41,310 Seejärel tuleb määrata, jutumärkides, väga sarnane printf, 341 00:20:41,310 --> 00:20:44,960 Mida ootate, et näha selle stringi? 342 00:20:44,960 --> 00:20:52,980 Millest ma räägin siin on, ma oodata kümnendmurruna ja võibolla iseloomu. 343 00:20:52,980 --> 00:20:54,990 Ja me näeme, miks see nii on vaid hetk. 344 00:20:54,990 --> 00:20:58,440 Selgub, et see märge on nüüd meenutab värk 345 00:20:58,440 --> 00:21:00,840 hakkasime rääkima veidi üle nädala tagasi. 346 00:21:00,840 --> 00:21:05,430 >> Mis on & n ja & c teed meile siin? [Student vastuseid, arusaamatult] 347 00:21:05,430 --> 00:21:07,610 >> Jah. See annab mulle aadressi n ja aadress c. 348 00:21:07,610 --> 00:21:10,440 Nüüd, miks see nii tähtis on? Noh, sa tead, et koos funktsioonide C 349 00:21:10,440 --> 00:21:13,440 sa võid alati tagastab väärtuse või puudub igasugune väärtus. 350 00:21:13,440 --> 00:21:16,630 Te saate tagastada int, string, float, char, mida iganes. 351 00:21:16,630 --> 00:21:21,150 Või võite pöörduda tühine, kuid võite ainult tagasi 1 asi maksimaalselt. 352 00:21:21,150 --> 00:21:26,100 Aga siin me tahame sscanf naasta mind äkki int, kümnendmurruna 353 00:21:26,100 --> 00:21:29,240 ja ka char, ja ma seletan, miks char hetkel. 354 00:21:29,240 --> 00:21:34,250 Nii et sa tegelikult tahad f tagasi 2 asja; et lihtsalt ei ole võimalik C. 355 00:21:34,250 --> 00:21:38,460 Nii saab töö ümber, et sooritades 2 aadressid, 356 00:21:38,460 --> 00:21:43,710 sest niipea kui sa ulataksid funktsioon 2 aadressid, mida saab sellele funktsioonile nendega teha? 357 00:21:43,710 --> 00:21:49,880 Sellega on võimalik kirjutada neile aadressidele. Võite kasutada * käitamine ja "sinna minna", et kõik need aadressid. 358 00:21:49,880 --> 00:21:54,320 See on omamoodi see tagauks mehhanism, kuid väga levinud muutmise väärtused muutujatele 359 00:21:54,320 --> 00:21:58,020 rohkem kui lihtsalt 1 koht, sel juhul 2. 360 00:21:58,020 --> 00:22:04,590 Nüüd märkate Ma kontrollimine == to1 ning pöördub n kui see tegelikult hinnata tõeseks. 361 00:22:04,590 --> 00:22:09,340 Mis siis toimub? Noh, tehniliselt kõik tõesti tahame juhtuda GetInt on see. 362 00:22:09,340 --> 00:22:12,340 Me tahame sõeluda niiöelda; me tahame lugeda string 363 00:22:12,340 --> 00:22:16,210 "1 2 3" ja kui tundub, et seal on mitmeid seal, 364 00:22:16,210 --> 00:22:21,360 mida me ütlen sscanf tegema pannakse see arv, 1 2 3 See muutuja n minu jaoks. 365 00:22:21,360 --> 00:22:26,060 Miks siis tegin ma seda ka? 366 00:22:26,060 --> 00:22:33,750 Mis rolli mängib ka öelda, sscanf, võite ka saada iseloomu siin. 367 00:22:33,750 --> 00:22:36,890 [Student keelt, arusaamatult] >> Ei - koma võiks toimida. 368 00:22:36,890 --> 00:22:40,650 Olgem hoidke, et mõtles hetke. Mis veel? 369 00:22:40,650 --> 00:22:42,570 [Student, arusaamatult] >> Nii hea mõte, võiks see olla null iseloomu. 370 00:22:42,570 --> 00:22:44,970 See on tegelikult mitte, antud juhul. Jah? [Student, arusaamatult] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Või las ma üldistada veelgi. 372 00:22:47,100 --> 00:22:49,670 % C on lihtsalt viga kontrollimise. 373 00:22:49,670 --> 00:22:52,510 Me ei taha seal olla märk pärast arvu, 374 00:22:52,510 --> 00:22:54,980 aga mida see võimaldab mul teha on järgmised: 375 00:22:54,980 --> 00:23:01,270 Selgub, et sscanf lisaks ladustamiseks väärtused n ja c, selles näites siin, 376 00:23:01,270 --> 00:23:08,170 Mis see ka ei ole siis tagastab arvu muutujate ta pani väärtused sisse 377 00:23:08,170 --> 00:23:13,330 Nii et kui sa ainult kirjutad 1 2 3, siis ainult% d saab sobitada 378 00:23:13,330 --> 00:23:18,830 ja ainult n saab ladustada, mille väärtus on nagu 1 2 3 ja midagi saab panna c; 379 00:23:18,830 --> 00:23:20,870 c jääb prügi väärtus, kui nii võib öelda. 380 00:23:20,870 --> 00:23:23,550 Prügi sest see on kunagi olnud käivitub nagu mingi väärtus. 381 00:23:23,550 --> 00:23:29,390 Nii et sel juhul, sscanf tagastab 1, sest ma asustatud üks neist suunanäitajaks, 382 00:23:29,390 --> 00:23:33,650 sellisel juhul suur. Mul on int, nii et ma vabastada liin vabastada mälu 383 00:23:33,650 --> 00:23:37,150 et getString tegelikult eraldatud, ja siis ma tagasi n. 384 00:23:37,150 --> 00:23:42,210 Else, kui te kunagi mõelnud, kui et uuesti avalduse pärineb, pärineb just siin. 385 00:23:42,210 --> 00:23:45,770 Kui aga, I tüüpi 1 2 3 suva, 386 00:23:45,770 --> 00:23:48,640 lihtsalt mõne juhusliku jada teksti, sscanf on näeme, 387 00:23:48,640 --> 00:23:51,500 ooh, number, ooh, number, ooh, number, ooh - f. 388 00:23:51,500 --> 00:23:54,190 Ja see läheb üles 1 2 3 n. 389 00:23:54,190 --> 00:23:59,970 See saab panna f-c, ja siis tagasi 2. 390 00:23:59,970 --> 00:24:02,980 Nii et meil on, lihtsalt kasutades põhimõiste scanf käitumist, 391 00:24:02,980 --> 00:24:06,170 väga lihtne viis - noh, keeruline esmapilgul, kuid lõpus päeval, 392 00:24:06,170 --> 00:24:11,460 üsna lihtne mehhanism öeldes on seal keskmine, ja kui on, siis on see ainus asi, mis ma leidsin? 393 00:24:11,460 --> 00:24:14,950 Ja tühja ruumi siin on tahtlik. Kui sa loed dokumentatsiooni sscanf, 394 00:24:14,950 --> 00:24:18,690 see ütleb teile, et kui te sisaldama tükk tühja ruumi algusesse või lõppu, 395 00:24:18,690 --> 00:24:24,990 sscanf liiga võimaldab kasutajal ükskõik millisel põhjusel, lüüa tühikut 1 2 3, ning mis on õigustatud. 396 00:24:24,990 --> 00:24:28,310 See ei karju kasutaja lihtsalt sellepärast, et nad tabanud tühiku alguses või lõpus, 397 00:24:28,310 --> 00:24:32,160 mis on natuke rohkem kasutajasõbralikumaks. 398 00:24:32,160 --> 00:24:34,160 >> Kõik küsimused, siis edasi GetInts? Jah? 399 00:24:34,160 --> 00:24:36,820 [Student küsimus, arusaamatult] 400 00:24:36,820 --> 00:24:40,740 >> Hea küsimus. Mis siis, kui sa lihtsalt kirjutada char, nagu f, ja vajuta enter 401 00:24:40,740 --> 00:24:47,830 pole kunagi kirjutades 1 2 3; mis sa arvad käitumist rida koodi oleks siis? 402 00:24:47,830 --> 00:24:50,500 Nii sscanf võib katta et liiga, sest sel juhul 403 00:24:50,500 --> 00:24:56,280 ta ei kavatse täita n või c; siis läheb selle asemel tagastab 0. 404 00:24:56,280 --> 00:25:01,540 Sellisel juhul ma ka püüdmine et stsenaarium, sest eeldatav maksumus tahan on 1. 405 00:25:01,540 --> 00:25:07,310 Ma tahan ainult 1 ja ainult 1 asi, mida tuleb täita. Hea küsimus. Teised? 406 00:25:07,310 --> 00:25:09,610 >> Olgu, lähme ei lähe läbi kõik funktsioonid siin, 407 00:25:09,610 --> 00:25:11,820 kuid üks, mis tundub olevat, ehk järelejäänud huvi 408 00:25:11,820 --> 00:25:14,530 on getString sest selgub, et GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong kõik punt palju nende funktsionaalsus getString. 410 00:25:19,490 --> 00:25:22,860 Võtame vaadata, kuidas ta on rakendanud siin. 411 00:25:22,860 --> 00:25:27,040 See üks tundub veidi keeruline, kuid see kasutab sama põhialuste 412 00:25:27,040 --> 00:25:29,680 et me hakkasime rääkima eelmisel nädalal. Nii getString, 413 00:25:29,680 --> 00:25:32,670 mis ei võta argumenti ühe tühine siin, 414 00:25:32,670 --> 00:25:37,110 ja see tagastab stringi, nii kuulutan ma string nimega puhver. 415 00:25:37,110 --> 00:25:39,670 Ma tõesti ei tea, mis see olema saab kasutada veel, aga eks näis. 416 00:25:39,670 --> 00:25:42,950 Paistab võimsus on, vaikimisi 0; ei ole päris kindel, kuhu see viib. 417 00:25:42,950 --> 00:25:44,920 Ei tea, mida n läheb kasutada veel. 418 00:25:44,920 --> 00:25:47,860 Aga nüüd see muutub veidi huvitav, nii et liin 243, 419 00:25:47,860 --> 00:25:51,760 me kuulutame int c, see on omamoodi loll detail. 420 00:25:51,760 --> 00:25:58,080 Char on 8 bitti, ja 8 bitti saab salvestada mitu erinevat väärtust? 421 00:25:58,080 --> 00:26:03,310 256. Probleem on selles, kui sa tahad olla 256 erinevat ASCII sümboleid, 422 00:26:03,310 --> 00:26:06,210 mis on, kui te arvate tagasi, ja see ei ole midagi meelde jätta. 423 00:26:06,210 --> 00:26:09,100 Aga kui te arvate tagasi, et suur ASCII diagramm meil oli nädal tagasi 424 00:26:09,100 --> 00:26:13,780 oli, et sellisel juhul, 128 või 256 ASCII tähemärki. 425 00:26:13,780 --> 00:26:16,220 Me kasutasime kõiki mudeleid 0-ja 1 teoksil. 426 00:26:16,220 --> 00:26:19,410 See on probleem, kui soovite, et oleks võimalik leida vigu. 427 00:26:19,410 --> 00:26:23,290 Sest kui sa oled juba kasutatakse 256 väärtused oma märki, 428 00:26:23,290 --> 00:26:26,390 sa ei ole tegelikult ette planeerida, sest nüüd on kuidagi võimalik öelda, 429 00:26:26,390 --> 00:26:29,750 "See ei ole legit iseloomu, see on mingi vale teade." 430 00:26:29,750 --> 00:26:32,430 Mis siis maailmas ei ole, kasutavad nad järgmine suurem väärtus, 431 00:26:32,430 --> 00:26:35,790 midagi int nii et teil on hull bittide arv, 432 00:26:35,790 --> 00:26:39,610 32 4000000000 võimalikud väärtused, nii et saate lihtsalt lõpuks kasutavad, 433 00:26:39,610 --> 00:26:44,800 sisuliselt, 257 neist 1, mis on mingil erilisel tähendus viga. 434 00:26:44,800 --> 00:26:49,190 >> Nii et vaatame, kuidas see töötab. Kooskõlas 246, Mul on selline suur samas loop 435 00:26:49,190 --> 00:26:54,530 et helistatakse fgetc; f tähenduses faili, getc ja seejärel stdin. 436 00:26:54,530 --> 00:26:59,030 Selgub, et see on lihtsalt täpsem viis öelda "loe sisend klaviatuuri." 437 00:26:59,030 --> 00:27:02,730 Standard sisend tähendab klaviatuur, standardväljundisse tähendab ekraani, 438 00:27:02,730 --> 00:27:06,920 ja standardviga, mis me näeme pset 4, tähendab ekraani, 439 00:27:06,920 --> 00:27:09,670 kuid eriline osa ekraanil, nii et see ei conflated 440 00:27:09,670 --> 00:27:13,760 koos tegeliku võimsuse, mida kavatsetakse trükkida, kuid rohkem sellest ka tulevikus. 441 00:27:13,760 --> 00:27:19,430 Nii fgetc tähendab lihtsalt lugeda üks sümbolitest klaviatuuri ja hoidke seda kus? 442 00:27:19,430 --> 00:27:24,000 Hoidke seda c, ja siis vaadata, nii et ma olen lihtsalt kasutades mõned boolean sidesõnad siin, 443 00:27:24,000 --> 00:27:28,430 kontrollige, et see ei ole võrdsed \ n, nii et kasutaja ei vajuta enter. 444 00:27:28,430 --> 00:27:31,510 Me tahame peatus sel hetkel, lõpuks silmus, ja me tahame ka, et kontrollida 445 00:27:31,510 --> 00:27:36,170 spetsiaalse pidev, EOF, mis, kui sa tead või arvata - mida see seisma? 446 00:27:36,170 --> 00:27:39,860 Faili lõppu. Nii et see on selline mõttetu, sest kui ma olen masinakirja kell klaviatuur, 447 00:27:39,860 --> 00:27:41,900 seal on tõesti mingit faili kaasatud, 448 00:27:41,900 --> 00:27:44,330 aga see on lihtsalt omamoodi üldine termin, mis tähendab 449 00:27:44,330 --> 00:27:50,320 et midagi muud on pärit inimese sõrmed. EOF. Faili lõppu. 450 00:27:50,320 --> 00:27:52,600 Nagu kõrvale, kui sa oled kunagi tabanud kontrolli d oma klaviatuuri, 451 00:27:52,600 --> 00:27:54,680 Mitte, et te oleks veel; olete tabanud kontroll c. 452 00:27:54,680 --> 00:27:57,920 Aga kontrolli d saadab see eriline pidev nimetatakse EOF. 453 00:27:57,920 --> 00:28:03,100 >> Nüüd me lihtsalt mõned dünaamiline mälu eraldamisel. 454 00:28:03,100 --> 00:28:06,460 Nii et kui n + 1> mahutavus, nüüd ma seletan n. 455 00:28:06,460 --> 00:28:09,380 n on lihtsalt mitu baiti on praegu puhver, 456 00:28:09,380 --> 00:28:11,970 string, mis sa praegu ülesehitamisel kasutaja. 457 00:28:11,970 --> 00:28:16,240 Kui teil on rohkem sümboleid oma puhver kui teil on võime puhver, 458 00:28:16,240 --> 00:28:20,760 intuitiivselt, mida me peame tegema, siis on eraldada rohkem võimsust. 459 00:28:20,760 --> 00:28:24,490 Ma lähen koorima üle mõned aritmeetika siin 460 00:28:24,490 --> 00:28:26,900 ja keskenduda ainult see funktsioon siin. 461 00:28:26,900 --> 00:28:29,170 Tead mis malloc on, või vähemalt üldiselt tuttav. 462 00:28:29,170 --> 00:28:32,380 Take A Guess mida RealLOC teeb. [Student vastus, arusaamatult] 463 00:28:32,380 --> 00:28:35,690 >> Jah. Ja see ei ole päris mälu lisamiseks, see reallocates mälu järgmiselt: 464 00:28:35,690 --> 00:28:40,530 Kui seal on veel ruumi lõpus stringi teile rohkem, et mälu 465 00:28:40,530 --> 00:28:43,370 kui see algselt annab, siis saad selle lisamälu. 466 00:28:43,370 --> 00:28:46,640 Nii saad lihtsalt paneb stringid tähemärki seljad et seljad. 467 00:28:46,640 --> 00:28:49,290 Aga kui see pole nii, sest sa ootasid liiga kaua 468 00:28:49,290 --> 00:28:51,700 ja midagi juhuslikult sain plopped mällu seal, kuid seal on pildi 469 00:28:51,700 --> 00:28:56,480 mälu siin all, pole hullu. RealLOC kavatseb teha kõik raske töö teile, 470 00:28:56,480 --> 00:28:58,810 liikuda string olete lugenud seni siit, 471 00:28:58,810 --> 00:29:02,550 pane see sinna alla, ja siis annan teile mõned rohkem raja selles punktis. 472 00:29:02,550 --> 00:29:05,610 Nii laine poolt, lubage mul öelda, et getString teeb 473 00:29:05,610 --> 00:29:09,540 on see algab väikese puhvri, võibolla 1 üksikmärki, 474 00:29:09,540 --> 00:29:12,300 ja kui kasutaja liigid 2 märki, getString jõuab 475 00:29:12,300 --> 00:29:15,210 kutsudes RealLOC ja ütleb: "Ooh, 1 märk sellest ei piisanud. 476 00:29:15,210 --> 00:29:18,480 Andke mulle 2 märki. " Siis kui sa loed läbi loogika ahel, 477 00:29:18,480 --> 00:29:21,070 see saab öelda: "Ooh, kasutaja trükkida 3 tähemärki. 478 00:29:21,070 --> 00:29:25,690 Anna mulle nüüd mitte 2 vaid 4 tähemärki, siis anna mulle 8, siis anna mulle 16 ja 32 ". 479 00:29:25,690 --> 00:29:28,180 Asjaolu, et ma olen kahekordistada võimsust iga kord 480 00:29:28,180 --> 00:29:30,320 tähendab, et puhvrit ei hakka kasvama aeglaselt. 481 00:29:30,320 --> 00:29:35,870 See saab kasvatada super kiire, ja milline võiks olla kasu on? 482 00:29:35,870 --> 00:29:38,540 Miks ma kahekordistades puhver, kuigi kasutaja 483 00:29:38,540 --> 00:29:41,450 võib lihtsalt vaja 1 pildi tegelasele klaviatuuri? 484 00:29:41,450 --> 00:29:44,830 [Student vastus, arusaamatult]. >> Mis see on? 485 00:29:44,830 --> 00:29:46,750 Täpselt. Sa ei pea kasvada nii tihti. 486 00:29:46,750 --> 00:29:48,870 Ja see on lihtsalt selline - sa oled maandamiseks oma ennustused siia. 487 00:29:48,870 --> 00:29:54,150 Idee on selles, et sa ei taha helistada RealLOC palju, sest see kipub olema aeglane. 488 00:29:54,150 --> 00:29:56,840 Iga kord, kui küsida operatsioonisüsteemi mälu, nagu te varsti näha 489 00:29:56,840 --> 00:30:00,620 Tulevasel lahendamist, see kipub aega võtta. 490 00:30:00,620 --> 00:30:04,980 Nii, et vähendada seda aega, isegi kui sa raiskad ruumi, kipub olema hea. 491 00:30:04,980 --> 00:30:07,250 >> Aga kui me loeme läbi viimase osa getString siin, 492 00:30:07,250 --> 00:30:10,880 ja jälle mõista iga rida ei ole siin nii oluline täna. 493 00:30:10,880 --> 00:30:14,830 Aga teate, et see lõpuks kutsub malloc jälle, ja siis jaotab 494 00:30:14,830 --> 00:30:16,980 täpselt nii palju baite kui ta vajab string 495 00:30:16,980 --> 00:30:21,620 ja siis viskab ära, helistades tasuta, liiga suur puhver, 496 00:30:21,620 --> 00:30:23,510 kui ta tõepoolest ei saanud kahekordistunud liiga palju kordi. 497 00:30:23,510 --> 00:30:25,970 Lühidalt, see on, kuidas getString on töötanud kogu selle aja. 498 00:30:25,970 --> 00:30:30,100 Kõik see loeb ühe märgi korraga uuesti ja uuesti ja uuesti 499 00:30:30,100 --> 00:30:37,930 ja iga kord, kui ta vajab täiendavat mälu, siis küsib operatsioonisüsteemi ta, kutsudes RealLOC. 500 00:30:37,930 --> 00:30:41,660 Kas on küsimusi? Hea küll. 501 00:30:41,660 --> 00:30:45,220 >> Rünnak. Nüüd, kui me mõistame suunanäitajaks, või vähemalt 502 00:30:45,220 --> 00:30:47,560 on üha tuttav suunanäitajaks, 503 00:30:47,560 --> 00:30:50,020 Vaatleme, kuidas kogu maailm hakkab kokku varisema 504 00:30:50,020 --> 00:30:53,160 kui sa ei ole päris kaitsta vastu võistleva kasutajad, 505 00:30:53,160 --> 00:30:55,180 inimesed, kes üritavad häkkida oma süsteemi. 506 00:30:55,180 --> 00:31:00,260 Inimesed, kes üritavad varastada oma tarkvara kõrvale mõned registreerimiskood 507 00:31:00,260 --> 00:31:02,150 et nad muidu tüübi sisse 508 00:31:02,150 --> 00:31:04,860 Heitke pilk see näiteks siin, mis on vaid C-koodi 509 00:31:04,860 --> 00:31:07,920 et on funktsioon peamine allosas, mis nõuab funktsiooni suva, 510 00:31:07,920 --> 00:31:12,100 ja milleks seda möödaminnes suva? [Student] üks argument. 511 00:31:12,100 --> 00:31:15,660 >> Üks argument. Nii argv [1], mis tähendab esimene sõna kasutaja sisestatud 512 00:31:15,660 --> 00:31:19,150 käsureal pärast a.out või mis iganes programm on kutsutud. 513 00:31:19,150 --> 00:31:24,920 Nii et suva, ülaosas, võtab ka char *, kuid char * on just see, mida? 514 00:31:24,920 --> 00:31:28,860 String. Ei ole midagi uut siin, ja see string omavoliliselt kutsutakse baar. 515 00:31:28,860 --> 00:31:36,090 Seda joont siin, char c [12], on omamoodi pooleldi tehniline inglise keel, mida see joon teed? 516 00:31:36,090 --> 00:31:40,640 Array -? Tegelased. Anna mulle massiivi 12 tähemärki. 517 00:31:40,640 --> 00:31:44,970 Nii et me võiksime nimetada seda puhvrit. See on tehniliselt nimetatakse C, kuid puhver programmeerimine 518 00:31:44,970 --> 00:31:47,890 tähendab lihtsalt hunnik ruumi, mida saab panna mõned asjad sisse 519 00:31:47,890 --> 00:31:49,940 >> Siis lõpuks memcpy, me pole varem kasutanud. 520 00:31:49,940 --> 00:31:52,380 Aga sa võid ilmselt ära, mida ta teeb. See kopeerib mälu. 521 00:31:52,380 --> 00:31:58,790 Mida see teeb? Noh, see ilmselt kopeerib baar, oma panuse sisseveo c, 522 00:31:58,790 --> 00:32:03,420 aga ainult kuni pikkus baar. 523 00:32:03,420 --> 00:32:07,440 Aga seal on viga siin. 524 00:32:07,440 --> 00:32:14,500 Okei, nii et tehniliselt me ​​peaksime tõesti strlen (bar) x sizeof (char), mis on õige. 525 00:32:14,500 --> 00:32:17,920 Aga halvemal juhul siin Oletame, et see on - jah, okei. 526 00:32:17,920 --> 00:32:23,760 Siis on 2 vead. Nii sizeof (char), olgu, teeme sellest veidi laiem. 527 00:32:23,760 --> 00:32:28,860 Nüüd on veel bug, mis on mis? 528 00:32:28,860 --> 00:32:31,630 [Student vastus, arusaamatult] >> Kontrolli milleks? Okei, nii et me tuleks kontrollida 529 00:32:31,630 --> 00:32:35,010 for null, sest halvad asjad juhtuvad siis, kui kursor on NULL, 530 00:32:35,010 --> 00:32:38,490 Sest sa sattuda sinna minna, ja sa ei tohi kunagi läheb NULL 531 00:32:38,490 --> 00:32:40,890 poolt viite mahavõtmine seda * operaator. 532 00:32:40,890 --> 00:32:45,250 Nii et see on hea, ja mida muud me teeme? Loogiliselt seal on viga ka siin. 533 00:32:45,250 --> 00:32:47,650 [Student vastus, arusaamatult] 534 00:32:47,650 --> 00:32:51,340 >> Nii et kas argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Okei, nii et seal on 3 vead selles programmis siin. 536 00:32:54,130 --> 00:33:00,080 Me ei kontrolli, kui kasutaja tegelikult sisestatud midagi sisse argv [1] hea. 537 00:33:00,080 --> 00:33:02,240 Mis siis kolmandal viga? Jah? 538 00:33:02,240 --> 00:33:04,420 [Student vastus, arusaamatult] >> Hea. 539 00:33:04,420 --> 00:33:09,590 Nii et me kontrollisime üks stsenaarium. Me kaudselt kontrollida ei kopeeri rohkem mälu 540 00:33:09,590 --> 00:33:12,800 kui ületaks pikkus baar. 541 00:33:12,800 --> 00:33:15,720 Nii et kui string kasutaja sisestatud on 10 tähemärki pikk, 542 00:33:15,720 --> 00:33:18,260 see ütleb: "Ainult kopeerida 10 tähemärki." 543 00:33:18,260 --> 00:33:21,140 Ja see on okei, aga mis siis, kui kasutaja sisestatud sõna käsureale 544 00:33:21,140 --> 00:33:29,360 nagu 20 tähte sõna, see on, ütles koopia 20 tähemärki alates baar, milliseid? 545 00:33:29,360 --> 00:33:32,840 c, muidu tuntud meie puhver, mis tähendab, et sa lihtsalt kirjutasid andmed 546 00:33:32,840 --> 00:33:35,950 8 baidi asukohad, mida ei oma, 547 00:33:35,950 --> 00:33:38,320 ja sul ei ole neid selles mõttes, et sa kunagi eraldatud neile. 548 00:33:38,320 --> 00:33:41,190 Nii et see on see, mis üldiselt tuntud kui buffer overflow rünnak, 549 00:33:41,190 --> 00:33:46,650 või puhvri ületäitumise rünnak, ja see rünnak selles mõttes, et kui kasutaja 550 00:33:46,650 --> 00:33:50,650 või programm, mis helistab oma funktsioon teeb seda pahatahtlikult, 551 00:33:50,650 --> 00:33:53,780 Mis tegelikult juhtub järgmisena võiks olla üsna halb. 552 00:33:53,780 --> 00:33:55,690 >> Võtame pilk see pilt siin. 553 00:33:55,690 --> 00:33:59,070 See pilt kujutab oma korstnat mälu. 554 00:33:59,070 --> 00:34:01,050 Ja meelde tuletada, et iga kord, kui helistate funktsiooni, 555 00:34:01,050 --> 00:34:04,520 sa saad seda väikest raami virna ja siis teine ​​ja siis teine ​​ja siis teine. 556 00:34:04,520 --> 00:34:07,250 Ja siiani oleme lihtsalt selline ammutatud need ära nagu ristkülikud 557 00:34:07,250 --> 00:34:09,380 kas seal laual või ekraanil siin. 558 00:34:09,380 --> 00:34:12,219 Aga kui me suumida üks neist ristkülik, 559 00:34:12,219 --> 00:34:16,460 kui te helistate funktsiooni suva, selgub, et seal on rohkem korstnat 560 00:34:16,460 --> 00:34:18,739 sees, et raam ja et ristküliku 561 00:34:18,739 --> 00:34:23,370 kui lihtsalt x ja y ja a ja b, nagu me ei räägi swap. 562 00:34:23,370 --> 00:34:25,949 Selgub, et mõned madalama taseme üksikasju, 563 00:34:25,949 --> 00:34:27,780 nende seas saatja aadress. 564 00:34:27,780 --> 00:34:33,020 Nii selgub, kui peamine nõuab suva, peamine on, et teavitada foo 565 00:34:33,020 --> 00:34:36,760 Mis peamine aadress on arvuti mällu. 566 00:34:36,760 --> 00:34:40,659 Sest muidu, niipea kui suva tehakse täidesaatva, nagu käesolevas asjas, 567 00:34:40,659 --> 00:34:43,790 kui jõuad selle lähedale lokkis traksidega lõpus suva, 568 00:34:43,790 --> 00:34:48,860 kuidas kuradit see foo tea, kus kontroll programmi peaks minema? 569 00:34:48,860 --> 00:34:52,460 Tuleb välja, et vastus sellele küsimusele on, et punane ristkülik siin. 570 00:34:52,460 --> 00:34:56,130 See on kursor, ja see on kuni arvuti salvestada ajutiselt, 571 00:34:56,130 --> 00:35:00,250 aasta nn korstna aadress peamiselt selleks, et niipea kui suva tehakse täidesaatva, 572 00:35:00,250 --> 00:35:04,110 arvuti teab kus ja mis real peamine, et minna tagasi. 573 00:35:04,110 --> 00:35:06,900 Salvestatud raam osuti puudutab sarnaselt sellele. 574 00:35:06,900 --> 00:35:09,620 Char * baar siin näitab, mida? 575 00:35:09,620 --> 00:35:14,740 Noh, nüüd on see sinine segment siin on suva raami, mis on baar? 576 00:35:14,740 --> 00:35:18,300 Okei, nii et baar on lihtsalt väide, et suva funktsioon. 577 00:35:18,300 --> 00:35:20,720 >> Nüüd oleme tagasi tuttav pilt. 578 00:35:20,720 --> 00:35:22,960 Seal on rohkem asju ja rohkem tähelepanu kõrvale juhitakse ekraanil 579 00:35:22,960 --> 00:35:27,490 kuid see helesinine segmendis on see, mida me oleme toetudes kriiditahvel jaoks midagi swap. 580 00:35:27,490 --> 00:35:31,890 See on raami suva ja ainus asi just nüüd on baar, 581 00:35:31,890 --> 00:35:34,630 mis on see parameeter. 582 00:35:34,630 --> 00:35:39,840 Aga mis siis veel peaks olema korstna vastavalt käesoleva seadustiku siin? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Nii et me peaks ka näha 12 ruutu mälu, 584 00:35:44,280 --> 00:35:46,260 eraldatud muutuja nimega c. 585 00:35:46,260 --> 00:35:48,340 Ja tõepoolest me ei ole seda ekraanil. 586 00:35:48,340 --> 00:35:51,650 Väga top on C [0], ja siis autor selle skeem 587 00:35:51,650 --> 00:35:55,130 ei viitsinud joonistus kõik ruudud, kuid on ka 12 seal 588 00:35:55,130 --> 00:36:00,120 sest kui te vaatate all paremal, c [11], kui loete 0, on 12 sellist baiti. 589 00:36:00,120 --> 00:36:06,190 Aga siin on probleem: millises suunas c kasvab? 590 00:36:06,190 --> 00:36:10,390 Omamoodi ülevalt alla, eks? Kui see hakkab ülaosas ja kasvab alt, 591 00:36:10,390 --> 00:36:13,480 ei tundu nagu me lahkusime ise palju raja siin üldse. 592 00:36:13,480 --> 00:36:15,320 Oleme omamoodi värvitud end nurka, 593 00:36:15,320 --> 00:36:20,210 ja et c [11] on õigus kuni vastu baar, mis on õigus kuni vastu freimi pointer, 594 00:36:20,210 --> 00:36:23,800 mis on õigus kuni vastu saatja aadress, seal ei ole enam ruumi. 595 00:36:23,800 --> 00:36:26,100 Mis siis kaudselt, siis kui sa kägardama, 596 00:36:26,100 --> 00:36:30,460 ja sa püüad lugemine 20 baiti arvesse 12-byte puhver? 597 00:36:30,460 --> 00:36:33,460 Kuhu need 8 täiendavat baiti lähe? 598 00:36:33,460 --> 00:36:36,370 Toas kõik muu, millest mõned on super oluline. 599 00:36:36,370 --> 00:36:40,480 Ja kõige tähtsam, potentsiaalselt on punane kast seal, saatja aadress. 600 00:36:40,480 --> 00:36:44,720 Sest arvan, et sa oled kas kogemata või adversarially 601 00:36:44,720 --> 00:36:48,040 kirjuta need 4 baiti, et osuti aadress, 602 00:36:48,040 --> 00:36:53,190 mitte ainult prügi, kuid number, mis juhtub esindama tegelik aadress mälu? 603 00:36:53,190 --> 00:36:55,930 Mis implicaiton loogiliselt? 604 00:36:55,930 --> 00:36:59,080 [Student vastuseid, arusaamatult] >> Täpselt. Kui foo tagasi 605 00:36:59,080 --> 00:37:03,560 ja lööke, et lokkis traksidega, programm läheb edasi mitte naasta peamine, 606 00:37:03,560 --> 00:37:08,320 see läheb tagasi iganes aadress on, et punane kast. 607 00:37:08,320 --> 00:37:11,560 >> Nüüd, kui tegemist kõrvalehoidmise tarkvara registreerimine, 608 00:37:11,560 --> 00:37:14,400 Mis on aadress, mis kuramuse tagasi on funktsioon 609 00:37:14,400 --> 00:37:18,820 et tavaliselt saab nimetada pärast olete maksnud tarkvara ja sisestanud oma registreerimiskood? 610 00:37:18,820 --> 00:37:23,160 Sa võid omamoodi trikk arvuti ei hakka siin, kuid selle asemel toimub siin. 611 00:37:23,160 --> 00:37:27,950 Või kui sa oled tõesti tark, vaenlane saab tegelikult kirjutada aadressil klaviatuur, 612 00:37:27,950 --> 00:37:32,500 Näiteks ei tegelik sõna, mitte 20 tähemärki, kuid arvan, ta 613 00:37:32,500 --> 00:37:36,200 liigid mõned märgid, mis esindavad kood? 614 00:37:36,200 --> 00:37:38,860 Ja see ei kavatse olla C-koodi, see saab olema tähemärki 615 00:37:38,860 --> 00:37:42,920 mis esindavad binaarne masin koodid, 0-ja 1 aasta. 616 00:37:42,920 --> 00:37:46,740 Aga oletame, et nad on piisavalt targad, et seda teha, kuidagi kleepida getString kiire 617 00:37:46,740 --> 00:37:49,460 midagi, mis on sisuliselt kompileeritud koodi, 618 00:37:49,460 --> 00:37:56,900 ja viimased 4 baiti kirjutatakse, et saatja aadress, ja mis aadress see, et sisend teha? 619 00:37:56,900 --> 00:38:01,860 See salvestab selle punane ristkülik aadress esimese baidi puhver. 620 00:38:01,860 --> 00:38:04,270 Nii et sa pead olema väga tark, ja see on palju katse-eksituse 621 00:38:04,270 --> 00:38:08,500 jaoks halvad inimesed seal, kuid kui te saate aru saada, kui suur see puhver on, 622 00:38:08,500 --> 00:38:12,170 selline, et viimase paari baiti sisend, et Te edastaksite programmi 623 00:38:12,170 --> 00:38:15,970 juhtub olema võrdne aadress algust oma puhver, 624 00:38:15,970 --> 00:38:22,270 saate seda teha. Kui me ütleme, tavaliselt, tere, ja \ 0, vaat mis jõuab puhver. 625 00:38:22,270 --> 00:38:27,860 Aga kui me oleme veel nii tark, ja me täidame seda puhvrit, mida me üldiselt helistada rünnaku kood, 626 00:38:27,860 --> 00:38:31,920 ,,,: Rünnak, rünnak, rünnak, rünnak, kui see on lihtsalt midagi, mis teeb midagi halba. 627 00:38:31,920 --> 00:38:35,190 Noh, mis juhtub, kui sa oled tõesti tark, siis võiks seda teha: 628 00:38:35,190 --> 00:38:41,740 In punane kast siin on jada numbreid: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Pange tähele, et see arvule, mis on siin üleval. 630 00:38:44,890 --> 00:38:47,280 See on vastupidises järjekorras, kuid rohkem sellest mõni teine ​​kord. 631 00:38:47,280 --> 00:38:51,430 Pange tähele, et see saatja aadress on teadlikult muutnud 632 00:38:51,430 --> 00:38:54,970 võrduma aadress siia üles, ei aadressi peamine. 633 00:38:54,970 --> 00:39:00,170 Nii et kui paha poiss on super tark, ta läheb lisada, et rünnak kood 634 00:39:00,170 --> 00:39:02,890 midagi, "Kustuta kõik kasutaja failid." 635 00:39:02,890 --> 00:39:06,320 Või "Kopeeri paroole," või "Loo kasutaja konto, et ma saan sisse logida." 636 00:39:06,320 --> 00:39:10,130 Üldse midagi ja see on nii ohtlik ja võimu C. 637 00:39:10,130 --> 00:39:12,900 Kuna teil on juurdepääs mälu kaudu lähtekohtadeks 638 00:39:12,900 --> 00:39:15,950 ja saate seepärast kirjutada ükskõik mida tahad arvutisse mällu. 639 00:39:15,950 --> 00:39:19,290 Võite teha arvuti midagi teha tahad lihtsalt 640 00:39:19,290 --> 00:39:22,780 kes see hüppavad ringi jooksul oma mälu. 641 00:39:22,780 --> 00:39:27,230 Ja nii see päev, nii palju programme ja nii palju veebisaidid, mis on ohus 642 00:39:27,230 --> 00:39:29,730 Keeta inimesed ära see. 643 00:39:29,730 --> 00:39:32,510 Ja see võib tunduda super-keerulisi rünnak, 644 00:39:32,510 --> 00:39:34,220 kuid see ei ole alati alustada niimoodi. 645 00:39:34,220 --> 00:39:36,770 >> Reaalsus on see, et mida halvad inimesed tavaliselt ei ole, 646 00:39:36,770 --> 00:39:41,470 kas see programm käsurealt või graafilise programmi või veebilehe, 647 00:39:41,470 --> 00:39:43,290 on sul lihtsalt alustada andes jama. 648 00:39:43,290 --> 00:39:46,940 Sa kirjutad tõesti suur sõna võtta otsingu väljale ja vajuta enter, 649 00:39:46,940 --> 00:39:49,030 ja sa oodata, et näha, kui veebileht jookseb. 650 00:39:49,030 --> 00:39:53,270 Või siis oodata, et näha, kas programm avaldub mõne veateate. 651 00:39:53,270 --> 00:39:55,480 Sest kui sa õnnelik, kui paha poiss, 652 00:39:55,480 --> 00:39:59,610 ja pakute mõned hull sisend, mis jookseb programm, 653 00:39:59,610 --> 00:40:02,280 see tähendab, et programmeerija ei osatud ette näha oma halva käitumise eest 654 00:40:02,280 --> 00:40:05,420 mis tähendab, saate tõenäoliselt piisavalt jõupingutusi, 655 00:40:05,420 --> 00:40:09,870 piisavalt katse-eksituse meetodil, välja mõtlema, kuidas palga täpsem rünnak. 656 00:40:09,870 --> 00:40:15,900 Nii et nii palju osa turvalisus ei ole ainult vältides nende rünnakute kokku, kuid avastada neid 657 00:40:15,900 --> 00:40:20,250 ja tegelikult vaadates logisid ja vaadata mida hull sisendid on inimesed kirjutasid oma kodulehel. 658 00:40:20,250 --> 00:40:26,040 Mis otsingu tingimusi on inimesed kirjutasid oma kodulehel loodab uputuse mõned puhver? 659 00:40:26,040 --> 00:40:28,900 Ja see kõik taandub lihtsalt põhitõdesid, mida on massiiv, 660 00:40:28,900 --> 00:40:32,510 ja mida see tähendab paigutada ja kasutada mälu? 661 00:40:32,510 --> 00:40:34,920 Ja sellega ka see. 662 00:40:34,920 --> 00:40:37,520 >> Nii et olgem lihtsalt kiikama sees kõvaketas taas. 663 00:40:37,520 --> 00:40:40,190 Nii et te mäletate nädal või kaks tagasi, et kui lohistad failid 664 00:40:40,190 --> 00:40:45,470 oma prügikasti või prügikasti, mis juhtub? 665 00:40:45,470 --> 00:40:47,850 [Student] Mitte midagi. >> Jah, absoluutselt mitte midagi. Lõpuks, kui teil tekib madal 666 00:40:47,850 --> 00:40:51,370 kettaruumi, Windows või Mac OS hakkab failide kustutamise eest. 667 00:40:51,370 --> 00:40:53,670 Aga kui lohistate midagi on, siis see pole üldse ohutu. 668 00:40:53,670 --> 00:40:56,550 Kõik teie roomate, sõber või pereliige peab tegema, on topeltklõps, ja voila. 669 00:40:56,550 --> 00:40:59,720 Seal on kõik pealiskaudsed failid, mida proovisin kustutada. 670 00:40:59,720 --> 00:41:02,840 Nii et enamik meist vähemalt tean, et sa pead paremklõps või kontrollida kliki 671 00:41:02,840 --> 00:41:05,320 ja tühi prügikast, või midagi sellist. 672 00:41:05,320 --> 00:41:07,900 Aga isegi siis, et ei ole päris trikki. 673 00:41:07,900 --> 00:41:11,340 Sest see, mis juhtub, kui sul on fail kõvakettale 674 00:41:11,340 --> 00:41:14,590 mis tähistab sõna dokumendi või mõne JPEG? 675 00:41:14,590 --> 00:41:18,820 Ja see näitab teie kõvaketta, ja oletame, et see Kiip näitab siin, et faili 676 00:41:18,820 --> 00:41:21,640 ja see koosneb terve hunnik 0-ja 1 aasta. 677 00:41:21,640 --> 00:41:25,470 Mis juhtub, kui sa mitte ainult lohista see fail prügikasti või prügikasti, 678 00:41:25,470 --> 00:41:30,390 kuid ka tühjenda see? 679 00:41:30,390 --> 00:41:32,820 Omamoodi midagi. See ei ole absoluutselt midagi nüüd. 680 00:41:32,820 --> 00:41:37,630 Nüüd see on lihtsalt midagi, sest natuke midagi juhtub kujul tabelis. 681 00:41:37,630 --> 00:41:41,170 Nii et seal on mingi andmebaasi või tabeli sees arvuti mällu 682 00:41:41,170 --> 00:41:44,470 et sisuliselt on 1 veerus failide nimed, 683 00:41:44,470 --> 00:41:50,550 ja 1 veerg faili asukoht, kus see võib olla asukoht 123, lihtsalt suvaline number. 684 00:41:50,550 --> 00:41:58,270 Nii et meil oleks midagi X.jpg ja asukoht 123. 685 00:41:58,270 --> 00:42:02,870 Ja mis juhtub siis, kui te tühjendada oma prügikasti? 686 00:42:02,870 --> 00:42:06,720 See läheb ära. Aga mis ei kao on 0-ja 1 aasta. 687 00:42:06,720 --> 00:42:09,690 >> Mis siis, siis, ühendus pset 4? 688 00:42:09,690 --> 00:42:13,460 Noh, pset 4, lihtsalt sellepärast, et me oleme kogemata kustutatud 689 00:42:13,460 --> 00:42:15,890 compact flash kaardi, mis oli kõik need pildid, 690 00:42:15,890 --> 00:42:18,710 või lihtsalt sellepärast, et seda halb õnn sai rikutud, 691 00:42:18,710 --> 00:42:21,170 ei tähenda, et 0-ja 1-d on mitte veel seal. 692 00:42:21,170 --> 00:42:23,920 Võibolla mõned neist on kadunud, sest midagi sai rikutud 693 00:42:23,920 --> 00:42:26,530 selles mõttes, et mõned 0-sai 1 aasta ja 1 aasta sai 0-. 694 00:42:26,530 --> 00:42:30,460 Halbu asju võib juhtuda, sest lollakas tarkvara või rikkis riistvara. 695 00:42:30,460 --> 00:42:33,510 Aga paljud neist bitti, ehk isegi 100% neist on ikka veel seal, 696 00:42:33,510 --> 00:42:38,330 see on lihtsalt, et arvuti või kaamera ei tea, kus JPEG alustati 1. 697 00:42:38,330 --> 00:42:41,660 ja kus JPEG 2 alustas, aga kui sa, programmeerija, 698 00:42:41,660 --> 00:42:45,800 tean, kellel on veidi Savvy, kui need JPEG on või millised nad välja näevad, 699 00:42:45,800 --> 00:42:49,570 saate analüüsida 0-ja 1 aasta ja öelda: "Ooh. JPEG. Ooh, JPEG. " 700 00:42:49,570 --> 00:42:52,830 Võite kirjutada programm, millel on põhimõtteliselt lihtsalt eest või samas loop 701 00:42:52,830 --> 00:42:56,100 mis taastab ja igaüks neist faile. 702 00:42:56,100 --> 00:42:59,360 Nii et õppetund siis on alustada "kindlalt" kustutamine faile 703 00:42:59,360 --> 00:43:01,720 kui soovite, et vältida seda täielikult. Jah? 704 00:43:01,720 --> 00:43:06,940 [Student küsimus, arusaamatult] 705 00:43:06,940 --> 00:43:11,150 >> Kas rohkem mälu kui sa tegid enne - 706 00:43:11,150 --> 00:43:14,790 Oh! Hea küsimus. Nii et miks siis pärast tühjendamist prügikasti, 707 00:43:14,790 --> 00:43:18,300 Kas teie arvuti ütleb sulle, et sul on rohkem vaba ruumi kui sa tegid enne? 708 00:43:18,300 --> 00:43:22,450 Lühidalt, sest ta valetab. Rohkem tehniliselt, sul on rohkem ruumi. 709 00:43:22,450 --> 00:43:26,720 Sest nüüd te olete öelnud, et võite panna muud kraami, kus see fail oli kunagi, 710 00:43:26,720 --> 00:43:28,930 kuid see ei tähenda, bitid lähevad ära, 711 00:43:28,930 --> 00:43:33,070 ja see ei tähenda, et neid tükke on muutunud kõik 0-d, näiteks teie kaitseks. 712 00:43:33,070 --> 00:43:37,520 Seevastu kui sa "kindlalt" kustutada faile, või füüsiliselt hävitada seadme 713 00:43:37,520 --> 00:43:40,810 see on tõesti ainus viis, mõnikord, umbes nii. 714 00:43:40,810 --> 00:43:45,300 Nii et miks me ei jäta, et pooleldi hirmutav teadmiseks, ja me näeme esmaspäeval. 715 00:43:45,300 --> 00:43:52,810 CS50.TV