1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Nädal 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvardi Ülikool] 3 00:00:04,860 --> 00:00:07,260 [See on CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> See on CS50, 5. nädal. 5 00:00:09,740 --> 00:00:12,900 Täna ja sel nädalal, tutvustame natuke maailma kohtuekspertiisi 6 00:00:12,900 --> 00:00:14,850 kontekstis Ülesanded nr 4. 7 00:00:14,850 --> 00:00:18,480 Täna on lühendatud loeng sest seal üritusel siin hiljem. 8 00:00:18,480 --> 00:00:21,940 Nii et me võtame piiluda ja tease nii õpilased kui ka vanemad täna 9 00:00:21,940 --> 00:00:24,600 mõned asjad, mis on silmapiiril. 10 00:00:24,600 --> 00:00:29,050 >> Neist alates esmaspäevast, siis on veel mõned klassikaaslased. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvardi ja MIT-i uue online algatus OpenCourseWare ja rohkem, 12 00:00:32,980 --> 00:00:36,730 on käivitades Harvardi ülikooli esmaspäeval, mis tähendab tulnud esmaspäev 13 00:00:36,730 --> 00:00:40,930 siis on, kui on ometi loota, 86000 täiendavaid klassikaaslastega 14 00:00:40,930 --> 00:00:43,680 kes saab pärast koos CS50 loenguid ja lõigud 15 00:00:43,680 --> 00:00:45,890 ja walkthroughs ja probleem seab. 16 00:00:45,890 --> 00:00:51,870 Ja osa sellest, siis muutub liikmed avaistung klassi CS50 ja nüüd CS50x. 17 00:00:51,870 --> 00:00:56,150 Osana sellest nüüd aru, et seal on mõned plussid ka. 18 00:00:56,150 --> 00:01:00,620 Et saada selleks valmis, sest tohutu hulk üliõpilasi, 19 00:01:00,620 --> 00:01:03,820 piisab, kui öelda, et kuigi meil on 108 TF ja pädevad, 20 00:01:03,820 --> 00:01:07,560 see ei ole päris parim õpilane-õpetaja suhe kui me tabanud 80000 õpilastele. 21 00:01:07,560 --> 00:01:09,830 Me ei kavatse liigitamiseks nii palju probleem seab käsitsi 22 00:01:09,830 --> 00:01:13,050 nii tutvustas sel nädalal probleem komplekti saab CS50 Kontrolli, 23 00:01:13,050 --> 00:01:15,410 mis saab olema käsurea utiliidi jooksul seade 24 00:01:15,410 --> 00:01:17,880 et sa saad kui sa uuendada seda hiljem sel nädalavahetusel. 25 00:01:17,880 --> 00:01:21,030 Sul on võimalik käivitada käsku, check50, ise pset, 26 00:01:21,030 --> 00:01:24,770 ja saad kohe tagasisidet selle kohta, kas teie programm on õige või vale 27 00:01:24,770 --> 00:01:27,980 vastavalt erinevatele konstruktsiooni kirjeldused, et oleme andnud. 28 00:01:27,980 --> 00:01:30,310 Rohkem, et probleem komplekt spetsifikatsioon. 29 00:01:30,310 --> 00:01:34,220 CS50x klassikaaslastega kasutate seda samuti. 30 00:01:34,220 --> 00:01:36,170 >> Ülesanded nr 4 on kõik umbes kohtuekspertiisi, 31 00:01:36,170 --> 00:01:38,630 ja see pset oli tõesti inspireeritud mõned reaalse elu kraami 32 00:01:38,630 --> 00:01:41,210 kusjuures kui ma olin lõpetanud keskkooli Ma interneeritud mõnda aega 33 00:01:41,210 --> 00:01:45,270 koos Middlesex County District Attorney kabinetis teed kohtuekspertiisi töö 34 00:01:45,270 --> 00:01:47,660 oma plii kohtuekspertiisi uurija. 35 00:01:47,660 --> 00:01:50,280 Mis see oli, kui ma arvan, ma mainisin paar nädalat möödas, 36 00:01:50,280 --> 00:01:52,720 mass osariigi politsei või teised oleks tulnud, 37 00:01:52,720 --> 00:01:56,150 nad lahkuvad asjad nagu kõvakettad ja CDd ja disketid jms, 38 00:01:56,150 --> 00:01:58,770 ja siis eesmärk kohtuekspertiisi büroo oli välja selgitada 39 00:01:58,770 --> 00:02:01,470 kas oli või ei olnud tõendeid mingi. 40 00:02:01,470 --> 00:02:04,730 See oli Special uurimise osakond, nii et see oli valgekraede kuritegevusega. 41 00:02:04,730 --> 00:02:10,949 See oli rohkem vaeva omamoodi kuritegusid, midagi seotud mingi digitaalse meedia. 42 00:02:10,949 --> 00:02:16,450 Tuleb välja, et ei ole, et paljud inimesed kirjutada talle, öeldes: "Ma tegin seda." 43 00:02:16,450 --> 00:02:20,490 Nii et üsna sageli on need kohtuekspertiisi otsingud ei ilmu kõik, et palju vilja, 44 00:02:20,490 --> 00:02:22,820 kuid mõnikord inimesed kirjutavad selliseid e-kirju. 45 00:02:22,820 --> 00:02:25,240 Nii et mõnikord, jõupingutusi premeeriti. 46 00:02:25,240 --> 00:02:31,210 >> Aga elada kuni see kohtuekspertiisi pset, saadame kehtestades pset4 natuke graafika. 47 00:02:31,210 --> 00:02:35,410 Sa ilmselt võtta neid asju enesestmõistetavaks - JPEG, GIF, jms - neid päevi. 48 00:02:35,410 --> 00:02:38,320 Aga kui sa tõesti arvad, pilt, palju nagu Rob nägu, 49 00:02:38,320 --> 00:02:41,270 eeskujuks võiks olla jadana dots või pikslit. 50 00:02:41,270 --> 00:02:43,380 Juhul Rob nägu, seal on igasuguseid värve, 51 00:02:43,380 --> 00:02:46,760 ja hakkasime näha üksikuid punkte, muidu tuntud pikslit, 52 00:02:46,760 --> 00:02:48,610 kui hakkasime suumimiseks 53 00:02:48,610 --> 00:02:54,660 Aga kui me lihtsustada maailma natuke ja lihtsalt öelda, et see siin on Rob must-valge, 54 00:02:54,660 --> 00:02:57,490 esindada must ja valge, saame lihtsalt kasutada binaarse. 55 00:02:57,490 --> 00:03:01,660 Ja kui me ei kavatse kasutada binaarne, 1 või 0, saame väljendada seda sama pilt 56 00:03:01,660 --> 00:03:06,140 Rob naeratav nägu see muster bitti. 57 00:03:06,140 --> 00:03:12,100 11000011 tähistab valge, valge, must, must, must, must, valge, valge. 58 00:03:12,100 --> 00:03:16,150 Ja nii see ei ole väga suur samm seejärel hakata rääkima värvilisi fotosid, 59 00:03:16,150 --> 00:03:18,600 asjad, mida soovite näha Facebookis või võtta digikaamera. 60 00:03:18,600 --> 00:03:21,410 Aga kindlasti, kui tegemist on värve, mida vaja rohkem bitte. 61 00:03:21,410 --> 00:03:25,690 Ja üsna levinud maailma piltidest on kasutada mitte 1-bitine värv, 62 00:03:25,690 --> 00:03:29,560 kui see ütleb, kuid 24-bitine värv, kus sa tegelikult saad miljoneid värve. 63 00:03:29,560 --> 00:03:32,250 Nii nagu siis, kui me suurendada sisse Rob silma, 64 00:03:32,250 --> 00:03:36,370 see oli suvaline arv miljoneid erinevaid värvikaid võimalusi. 65 00:03:36,370 --> 00:03:39,040 Nii et me tutvustada seda Ülesanded nr 4, samuti ülevaadet, 66 00:03:39,040 --> 00:03:43,370 mis on täna kell 03:30 asemel tavalisi 02:30 tõttu reedel loeng siin. 67 00:03:43,370 --> 00:03:46,620 Aga video on Internetis nagu tavaliselt homme. 68 00:03:46,620 --> 00:03:48,820 >> Me ka tutvustada teile teises failivormingus. 69 00:03:48,820 --> 00:03:51,270 See on tahtlikult mõeldud vaatama hirmutavalt esimesel, 70 00:03:51,270 --> 00:03:55,670 aga see on lihtsalt mingi dokumentatsioon C struct. 71 00:03:55,670 --> 00:03:58,940 Selgub, et Microsoft aastat tagasi aitasid populariseerida seda formaati 72 00:03:58,940 --> 00:04:05,150 nimetatakse bitmap faili formaadis, bmp, ja see oli super lihtne, värvikas graafilise faili formaadis 73 00:04:05,150 --> 00:04:10,150 , mida kasutati juba mõnda aega ja mõnikord veel taustapilte lauale. 74 00:04:10,150 --> 00:04:14,760 Kui te arvate tagasi Windows XP ja jooksva mäed ja sinine taevas, 75 00:04:14,760 --> 00:04:17,170 mis oli tavaliselt bmp või digitaalkujutisena. 76 00:04:17,170 --> 00:04:19,959 Rasterpildid on lõbus juures, sest neil on natuke rohkem keeruline. 77 00:04:19,959 --> 00:04:22,610 See ei ole päris nii lihtne see ruudustik 0. ja 1s. 78 00:04:22,610 --> 00:04:27,510 Selle asemel, sa pead asjad päise alguses faili. 79 00:04:27,510 --> 00:04:31,990 Nii teisisõnu sees. Bmp fail on terve hunnik 0. ja 1s, 80 00:04:31,990 --> 00:04:34,910 kuid seal on mõned täiendavad 0. ja 1s seal. 81 00:04:34,910 --> 00:04:38,220 Ja selgub, et me oleme tõenäoliselt iseenesestmõistetavaks aastaid - 82 00:04:38,220 --> 00:04:45,170 failivorminguid nagu. doc või. xls või. mp3,. mp4, olenemata failivormingud 83 00:04:45,170 --> 00:04:48,480 et te olete juba tuttav - mida see üldse tähendab olla vormingus, 84 00:04:48,480 --> 00:04:52,480 sest lõpus päeval kõik need failid, mida me kasutame on lihtsalt 0. ja 1s. 85 00:04:52,480 --> 00:04:56,810 Ja võib-olla need 0. ja 1s esindama ABC läbi ASCII vms, 86 00:04:56,810 --> 00:04:58,820 kuid lõpus päeval, see on ikka lihtsalt 0. ja 1s. 87 00:04:58,820 --> 00:05:02,100 Nii et inimesed lihtsalt aeg-ajalt otsustada leiutada uus failivorming 88 00:05:02,100 --> 00:05:06,420 kus nad standardida mida mustrid bitti tähendab tegelikult. 89 00:05:06,420 --> 00:05:09,220 Ja selles asjas, inimesed, kes loodud bitmap faili formaat 90 00:05:09,220 --> 00:05:15,620 ütles, et kõige esimene bait bitmap faili, kui tähistatakse plokist 0 seal, 91 00:05:15,620 --> 00:05:18,940 seal saab olema mingi cryptically nimega muutuja nimega bfType, 92 00:05:18,940 --> 00:05:23,080 mis lihtsalt seisab bitmap faili tüüp, millist tüüpi bitmap faili on selles. 93 00:05:23,080 --> 00:05:27,700 Võite järeldada ehk alates teisest reast, et kompenseerida 2 baidi number 2, 94 00:05:27,700 --> 00:05:33,740 on muster 0. ja 1s, mis tähistab mis? Suurust midagi. 95 00:05:33,740 --> 00:05:35,310 Ja ta läheb edasi sealt. 96 00:05:35,310 --> 00:05:37,410 Nii Ülesanded nr 4, siis saad kõndis läbi mõned neist asjadest. 97 00:05:37,410 --> 00:05:39,520 Me ei jõua hooliv neid kõiki. 98 00:05:39,520 --> 00:05:47,510 Aga märkate ta hakkab saama huvitav ümber bait 54: rgbtBlue, roheline ja punane. 99 00:05:47,510 --> 00:05:52,110 Kui olete kunagi kuulnud akronüüm RGB - punane, roheline, sinine - see on viide sellele 100 00:05:52,110 --> 00:05:54,610 sest selgub, võite maalida kõik värvid vikerkaar 101 00:05:54,610 --> 00:05:58,180 mõned kombinatsioon punane ja sinine ja roheline. 102 00:05:58,180 --> 00:06:03,320 Ja tegelikult, vanemad ruumis võiks meenutada, mõned varem projektorid. 103 00:06:03,320 --> 00:06:05,890 Nendel päevadel, sa lihtsalt näha üht eredat valgust tulevad välja objektiiv, 104 00:06:05,890 --> 00:06:09,800 kuid juba järgmisel päeval sul oli punane lääts, sinine objektiiv, ja roheline lääts, 105 00:06:09,800 --> 00:06:13,380 ja koos nad on suunatud ekraani ja moodustasid värviline pilt. 106 00:06:13,380 --> 00:06:16,270 Ja üsna tihti, keskastme koolides ja keskkoolides oleks need läätsed 107 00:06:16,270 --> 00:06:19,720 kunagi nii veidi viltu, et sa olid omamoodi näeme topelt-või kolmekordne pilte. 108 00:06:19,720 --> 00:06:24,100 Aga see oli mõte. Sul oli punane ja roheline ja sinine valgus maali pilt. 109 00:06:24,100 --> 00:06:26,590 Ja see sama põhimõtet on kasutatud ka arvutid. 110 00:06:26,590 --> 00:06:30,230 >> Nii väljakutsete hulgas siis teile Ülesanded nr 4 ei kavatse olla mõned asjad. 111 00:06:30,230 --> 00:06:34,800 Üks on tegelikult muuta pildi suurust, et võtta muster 0. ja 1s, 112 00:06:34,800 --> 00:06:40,200 aru saada, mis tükkideks 0. ja 1s esindama Mida struktuur niimoodi, 113 00:06:40,200 --> 00:06:43,630 ja siis nuputada, kuidas imiteerida pikslit - punased, sinised, rohelised - 114 00:06:43,630 --> 00:06:46,660 sees nii, et kui pilt näeb välja selline esialgu 115 00:06:46,660 --> 00:06:49,210 See võib tunduda selle asemel pärast seda. 116 00:06:49,210 --> 00:06:53,640 Muude probleemide liiga saab olema, et saad kätte kohtuekspertiisi pilt 117 00:06:53,640 --> 00:06:56,030 tegeliku faili digikaamera. 118 00:06:56,030 --> 00:06:58,960 Ja et kaamera, kunagi ammu, olid terve hunnik pilte. 119 00:06:58,960 --> 00:07:03,760 Probleem on meil kogemata kustutada või oli pilt rikutud kuidagi. 120 00:07:03,760 --> 00:07:05,750 Halvad asjad juhtuvad digitaalkaameratega. 121 00:07:05,750 --> 00:07:09,150 Ja nii me kiiresti kopeerida kõik 0. ja 1s pealt, et kaart sulle, 122 00:07:09,150 --> 00:07:13,610 salvestatakse need kõik üks suur fail, ja siis me aga neid teile Ülesanded nr 4 123 00:07:13,610 --> 00:07:19,320 nii et võite kirjutada programm C keeles, mille abil taastada kõik need JPEG, ideaalis. 124 00:07:19,320 --> 00:07:23,330 Ja selgub, et JPEG, kuigi nad on mõnevõrra keeruline failivorming - 125 00:07:23,330 --> 00:07:26,360 nad on palju keerulisem kui see naeratav nägu siin - 126 00:07:26,360 --> 00:07:31,160 Selgub, et igal JPEG algab samade mustrite 0. ja 1s. 127 00:07:31,160 --> 00:07:35,630 Nii et kasutades lõpuks samas loop või loop vms, 128 00:07:35,630 --> 00:07:38,880 saate kinnitada, üle kogu 0. ja 1s selles kohtuekspertiisi pilt, 129 00:07:38,880 --> 00:07:43,150 ja iga kord näed eriline muster, mis on määratletud probleemi komplekt spetsifikatsioon, 130 00:07:43,150 --> 00:07:47,880 võite eeldada, siin on väga suur tõenäosus, alguses JPEG. 131 00:07:47,880 --> 00:07:51,230 Ja niipea kui sa leiad sama mudeli mõned baitide arv 132 00:07:51,230 --> 00:07:55,430 või kilobaiti või megabaiti hiljem, siis võib eeldada, siin on teine ​​JPEG, 133 00:07:55,430 --> 00:07:57,380 foto võtsin pärast esimest. 134 00:07:57,380 --> 00:08:01,370 Lubage mul lõpetada lugemine, et esimese faili, hakake selle uuega, 135 00:08:01,370 --> 00:08:06,310 ja toodang oma programmi pset4 saab olema koguni 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 Ja kui see on mitte 50 JPEG, sul on natuke silmus. 137 00:08:09,270 --> 00:08:12,490 Kui teil on lõpmatu arv JPEG, teil on lõputu silmuse. 138 00:08:12,490 --> 00:08:14,910 Nii et liiga on üsna sage juhtum. 139 00:08:14,910 --> 00:08:16,600 Nii see on, mida on silmapiiril. 140 00:08:16,600 --> 00:08:21,310 >> Viktoriin 0 möödas, realiseerida ühe minu e-posti, et alati on olemas inimesed, kes on nii õnnelik, 141 00:08:21,310 --> 00:08:23,640 omamoodi neutraalne, ja kurb ümber viktoriin 0 korda. 142 00:08:23,640 --> 00:08:26,800 Ja palun ärge jõuda mind, pea TF Zamyla, oma TF, 143 00:08:26,800 --> 00:08:31,180 või üks CAd, et sa tead, kui sa tahaksid arutada, kuidas asjad läksid. 144 00:08:31,180 --> 00:08:35,539 >> Nii muljet vanemad siin ruumis, mis on CS50 raamatukogu? 145 00:08:36,429 --> 00:08:40,390 [Naer] Hea töö. 146 00:08:40,390 --> 00:08:48,340 Mis CS50 raamatukogu? Jah. >> [Üliõpilane] See on eelnevalt kirjutatud rida koodi [kuuldamatu] 147 00:08:48,340 --> 00:08:49,750 Olgu, hästi. 148 00:08:49,750 --> 00:08:53,240 See on eelnevalt kirjutatud rida koodi, et me töötajad kirjutas, anname teile, 149 00:08:53,240 --> 00:08:55,030 mis annab teatud ühine funktsionaalsus, 150 00:08:55,030 --> 00:08:59,020 kraami nagu mind string, mind int - kõik funktsioonid, mis on loetletud siin. 151 00:08:59,020 --> 00:09:02,260 >> Alustades nüüd, hakkame tõesti võtta need abirattad maha. 152 00:09:02,260 --> 00:09:05,050 Me ei kavatse alustada ära võtta stringi sa, 153 00:09:05,050 --> 00:09:08,870 mis meenutavad oli lihtsalt sünonüüm, mida tegelik andmetüüp? >> [Mitu õpilast] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Lapsevanematele, see oli arvatavasti [teeb whooshing heli]. See on hea. 155 00:09:12,730 --> 00:09:17,550 Char * hakkame näha ekraanil seda enam, kui me eemaldada stringi meie sõnavara, 156 00:09:17,550 --> 00:09:19,730 vähemalt kui tegemist on tegelikult kirjalikult koodi. 157 00:09:19,730 --> 00:09:22,840 Samamoodi, siis lõpetame kasutades mõned neist funktsioonidest nii palju 158 00:09:22,840 --> 00:09:25,280 sest meie programmid ei hakka keerulisemaks. 159 00:09:25,280 --> 00:09:28,480 Selle asemel, et lihtsalt kirjutada programme, mis seal istuda koos kiire vilkumine, 160 00:09:28,480 --> 00:09:31,870 ootab kasutajal tippida midagi, saad oma sisendeid mujalt. 161 00:09:31,870 --> 00:09:35,490 Näiteks saad neid ka mitme bitti kohalikul kõvakettal. 162 00:09:35,490 --> 00:09:38,580 Sul asemel saada neid tulevikus võrguühenduse 163 00:09:38,580 --> 00:09:40,230 mõned koduleheküljel kusagil. 164 00:09:40,230 --> 00:09:44,110 >> Nii et olgem koor tagasi see kiht esimest korda ja tõmba CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 ja see fail nimega cs50.h, mille jooksul olete # sealhulgas nädalat, 166 00:09:49,010 --> 00:09:51,140 kuid olgem tegelikult näha, mis seal sees sellest. 167 00:09:51,140 --> 00:09:54,430 Faili algusesse sinine on lihtsalt terve hunnik märkusi: 168 00:09:54,430 --> 00:09:57,050 garantii ja litsentsimist. 169 00:09:57,050 --> 00:09:59,050 See on omamoodi ühise paradigma tarkvara 170 00:09:59,050 --> 00:10:01,580 sest palju tarkvara nendel päevadel on, mida nimetatakse avatud lähtekoodiga, 171 00:10:01,580 --> 00:10:05,220 mis tähendab, et keegi on kirjutanud koodi ja tehtud see vabalt saadaval 172 00:10:05,220 --> 00:10:10,470 mitte ainult joosta ja kasutada, kuid tegelikult lugeda ja muuta ja integreerida oma töö. 173 00:10:10,470 --> 00:10:14,660 Nii see on, mida olete kasutanud, avatud lähtekoodiga tarkvara, kuigi väga väike vorm. 174 00:10:14,660 --> 00:10:18,560 Kui ma keri minevikku kommentaare, aga me hakkame nägema mõned tuttavad asjad. 175 00:10:18,560 --> 00:10:25,010 Teade ülaosas siin, et cs50.h fail sisaldab terve hunniku päisefaile. 176 00:10:25,010 --> 00:10:28,560 Enamik neist ei ole me näinud, kuid üks on tuttav. 177 00:10:28,560 --> 00:10:32,270 Milline neist oleme näinud, kuigi lühidalt, siiani? >> [Üliõpilane] Standard raamatukogu. 178 00:10:32,270 --> 00:10:35,810 Jah, standard raamatukogu. stdlib.h on malloc. 179 00:10:35,810 --> 00:10:38,320 Kui me hakkasime rääkima dünaamiline mälu eraldamise, 180 00:10:38,320 --> 00:10:41,650 mis me tuleme tagasi järgmisel nädalal ning alustasime ka selle faili. 181 00:10:41,650 --> 00:10:46,640 Selgub, et bool ja õige ja vale tegelikult ei eksisteeri C iseenesest 182 00:10:46,640 --> 00:10:49,440 kui sa lisada see fail siin. 183 00:10:49,440 --> 00:10:52,710 Oleme nädalaid olnud ka stdbool.h 184 00:10:52,710 --> 00:10:55,620 nii, et saate kasutada mõistet bool, õige või vale. 185 00:10:55,620 --> 00:10:58,620 Ilma selleta oleks teil sorteerida võltsitud ja kasutab int 186 00:10:58,620 --> 00:11:02,610 ja lihtsalt suvaliselt eeldada, et 0 on vale ja 1 on tõsi. 187 00:11:02,610 --> 00:11:07,150 Kui me kerige edasi, siin on meie mõiste string. 188 00:11:07,150 --> 00:11:11,390 Selgub, nagu me oleme varem öelnud, et kui see täht on ei ole tegelikult küsimus. 189 00:11:11,390 --> 00:11:13,720 Võite isegi ruumi kõikjalt. 190 00:11:13,720 --> 00:11:16,740 Me käesoleval poolaastal on selle edendamisel see selgeks teha 191 00:11:16,740 --> 00:11:18,620 et täht on pistmist tüüpi, 192 00:11:18,620 --> 00:11:21,700 aga aru, kui ühine, kui mitte veidi rohkem levinud, 193 00:11:21,700 --> 00:11:24,430 on panna sinna, kuid funktsionaalselt on see sama asi. 194 00:11:24,430 --> 00:11:27,720 Aga nüüd, kui me loeme ette veelgi, võtame pilk GetInt 195 00:11:27,720 --> 00:11:32,190 sest me kasutasime, et võib-olla esimene enne midagi muud see semester. 196 00:11:32,190 --> 00:11:37,440 Siin on GetInt. See on see, mida? >> [Üliõpilane] prototüüp. >> See on lihtsalt prototüüp. 197 00:11:37,440 --> 00:11:41,410 Sageli oleme pannud prototüüpide tippude meie. C faili, 198 00:11:41,410 --> 00:11:46,690 kuid võite ka panna prototüüpide päisefaile. h faile, nagu see siin 199 00:11:46,690 --> 00:11:50,840 nii et kui kirjutad teatud funktsioonidele, mida soovite teised inimesed, et oleks võimalik kasutada, 200 00:11:50,840 --> 00:11:53,550 mis on täpselt puhul CS50 raamatukogu, 201 00:11:53,550 --> 00:11:57,040 te mitte ainult ellu oma ülesandeid midagi cs50.c, 202 00:11:57,040 --> 00:12:02,790 sa ka panna prototüüpe ei ülaosas et faili, kuid ülaosas header fail. 203 00:12:02,790 --> 00:12:07,170 Siis, et päisefail on see, mida sõbrad ja kolleegid hulka 204 00:12:07,170 --> 00:12:09,760 koos # include oma kood. 205 00:12:09,760 --> 00:12:12,210 Nii et kogu see aeg, sa oled ka kõik need prototüübid, 206 00:12:12,210 --> 00:12:16,580 tõhusalt ülaosas oma faili, kuid teel selle # include mehhanism, 207 00:12:16,580 --> 00:12:20,070 mis sisuliselt koopiad ja pastad see fail oma. 208 00:12:20,070 --> 00:12:23,070 Siin on mõned üsna üksikasjalikud dokumendid. 209 00:12:23,070 --> 00:12:25,640 Me oleme päris palju enesestmõistetavaks, et GetInt saab int, 210 00:12:25,640 --> 00:12:27,640 aga tuleb välja, seal on mõnes nurgas juhtudel. 211 00:12:27,640 --> 00:12:31,810 Mis siis, kui kasutaja liigid number, mis on liiga suur, kvintiljon, 212 00:12:31,810 --> 00:12:35,490 et lihtsalt ei mahu sees int? Milline on oodatav käitumine? 213 00:12:35,490 --> 00:12:38,020 Ideaalis on see prognoositav. 214 00:12:38,020 --> 00:12:40,280 Nii et sel juhul, kui te tegelikult lugeda trahvi print, 215 00:12:40,280 --> 00:12:44,500 teil tegelikult näha, et kui liin ei saa lugeda, see naaseb INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Me pole kunagi sellest rääkinud, kuid põhineb kapitaliseerimine, mis see on ilmselt? 217 00:12:48,320 --> 00:12:50,640 [Üliõpilane] konstant. >> See on pidev. 218 00:12:50,640 --> 00:12:54,770 See on mingi eriline konstant, mis on ilmselt tunnistada ühes neist päisefaile 219 00:12:54,770 --> 00:13:00,090 et teoksil suurem fail ja INT_MAX on ilmselt midagi umbes 2 miljardit 220 00:13:00,090 --> 00:13:04,990 asja mõte on selles, et kuna me peame kuidagi tähendada, et midagi läks valesti, 221 00:13:04,990 --> 00:13:10,700 me, jah, on 4000000000 numbrid meie käsutuses: -2 miljardit kuni 2 miljardit anda või võtta. 222 00:13:10,700 --> 00:13:14,710 Noh, mis on levinud programmeerimine sa varastada vaid üks neid numbreid, 223 00:13:14,710 --> 00:13:18,920 võibolla 0, ehk 2 miljardit ehk -2000000000, 224 00:13:18,920 --> 00:13:23,280 nii et sa kulutad ühe oma võimalikest väärtustest, nii et saate pühenduda maailma 225 00:13:23,280 --> 00:13:26,820 et kui midagi läheb valesti, ma tulen tagasi selle super suur väärtus. 226 00:13:26,820 --> 00:13:31,030 Aga sa ei taha kasutaja kirjutades midagi segasena nagu 234 ..., tõesti suur number. 227 00:13:31,030 --> 00:13:34,060 Sa üldistada seda hoopis kui konstant. 228 00:13:34,060 --> 00:13:38,060 Nii et tõesti, kui sa olid anal viimastel nädalatel, iga kord, kui nimetatakse GetInt, 229 00:13:38,060 --> 00:13:42,900 sa oleks pidanud kontrollides, kui tingimus ei kasutaja kirjuta INT_MAX, 230 00:13:42,900 --> 00:13:46,590 või täpsemalt, tegid GetInt tagasi INT_MAX, sest kui ta seda tegi, 231 00:13:46,590 --> 00:13:51,830 et tegelikult tähendab, et nad ei kirjuta seda. Midagi läks valesti antud juhul. 232 00:13:51,830 --> 00:13:56,080 Nii et see on see, mis üldiselt tuntud kui sentinell väärtus, mis tähendab lihtsalt eriline. 233 00:13:56,080 --> 00:13:58,120 >> Lähme nüüd saab. C faili. 234 00:13:58,120 --> 00:14:01,340 C fail on olemas seadet mõnda aega. 235 00:14:01,340 --> 00:14:06,840 Ja tegelikult on seadmel see eelnevalt koostatud teid, et asi nimega objekti kood, 236 00:14:06,840 --> 00:14:09,540 aga see lihtsalt ei loe teile kus see on, sest süsteem teab 237 00:14:09,540 --> 00:14:11,730 sel juhul, kui see on: seade. 238 00:14:11,730 --> 00:14:17,400 Olgem kerige nüüd GetInt ja näha, kuidas GetInt on töötanud kogu selle aja. 239 00:14:17,400 --> 00:14:19,460 Siin on meil sarnane kommentaarid enne. 240 00:14:19,460 --> 00:14:21,660 Lubage mul suumida lihtsalt koodi osa. 241 00:14:21,660 --> 00:14:23,900 Ja mis meil on GetInt on järgmine. 242 00:14:23,900 --> 00:14:25,700 See ei võta sisend. 243 00:14:25,700 --> 00:14:29,510 Ta naaseb int, while (true), nii et meil on tahtlik lõputu silmuse, 244 00:14:29,510 --> 00:14:33,180 kuid arvatavasti me murda läbi selle kuidagi või naasta seest seda. 245 00:14:33,180 --> 00:14:34,870 >> Vaatame, kuidas see toimib. 246 00:14:34,870 --> 00:14:39,240 Me näivad kasutavat getString selles esimeses reas sees silmus, 166. 247 00:14:39,240 --> 00:14:43,780 See on nüüd hea tava sest millistel tingimustel võiks getString tagasi 248 00:14:43,780 --> 00:14:47,660 eriline märksõna NULL? >> [Üliõpilane] Kui midagi läheb valesti. 249 00:14:47,660 --> 00:14:51,630 Kui midagi läheb valesti. Ja mis võiks valesti minna, kui helistate midagi getString? 250 00:14:54,960 --> 00:14:57,640 Jah. >> [Üliõpilane] malloc ei anna see ints. 251 00:14:57,640 --> 00:14:59,150 Jah. Ehk malloc ebaõnnestub. 252 00:14:59,150 --> 00:15:03,190 Kuskil all kapuuts, getString helistatakse malloc, mis eraldab mälu, 253 00:15:03,190 --> 00:15:06,020 mis võimaldab arvutisse salvestada kõik märgid 254 00:15:06,020 --> 00:15:07,750 et kasutaja sisestada klaviatuurilt. 255 00:15:07,750 --> 00:15:11,590 Ja oletame kasutaja oli palju vaba aega ja trükitud rohkem, näiteks 256 00:15:11,590 --> 00:15:16,160 kui 2 miljardit märki, rohkem märke kui arvuti on isegi RAM. 257 00:15:16,160 --> 00:15:19,250 GetString peab suutma tähenda, et teile. 258 00:15:19,250 --> 00:15:22,560 Isegi kui see on super, super aeg-ajalt nurga puhul, 259 00:15:22,560 --> 00:15:24,340 see peab kuidagi suutma hallata seda, 260 00:15:24,340 --> 00:15:28,750 ja nii getString, kui me läksime tagasi ja loe selle dokumentatsiooni, tõepoolest tagasi NULL. 261 00:15:28,750 --> 00:15:34,460 Nii et nüüd, kui getString ei tagastades NULL, GetInt läheb pankrotti minna tagastades INT_MAX 262 00:15:34,460 --> 00:15:37,690 nagu sentinel. Need on vaid inimese konventsioonidega. 263 00:15:37,690 --> 00:15:41,450 Ainus viis sa teaksid, see on nii on lugedes dokumentatsiooni. 264 00:15:41,450 --> 00:15:45,040 >> Olgem kerige kus int on tegelikult saanud. 265 00:15:45,040 --> 00:15:51,160 Kui ma keri natuke edasi, lähtudes 170, meil on Kommentaari eespool nimetatud liinidel. 266 00:15:51,160 --> 00:15:55,100 Me kuulutame 172 int n, ja char, c, ja siis see uus funktsioon, 267 00:15:55,100 --> 00:15:58,930 mis mõned teist on komistas kogu enne, sscanf. 268 00:15:58,930 --> 00:16:00,870 See tähistab stringi scanf. 269 00:16:00,870 --> 00:16:05,700 Teisisõnu, mulle nööri ja ma skaneerida seda tükki huvipakkuvat informatsiooni. 270 00:16:05,700 --> 00:16:07,360 Mida see tähendab? 271 00:16:07,360 --> 00:16:11,800 Oletame, et ma kirjutada, sõna otseses mõttes, 123 on klaviatuuri ja vajuta Enter. 272 00:16:11,800 --> 00:16:16,470 Mis on andmetüüp 123 kui tagastatud getString? >> [Üliõpilane] String. 273 00:16:16,470 --> 00:16:18,380 See on ilmselt string, eks? Mul on string. 274 00:16:18,380 --> 00:16:23,220 Nii et 123 on tõesti, tsiteerin-Tsitaat lõppeb, 123 \ 0 lõpus ta. 275 00:16:23,220 --> 00:16:27,110 See ei ole int. See pole number. Tundub arv, kuid see ei ole tegelikult. 276 00:16:27,110 --> 00:16:29,080 Mis siis GetInt pead tegema? 277 00:16:29,080 --> 00:16:35,750 See on skaneerida et string vasakult paremale - 123 \ 0 - ja kuidagi teisendada tegeliku täisarv. 278 00:16:35,750 --> 00:16:37,850 Sa võiksid aru saada, kuidas seda teha. 279 00:16:37,850 --> 00:16:41,450 Kui te arvate tagasi pset2, siis ilmselt sai natuke rahul Caesar 280 00:16:41,450 --> 00:16:44,820 või Vigenere, et saaksite kinnitada, üle string, saate teisendada jutumärke ints. 281 00:16:44,820 --> 00:16:46,710 Aga kurat, see on palju tööd. 282 00:16:46,710 --> 00:16:49,860 Miks mitte helistada funktsioon nagu sscanf et kas see sinu jaoks? 283 00:16:49,860 --> 00:16:54,230 Nii sscanf loodab argument - sel juhul nimetatakse joont, mis on string. 284 00:16:54,230 --> 00:17:01,840 Seejärel tuleb määrata jutumärkides, väga sarnane printf, mida te ootate, et näha selles stringis. 285 00:17:01,840 --> 00:17:09,000 Ja mida ma räägin siin on mul oodata kümnendmurruna ja võibolla iseloomu. 286 00:17:09,000 --> 00:17:12,000 Ja me näeme, miks see nii on vaid hetk. 287 00:17:12,000 --> 00:17:15,869 Ja selgub, et see märge on nüüd meenutab kraami hakkasime rääkima 288 00:17:15,869 --> 00:17:17,619 veidi üle nädala tagasi. 289 00:17:17,619 --> 00:17:21,740 Mis on & n ja & c teed meile siin? >> [Üliõpilane] aadress n ja aadress c. 290 00:17:21,740 --> 00:17:25,400 Jah. See annab mulle aadressi n ja aadress c. Miks see nii tähtis on? 291 00:17:25,400 --> 00:17:30,220 Sa tead, et koos funktsioonide C, saate alati naasta väärtus või puudub igasugune väärtus. 292 00:17:30,220 --> 00:17:34,530 Te saate tagastada int, string, float, char, mis iganes, või võite pöörduda tühine, 293 00:17:34,530 --> 00:17:38,030 kuid võite ainult tagastama ühe asja maksimaalselt. 294 00:17:38,030 --> 00:17:42,760 Aga siin me tahame sscanf naasta mind äkki int, kümnendmurruna 295 00:17:42,760 --> 00:17:46,220 ja ka char, ja ma seletan, miks char hetkel. 296 00:17:46,220 --> 00:17:51,460 Sa tegelikult tahad sscanf tagasi kaks asja, kuid see lihtsalt ei ole võimalik C. 297 00:17:51,460 --> 00:17:55,200 Võite töötada ümber, et sooritades kaks aadressid 298 00:17:55,200 --> 00:17:57,370 sest niipea kui sa ulataksid funktsiooni kaks aadressi, 299 00:17:57,370 --> 00:18:00,470 Mis saab selle funktsiooni nendega teha? >> [Üliõpilane] Kirjutage need aadressid. 300 00:18:00,470 --> 00:18:02,010 Sellega on võimalik kirjutada neile aadressidele. 301 00:18:02,010 --> 00:18:05,770 Võite kasutada täht toimimise ja sinna minna, et kõik need aadressid. 302 00:18:05,770 --> 00:18:11,260 See on omamoodi see tagaukse mehhanism, kuid väga levinud muutmise väärtused muutujatele 303 00:18:11,260 --> 00:18:14,870 enamat kui lihtsalt üks koht - antud juhul kaks. 304 00:18:14,870 --> 00:18:21,340 Nüüd pane tähele, ma kontrollimine == 1 ja siis jälle n kui see tegelikult hinnata tõeseks. 305 00:18:21,340 --> 00:18:26,170 Mis siis toimub? Tehniliselt kõik tahame juhtuda GetInt on see. 306 00:18:26,170 --> 00:18:30,740 Me tahame analüüsida, nii et rääkida, me tahame lugeda string - quote-Tsitaat lõppeb 123 - 307 00:18:30,740 --> 00:18:34,560 ja kui tundub, et seal on mitmeid seal, mida me ütlen sscanf teha 308 00:18:34,560 --> 00:18:38,190 pannakse see arv - 123 - See muutuja n minu jaoks. 309 00:18:38,190 --> 00:18:42,090 Nii et miks siis ma tegelikult ka seda? 310 00:18:42,090 --> 00:18:48,220 Mis roll on sscanf öeldes võite saada ka märk siin? 311 00:18:48,220 --> 00:18:53,470 [Kuuldamatu õpilase vastus] >> koma tegelikult võiks toimida. 312 00:18:53,470 --> 00:18:56,330 Olgem hoidke, et mõtles hetke. Mis veel? 313 00:18:56,330 --> 00:18:59,270 [Üliõpilane] See võib olla NULL. >> Hea mõte. See võib olla null iseloomu. 314 00:18:59,270 --> 00:19:01,660 See on tegelikult mitte sel juhul. Jah. >> [Üliõpilane] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Või las ma üldistada veelgi. 316 00:19:04,340 --> 00:19:06,640 % C on lihtsalt veatuvastuse. 317 00:19:06,640 --> 00:19:09,300 Me ei taha seal olla märk pärast arvu, 318 00:19:09,300 --> 00:19:11,870 aga mida see võimaldab mul teha on järgmine. 319 00:19:11,870 --> 00:19:18,210 Selgub, et sscanf lisaks ladustamiseks väärtused n ja c selles näites siin, 320 00:19:18,210 --> 00:19:24,890 Mis see ka ei ole siis tagastab arvu muutujate ta pani väärtused sisse 321 00:19:24,890 --> 00:19:30,260 Nii et kui te ainult kirjutada 123, siis ainult% d saab sobitada, 322 00:19:30,260 --> 00:19:33,880 ja ainult n saab ladustada, mille väärtus on nagu 123, 323 00:19:33,880 --> 00:19:35,640 ja miski ei saa panna c. 324 00:19:35,640 --> 00:19:37,620 C jääb prügi väärtus, kui nii võib öelda - 325 00:19:37,620 --> 00:19:40,730 prügi, sest see on kunagi olnud vormindatud mõne väärtuse. 326 00:19:40,730 --> 00:19:45,520 Nii et sel juhul, sscanf tagastab 1 sest ma asustatud 1, mis suunanäitajaks, 327 00:19:45,520 --> 00:19:50,190 sel juhul tore, mul on int nii et ma vaba rida vabastada mälu 328 00:19:50,190 --> 00:19:54,000 et getString tegelikult eraldatud, ja siis ma tagasi n 329 00:19:54,000 --> 00:19:58,500 muidu kui te kunagi mõelnud, kui et Uuesti avaldus pärineb, see pärineb just siin. 330 00:19:58,500 --> 00:20:04,390 Nii et kui vastupidi, ma kirjuta 123foo - lihtsalt mõne juhusliku jada teksti - 331 00:20:04,390 --> 00:20:08,490 sscanf on näeme number, number, number, f, 332 00:20:08,490 --> 00:20:16,410 ja see läheb üles 123 N; siis läheb panna f-c ja siis tagasi 2. 333 00:20:16,410 --> 00:20:20,640 Nii et meil on, lihtsalt kasutades põhimõiste sscanf käitumist, väga lihtsal viisil - 334 00:20:20,640 --> 00:20:23,900 noh, keeruline esmapilgul kuid lõpus päeval üsna lihtne mehhanism - 335 00:20:23,900 --> 00:20:28,320 öelda, kas on int ja kui on, siis on see ainus asi, mis ma leidsin? 336 00:20:28,320 --> 00:20:29,860 Ja tühik siin on tahtlik. 337 00:20:29,860 --> 00:20:34,000 Kui sa loed dokumentatsiooni sscanf, see ütleb teile, et kui te sisaldama tükk tühik 338 00:20:34,000 --> 00:20:38,810 alguses või lõpus, sscanf liiga võimaldab kasutajal ükskõik millisel põhjusel, 339 00:20:38,810 --> 00:20:41,860 lüüa tühikut 123 ja mis on õigustatud. 340 00:20:41,860 --> 00:20:44,150 Sa ei kisa kasutaja lihtsalt sellepärast, et nad tabanud tühiku 341 00:20:44,150 --> 00:20:48,640 alguses või lõpus, mis on natuke rohkem kasutajasõbralikumaks. 342 00:20:48,640 --> 00:20:52,300 >> Kõik küsimused siis GetInt? Jah. >> [Üliõpilane] Mida teha, kui sa lihtsalt panna char? 343 00:20:52,300 --> 00:20:54,030 Hea küsimus. 344 00:20:54,030 --> 00:20:59,890 Mis siis, kui sa lihtsalt kirjutada char nagu f ja vajuta Enter pole kunagi masinakirja 123? 345 00:20:59,890 --> 00:21:02,420 Mis sa arvad käitumist rida koodi oleks siis? 346 00:21:02,420 --> 00:21:04,730 [Kuuldamatu õpilase vastus] 347 00:21:04,730 --> 00:21:08,790 Jah, nii sscanf võib katta et liiga, sest sel juhul ta ei kavatse täita n või c. 348 00:21:08,790 --> 00:21:15,310 See läheb selle asemel tagastab 0, millisel juhul ma ka püüdmine et stsenaarium 349 00:21:15,310 --> 00:21:18,750 sest eeldatav maksumus tahan on 1. 350 00:21:18,750 --> 00:21:22,000 Ma tahan ainult üks ja ainult üks asi, mida tuleb täita. Hea küsimus. 351 00:21:22,000 --> 00:21:24,290 >> Teised? Hea küll. 352 00:21:24,290 --> 00:21:26,250 >> Ärme minna läbi kõik funktsioonid siin, 353 00:21:26,250 --> 00:21:29,500 kuid üks, mis tundub olevat ehk järelejäänud huvi on getString 354 00:21:29,500 --> 00:21:32,790 sest selgub, et GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 kõik punt palju nende funktsionaalsus getString. 356 00:21:36,260 --> 00:21:39,750 Võtame vaadata, kuidas ta on rakendanud siin. 357 00:21:39,750 --> 00:21:43,630 See üks tundub veidi keeruline, kuid see kasutab sama põhialuste 358 00:21:43,630 --> 00:21:45,670 et me hakkasime rääkima eelmisel nädalal. 359 00:21:45,670 --> 00:21:49,490 Aastal getString, mis ei võta argumenti ühe tühine siin 360 00:21:49,490 --> 00:21:53,730 ja see tagastab stringi, ma ilmselt olen kuulutatakse string nimega puhver. 361 00:21:53,730 --> 00:21:56,270 Ma tõesti ei tea, mis see olema saab kasutada veel, aga eks näis. 362 00:21:56,270 --> 00:21:58,390 Tundub võimsus on vaikimisi 0. 363 00:21:58,390 --> 00:22:01,350 Mitte päris kindel, kuhu see viib, ei tea, mida n läheb kasutatakse veel, 364 00:22:01,350 --> 00:22:03,590 kuid nüüd see muutub veidi põnevamaks. 365 00:22:03,590 --> 00:22:06,520 Kooskõlas 243, me kuulutame int, c. 366 00:22:06,520 --> 00:22:08,800 See on omamoodi loll detail. 367 00:22:08,800 --> 00:22:15,820 Char on 8 bitti, ja 8 bitti saab salvestada mitu erinevat väärtust? >> [Üliõpilane] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Probleem on selles, kui sa tahad olla 256 erinevat ASCII sümboleid, mis on 369 00:22:20,730 --> 00:22:23,340 kui te arvate, tagasi - ja see ei ole midagi meelde jätta. 370 00:22:23,340 --> 00:22:25,710 Aga kui te arvate tagasi, et suur ASCII diagramm meil oli nädal tagasi 371 00:22:25,710 --> 00:22:30,600 oli sel juhul 128 või 256 ASCII tähemärki. 372 00:22:30,600 --> 00:22:32,940 Me kasutasime kõiki mudeleid 0. ja 1s üles. 373 00:22:32,940 --> 00:22:36,210 See on probleem, kui soovite, et oleks võimalik leida vigu 374 00:22:36,210 --> 00:22:40,190 sest kui sa oled juba kasutatakse 256 väärtused oma märki, 375 00:22:40,190 --> 00:22:43,050 sa ei ole tegelikult ette planeerida, sest nüüd on kuidagi võimalik öelda, 376 00:22:43,050 --> 00:22:46,270 see ei ole legit iseloomu, see on mingi vale sõnumi. 377 00:22:46,270 --> 00:22:50,270 Mida maailm ei ole nad kasutavad järgmine suurem väärtus, midagi int, 378 00:22:50,270 --> 00:22:54,720 nii et teil on hull bittide arv, 32, 4000000000 võimalike väärtuste 379 00:22:54,720 --> 00:22:58,860 nii et saate lihtsalt lõpuks kasutavad peamiselt 257 neist, 380 00:22:58,860 --> 00:23:01,720 1, mis on mingil erilisel tähendus viga. 381 00:23:01,720 --> 00:23:03,120 >> Nii et vaatame, kuidas see töötab. 382 00:23:03,120 --> 00:23:07,760 Kooskõlas 246, Mul on selline suur samas silmus, helistatakse fgetc, 383 00:23:07,760 --> 00:23:11,090 f tähenduses faili, nii getc ja seejärel stdin. 384 00:23:11,090 --> 00:23:15,520 Selgub, et see on lihtsalt täpsem viis öelda lugeda sisend klaviatuuri. 385 00:23:15,520 --> 00:23:19,300 Standard sisend tähendab klaviatuur, standardväljundisse tähendab ekraani, 386 00:23:19,300 --> 00:23:23,310 ja standardviga, mis me näeme pset4, tähendab ekraani 387 00:23:23,310 --> 00:23:27,490 kuid eriline osa ekraanil, nii et see ei conflated koos tegeliku võimsuse 388 00:23:27,490 --> 00:23:30,750 mida te soovisite printida. Aga rohkem sellest ka tulevikus. 389 00:23:30,750 --> 00:23:34,440 Nii fgetc tähendab lihtsalt lugeda üks sümbolitest klaviatuur ja hoidke seda kus? 390 00:23:34,440 --> 00:23:37,350 Hoidke seda c. 391 00:23:37,350 --> 00:23:41,360 Ja siis vaadata - nii et ma olen lihtsalt kasutades mõned Boole'i ​​sidesõnad siin - 392 00:23:41,360 --> 00:23:46,000 kontrollige, et see ei ole võrdne - \ n, nii et kasutaja ei vajuta Enter tahame peatus sel hetkel, 393 00:23:46,000 --> 00:23:49,850 End of the Loop - ja me tahame ka, et kontrollida spetsiaalse pidev EOF, 394 00:23:49,850 --> 00:23:53,610 mis siis, kui sa tead või arvata, mida see seisma? >> [Üliõpilane] faili lõppu. >> Faili lõppu. 395 00:23:53,610 --> 00:23:56,560 See on selline mõttetu, sest kui ma olen masinakirja kell klaviatuur, 396 00:23:56,560 --> 00:23:58,870 seal on tõesti mingit faili kaasatud, 397 00:23:58,870 --> 00:24:01,150 aga see on lihtsalt omamoodi üldine termin, mis tähendab 398 00:24:01,150 --> 00:24:04,220 et midagi muud on pärit inimese sõrmed. 399 00:24:04,220 --> 00:24:06,460 EOF - faili lõppu. 400 00:24:06,460 --> 00:24:09,920 Nagu kõrvale, kui sa oled kunagi tabanud kontroll D klaviatuuril, mitte et teil oleks veel - 401 00:24:09,920 --> 00:24:15,230 olete tabanud kontroll C - Control D saadab selle erilise pidev nimetatakse EOF. 402 00:24:15,230 --> 00:24:19,850 Nüüd me lihtsalt mõned dünaamiline mälu eraldamisel. 403 00:24:19,850 --> 00:24:23,440 >> Nii et kui (n + 1> mahutavus). Nüüd ma seletan n. 404 00:24:23,440 --> 00:24:26,100 N on lihtsalt mitu baiti on praegu puhver, 405 00:24:26,100 --> 00:24:28,620 string, mis sa praegu ülesehitamisel kasutaja. 406 00:24:28,620 --> 00:24:33,450 Kui teil on rohkem sümboleid oma puhver kui teil on võime puhver, 407 00:24:33,450 --> 00:24:37,410 intuitiivselt, mida me peame tegema, siis on eraldada rohkem võimsust. 408 00:24:37,410 --> 00:24:43,330 Nii et ma lähen koorima üle mõned aritmeetika siin ja keskenduda ainult see funktsioon siin. 409 00:24:43,330 --> 00:24:46,070 Tead mis malloc on või on vähemalt üldiselt tuttav. 410 00:24:46,070 --> 00:24:48,970 Take A Guess mida RealLOC teeb. >> [Üliõpilane] Lisab mälu. 411 00:24:48,970 --> 00:24:52,920 See ei ole päris mälu lisamiseks. See reallocates mälu järgmiselt. 412 00:24:52,920 --> 00:24:57,220 Kui seal on veel ruumi lõpus stringi teile rohkem, et mälu 413 00:24:57,220 --> 00:25:00,000 kui see algselt annab, siis saad selle lisamälu. 414 00:25:00,000 --> 00:25:03,460 Nii saate lihtsalt hoida pannes string tegelased seljad et seljad. 415 00:25:03,460 --> 00:25:05,830 Aga kui see pole nii, sest sa ootasid liiga kaua 416 00:25:05,830 --> 00:25:07,940 ja midagi juhuslikult sain plopped mälu seal 417 00:25:07,940 --> 00:25:10,290 kuid seal on ekstra mälu siin all, pole hullu. 418 00:25:10,290 --> 00:25:13,100 RealLOC kavatseb teha kõik raske töö teile, 419 00:25:13,100 --> 00:25:16,750 liikuda string olete lugenud seni siit, pane see sinna alla, 420 00:25:16,750 --> 00:25:19,460 ja siis annan teile mõned rohkem raja selles punktis. 421 00:25:19,460 --> 00:25:22,550 >> Nii laine poolt, lubage mul öelda, et getString teeb 422 00:25:22,550 --> 00:25:26,330 on see algab väikese puhvri, võibolla üks märk, 423 00:25:26,330 --> 00:25:30,820 ja kui kasutaja liigid kaks märki, getString jõuab helistaja RealLOC ja ütleb 424 00:25:30,820 --> 00:25:33,150 üks märk sellest ei piisa; anna mulle kaks märki. 425 00:25:33,150 --> 00:25:35,950 Siis kui sa loed läbi loogika ahel, see saab öelda 426 00:25:35,950 --> 00:25:39,600 kasutaja trükkida 3 tähemärki, anna mulle nüüd mitte 2 vaid 4 tähemärki, 427 00:25:39,600 --> 00:25:42,320 siis anna mulle 8, siis anna mulle 16 ja 32. 428 00:25:42,320 --> 00:25:45,000 Asjaolu, et ma olen kahekordistada võimsust iga kord 429 00:25:45,000 --> 00:25:48,570 tähendab, et puhver ei kavatse kasvavad aeglaselt, see läheb kasvama super kiire. 430 00:25:48,570 --> 00:25:51,380 Ja mis võiks olla eeliseks, et? 431 00:25:51,380 --> 00:25:54,600 Miks ma kahekordistades puhver 432 00:25:54,600 --> 00:25:58,020 kuigi kasutaja võib lihtsalt vaja üks pildi tegelasele klaviatuuri? 433 00:25:58,020 --> 00:26:01,750 [Kuuldamatu õpilase vastus] >> Mis see on? >> [Üliõpilane] Sa ei pea kasvada nii tihti. 434 00:26:01,750 --> 00:26:03,300 Täpselt. Sa ei pea kasvada nii tihti. 435 00:26:03,300 --> 00:26:05,510 Ja see on lihtsalt selline oled maandamiseks oma ennustused siia, 436 00:26:05,510 --> 00:26:10,850 asja mõte on selles, et sa ei taha helistada RealLOC palju, sest see kipub olema aeglane. 437 00:26:10,850 --> 00:26:12,910 Iga kord, kui küsida operatsioonisüsteemi mälu, 438 00:26:12,910 --> 00:26:16,990 nagu te varsti näha ka tulevikus lahendamist, see kipub aega võtta. 439 00:26:16,990 --> 00:26:20,010 Nii, et vähendada seda aega, isegi kui sa raiskad ruumi, 440 00:26:20,010 --> 00:26:21,900 kipub olema hea. 441 00:26:21,900 --> 00:26:24,060 >> Aga kui me loeme läbi viimase osa getString siin - 442 00:26:24,060 --> 00:26:27,950 ja jälle mõista iga ühele reale ei ole siin nii oluline täna - 443 00:26:27,950 --> 00:26:30,530 märgata, et see lõpuks kutsub malloc uuesti 444 00:26:30,530 --> 00:26:33,880 ja siis jaotab täpselt nii palju baite kui ta vajab string 445 00:26:33,880 --> 00:26:38,060 ja siis viskab ära, helistades tasuta liiga suur puhver 446 00:26:38,060 --> 00:26:40,080 kui ta tõepoolest ei saanud kahekordistunud liiga palju kordi. 447 00:26:40,080 --> 00:26:42,730 Nii lühike, et kuidas getString on töötanud kogu selle aja. 448 00:26:42,730 --> 00:26:47,060 Kõik see loeb ühe märgi korraga uuesti ja uuesti ja uuesti, 449 00:26:47,060 --> 00:26:50,750 ja iga kord, kui ta vajab täiendavat mälu, siis küsib operatsioonisüsteemi see 450 00:26:50,750 --> 00:26:53,670 helistades RealLOC. 451 00:26:53,670 --> 00:26:57,890 >> Kas on küsimusi? Hea küll. 452 00:26:57,890 --> 00:26:59,270 >> Rünnak. 453 00:26:59,270 --> 00:27:04,060 Nüüd, kui me mõistame vihjeid või vähemalt on üha tuttav suunanäitajaks, 454 00:27:04,060 --> 00:27:06,700 Vaatleme, kuidas kogu maailm hakkab kokku varisema 455 00:27:06,700 --> 00:27:10,030 kui sa ei ole päris kaitsta vastu võistleva kasutajad, 456 00:27:10,030 --> 00:27:11,850 inimesed, kes üritavad häkkida oma süsteemi, 457 00:27:11,850 --> 00:27:16,890 inimesed, kes üritavad varastada oma tarkvara kõrvale mõned registreerimiskood 458 00:27:16,890 --> 00:27:19,090 et nad muidu tüübi sisse 459 00:27:19,090 --> 00:27:22,990 >> Heitke pilk see näiteks siin, mis on vaid C kood, mis on funktsiooni main allosas 460 00:27:22,990 --> 00:27:26,380 mis nõuab funktsiooni suva. Ja mis on see möödaminnes suva? 461 00:27:26,380 --> 00:27:29,680 [Üliõpilane] üks argument. >> [Malan] üks argument. 462 00:27:29,680 --> 00:27:33,450 Nii argv [1], mis tähendab, et esimene sõna, et kasutaja sisestatud käsurida 463 00:27:33,450 --> 00:27:36,360 pärast a.out või mis iganes programm on kutsutud. 464 00:27:36,360 --> 00:27:41,680 Nii et suva ülaosas võtab sisse char *. Aga char * on just see, mida? >> [Üliõpilane] jada. 465 00:27:41,680 --> 00:27:43,350 [Malan] string, mistõttu ei ole midagi uut siin. 466 00:27:43,350 --> 00:27:45,420 See string omavoliliselt kutsutakse baar. 467 00:27:45,420 --> 00:27:51,430 Seda joont siin, char c [12]; on omamoodi pooleldi tehniline inglise keel, mida see joon teed? 468 00:27:51,430 --> 00:27:55,220 [Üliõpilane] massiivi - >> Array? >> [Üliõpilane] Lõbu. >> Lõbu. 469 00:27:55,220 --> 00:27:58,870 Anna mulle massiivi 12 tähemärki. Nii et me võiksime nimetada seda puhvrit. 470 00:27:58,870 --> 00:28:02,920 See on tehniliselt nimetatakse C, kuid puhver programmeerimine tähendab lihtsalt hunnik ruumi 471 00:28:02,920 --> 00:28:04,800 et võite panna mõned asjad sisse 472 00:28:04,800 --> 00:28:07,940 Siis lõpuks memcpy me pole varem kasutatud, kuid saate ilmselt arvata, mida ta teeb. 473 00:28:07,940 --> 00:28:10,480 See kopeerib mälu. Mida see teeb? 474 00:28:10,480 --> 00:28:19,270 See ilmselt kopeerib baar, oma panuse, arvesse C, kuid ainult kuni pikkus baar. 475 00:28:19,270 --> 00:28:24,930 Aga seal on viga siin. >> [Üliõpilane] Sa pead sizeof iseloomu. >> Okei. 476 00:28:24,930 --> 00:28:30,860 Tehniliselt me ​​peaksime tõesti strlen (baar) * sizeof (char)). See on õige. 477 00:28:30,860 --> 00:28:33,930 Aga halvemal juhul siin Oletame, et see on - 478 00:28:33,930 --> 00:28:35,950 Okei. Siis on kaks vead. 479 00:28:35,950 --> 00:28:39,160 Nii sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Teeme seda veidi laiem. 481 00:28:41,290 --> 00:28:44,910 Nüüd on veel bug, mis on mis? >> [Kuuldamatu õpilase vastus] 482 00:28:44,910 --> 00:28:46,990 Saate mida? >> [Üliõpilane] Check for null. 483 00:28:46,990 --> 00:28:50,270 Meil tuleb üldjuhul kontrollimine NULL sest halvad asjad juhtuvad 484 00:28:50,270 --> 00:28:53,200 kui kursor on NULL, sest võite lõpuks läheb seal, 485 00:28:53,200 --> 00:28:57,630 ning te ei tohiks kunagi läheb NULL poolt viite mahavõtmine see täht operaator. 486 00:28:57,630 --> 00:29:01,050 Nii et see on hea. Ja mida muud me teeme? Loogiliselt seal on viga ka siin. 487 00:29:01,050 --> 00:29:04,450 [Üliõpilane] Kontrollige, kas argc on> = 2. 488 00:29:04,450 --> 00:29:10,550 Nii et kas argc on> = 2. Okei, nii et seal on kolm vead selles programmis siin. 489 00:29:10,550 --> 00:29:16,630 Jälgime nüüd kontrollida, kui kasutaja tegelikult sisestatud midagi sisse argv [1]. Hea. 490 00:29:16,630 --> 00:29:20,950 Mis siis kolmandal viga? Jah. >> [Üliõpilane] C ei pruugi olla piisavalt suur. 491 00:29:20,950 --> 00:29:23,320 Hea. Me kontrollisime üks stsenaarium. 492 00:29:23,320 --> 00:29:29,520 Me kaudselt kontrollida ei kopeeri rohkem mälu kui ületaks pikkus baar. 493 00:29:29,520 --> 00:29:32,510 Nii et kui string kasutaja sisestatud on 10 tähemärki pikk, 494 00:29:32,510 --> 00:29:36,020 see ütleb ainult kopeerida 10 tähemärki. Ja see on okei. 495 00:29:36,020 --> 00:29:39,940 Aga kui kasutaja sisestatud sõna käsureale nagu 20-kohaline sõna? 496 00:29:39,940 --> 00:29:44,900 See ütleb koopia 20 tähemärki alates baar, milliseid? 497 00:29:44,900 --> 00:29:49,750 C, muidu tuntud meie puhver, mis tähendab, et sa lihtsalt kirjutasid andmed 498 00:29:49,750 --> 00:29:52,540 8 baidi asukohad, mida ei oma, 499 00:29:52,540 --> 00:29:54,870 ja sul ei ole neid selles mõttes, et sa kunagi eraldatud neile. 500 00:29:54,870 --> 00:30:00,370 Nii et see on see, mis üldiselt tuntud kui buffer overflow rünnak või puhvri ületäitumise rünnak. 501 00:30:00,370 --> 00:30:05,580 Ja see on rünnaku selles mõttes, et kui kasutaja või programm, mis helistab oma funktsiooni 502 00:30:05,580 --> 00:30:10,490 teeb seda pahatahtlikult, mis tegelikult juhtub järgmisena võiks tegelikult olla üsna halb. 503 00:30:10,490 --> 00:30:12,450 >> Võtame pilk see pilt siin. 504 00:30:12,450 --> 00:30:16,060 See pilt kujutab oma korstnat mälu. 505 00:30:16,060 --> 00:30:19,580 Tuletame meelde, et iga kord, kui helistate funktsiooni saad seda väikest raami pinu 506 00:30:19,580 --> 00:30:21,520 ja siis teine ​​ja siis veel ja veel. 507 00:30:21,520 --> 00:30:24,300 Ja seni on meil just selline ammutatud need nagu ristkülikud 508 00:30:24,300 --> 00:30:26,290 kas laual või ekraanil siin. 509 00:30:26,290 --> 00:30:30,580 Aga kui me suumida üks neist ristkülikut, kui te helistate funktsiooni suva, 510 00:30:30,580 --> 00:30:35,880 selgub, et seal on rohkem korstna sees, et raami, et ristküliku 511 00:30:35,880 --> 00:30:40,060 kui lihtsalt x ja y ja a ja b, nagu me ei räägi swap. 512 00:30:40,060 --> 00:30:44,410 Tuleb välja, et seal on mõned madalama taseme üksikasju, nende seas saatja aadress. 513 00:30:44,410 --> 00:30:49,550 Nii selgub, kui peamine nõuab suva, peamine on, et teavitada foo 514 00:30:49,550 --> 00:30:53,520 Mis peamine aadress on arvuti mälu 515 00:30:53,520 --> 00:30:57,770 sest teisiti, niipea kui suva tehakse täidesaatva, nagu käesolevas asjas, 516 00:30:57,770 --> 00:31:00,830 kui jõuad selle suletud lokkis traksidega lõpus suva, 517 00:31:00,830 --> 00:31:05,310 kuidas kuradit see foo tea, kus kontroll programmi peaks minema? 518 00:31:05,310 --> 00:31:08,970 Tuleb välja, et vastus sellele küsimusele on see punane ristkülik siin. 519 00:31:08,970 --> 00:31:12,670 See on kursor, ja see on kuni arvuti salvestada ajutiselt 520 00:31:12,670 --> 00:31:17,030 aasta nn korstna aadress peamiselt selleks, et niipea kui suva tehakse täidesaatva, 521 00:31:17,030 --> 00:31:21,120 arvuti teab kus ja mis real peamine, et minna tagasi. 522 00:31:21,120 --> 00:31:23,940 Salvestatud Frame osuti puudutab sarnaselt sellele. 523 00:31:23,940 --> 00:31:26,310 Char * baar siin näitab, mida? 524 00:31:26,310 --> 00:31:31,350 Nüüd on see sinine segment siin on suva raami. Mis on baar? 525 00:31:31,570 --> 00:31:35,010 Baar on lihtsalt väide, et suva funktsioon. 526 00:31:35,010 --> 00:31:37,500 Nüüd oleme tagasi omamoodi tuttav pilt. 527 00:31:37,500 --> 00:31:39,850 Seal on rohkem asju ja rohkem tähelepanu kõrvale juhitakse ekraanil 528 00:31:39,850 --> 00:31:43,380 kuid see helesinine segment lihtsalt on, mida me oleme toetudes kriiditahvel 529 00:31:43,380 --> 00:31:45,790 midagi nagu swap. See on raami suva. 530 00:31:45,790 --> 00:31:51,490 Ja ainus asi just nüüd on baar, mis on see parameeter. 531 00:31:51,490 --> 00:31:55,220 Aga mis siis veel peaks olema korstna vastavalt käesoleva seadustiku siin? 532 00:31:55,220 --> 00:31:57,760 [Üliõpilane] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Samuti peaksime nägema 12 ruutu mälu eraldatakse muutuja nimega c, 534 00:32:02,810 --> 00:32:04,970 ja tõepoolest me ei ole seda ekraanil. 535 00:32:04,970 --> 00:32:08,480 Väga top on C [0], ja siis autor selle skeem 536 00:32:08,480 --> 00:32:11,850 ei viitsinud joonistus kõik ruudud, kuid on ka 12 seal 537 00:32:11,850 --> 00:32:16,590 sest kui te vaatate all paremal, c [11] kui loete 0 on 12. selline bait. 538 00:32:16,590 --> 00:32:18,400 Aga siin on probleem. 539 00:32:18,400 --> 00:32:22,390 Millises suunas on c kasvab? 540 00:32:22,390 --> 00:32:27,080 Omamoodi ülevalt alla, kui see algab ülaosas ja kasvab alt. 541 00:32:27,080 --> 00:32:30,110 See ei tundu nagu me lahkusime ise palju raja siin üldse. 542 00:32:30,110 --> 00:32:32,090 Oleme omamoodi värvitud end nurka, 543 00:32:32,090 --> 00:32:36,940 ja et c [11] on õigus kuni vastu baar, mis on õigus kuni vastu Sääst Frame pointer, 544 00:32:36,940 --> 00:32:39,960 mis on õigus kuni vastu saatja aadress. Pole rohkem ruumi. 545 00:32:39,960 --> 00:32:42,810 Mis siis kaudselt siis, kui sa kägardama 546 00:32:42,810 --> 00:32:46,500 ja sa püüad lugemine 20 baiti arvesse 12-byte puhver? 547 00:32:46,500 --> 00:32:50,060 Kuhu need 8 täiendavat baiti lähe? >> [Üliõpilane] Toas - 548 00:32:50,060 --> 00:32:53,200 Toas kõik muu, millest mõned on super oluline. 549 00:32:53,200 --> 00:32:57,260 Ja kõige tähtsam, potentsiaalselt on punane kast seal, saatja aadress, 550 00:32:57,260 --> 00:33:03,560 sest arvan, et sa kas kogemata või adversarially kirjutatakse need 4 baiti, 551 00:33:03,560 --> 00:33:07,260 et osuti aadress, mitte ainult prügi kuid mitmete 552 00:33:07,260 --> 00:33:09,810 mis juhtub esindama tegelik aadress mällu. 553 00:33:09,810 --> 00:33:13,880 Mis tähendas, loogiliselt? >> [Üliõpilane] Funktsiooni läheb tagasi teises kohas. 554 00:33:13,880 --> 00:33:15,250 Täpselt. 555 00:33:15,250 --> 00:33:19,170 Kui foo tulu ja lööke, et lokkis traksidega, programm läheb edasi 556 00:33:19,170 --> 00:33:25,060 mitte naasta peamine, see läheb tagasi iganes aadress on, et punane kast. 557 00:33:25,060 --> 00:33:28,600 >> Kui kõrvalehoidmise tarkvara registreerimine, 558 00:33:28,600 --> 00:33:32,260 Mida teha, kui aadress, mis kuramuse tagasi on funktsioon, mis tavaliselt saab nimetada 559 00:33:32,260 --> 00:33:35,690 pärast olete maksnud tarkvara ja sisestanud oma registreerimiskood? 560 00:33:35,690 --> 00:33:39,870 Teil on võimalik järjestada trikk arvuti ei hakka siin, vaid tõusevad siin. 561 00:33:39,870 --> 00:33:45,100 Või kui sa oled tõesti tark, vaenlane saab tegelikult kirjutada aadressil klaviatuur, näiteks 562 00:33:45,100 --> 00:33:50,690 ei tegelikult sõna, mitte 20 tähemärki, kuid arvan, ta tegelikult liigid 563 00:33:50,690 --> 00:33:52,770 mõned märgid, mis esindavad kood. 564 00:33:52,770 --> 00:33:55,320 Ja see ei kavatse olla C-koodi, see on tegelikult saab olema tähemärki 565 00:33:55,320 --> 00:33:59,290 mis esindavad binaarne masinkoodidena, 0. ja 1s. 566 00:33:59,290 --> 00:34:01,290 Aga oletame, et nad on piisavalt targad, et seda teha, 567 00:34:01,290 --> 00:34:06,500 kuidagi kleepida getString kiire midagi, mis on sisuliselt kompileeritud koodi, 568 00:34:06,500 --> 00:34:09,980 ja viimased 4 baiti kirjutatakse, et saatja aadress. 569 00:34:09,980 --> 00:34:13,360 Ja mis aadress see, et sisend teha? 570 00:34:13,360 --> 00:34:18,630 See tegelikult kauplust see punane ristkülik aadress esimese baidi puhver. 571 00:34:18,630 --> 00:34:23,070 Nii et sa pead olema väga tark, ja see on palju katse-eksituse eest halvad inimesed seal, 572 00:34:23,070 --> 00:34:25,639 aga kui sa ei suuda välja selgitada, kui suur see puhver on 573 00:34:25,639 --> 00:34:28,820 selline, et viimase paari baiti sisend pakute programmi 574 00:34:28,820 --> 00:34:33,540 juhtub olema võrdne aadress algust oma puhver, seda saab teha. 575 00:34:33,540 --> 00:34:39,320 Kui me ütleme, tavaliselt tere ja \ 0, vaat mis jõuab puhver. 576 00:34:39,320 --> 00:34:44,420 Aga kui me veel targad ja me täidame seda puhvrit, mida me üldiselt helistada rünnaku kood - 577 00:34:44,420 --> 00:34:48,860 AAA, rünnak, rünnak, rünnak - kui see on lihtsalt midagi, mis teeb midagi halba, 578 00:34:48,860 --> 00:34:51,820 mis juhtub, kui sa oled tõesti tark, siis võiks seda teha. 579 00:34:51,820 --> 00:34:58,610 In punane kast siin on jada numbreid - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Pange tähele, et see arvule, mis on siin üleval. 581 00:35:01,610 --> 00:35:04,430 See on vastupidises järjekorras, kuid rohkem sellest mõni teine ​​kord. 582 00:35:04,430 --> 00:35:08,140 Pange tähele, et see saatja aadress on teadlikult muutnud 583 00:35:08,140 --> 00:35:12,020 võrduma aadress siia üles, ei aadressi peamine. 584 00:35:12,020 --> 00:35:17,500 Nii et kui paha poiss on super tark, ta läheb lisada, et rünnak kood 585 00:35:17,500 --> 00:35:20,930 midagi kustutada kõik kasutaja failid või kopeerida paroole 586 00:35:20,930 --> 00:35:24,680 või luua kasutajakonto et saan siis sisse - midagi. 587 00:35:24,680 --> 00:35:26,950 >> Ja see on nii ohtlik ja võimu C. 588 00:35:26,950 --> 00:35:29,840 Kuna teil on juurdepääs mälu kaudu lähtekohtadeks 589 00:35:29,840 --> 00:35:32,520 ja saate seepärast kirjutada ükskõik mida tahad arvutisse mällu 590 00:35:32,520 --> 00:35:35,080 saad teha arvuti midagi teha tahad 591 00:35:35,080 --> 00:35:39,550 lihtsalt võttes siis hüppavad ringi jooksul oma mälu. 592 00:35:39,550 --> 00:35:44,650 Ja nii see päev nii palju programme ja nii palju veebisaidid, mis on ohus 593 00:35:44,650 --> 00:35:46,200 Keeta inimesed ära see. 594 00:35:46,200 --> 00:35:50,760 Ja see võib tunduda super keeruline rünnak, kuid see ei ole alati alustada niimoodi. 595 00:35:50,760 --> 00:35:53,560 Reaalsus on see, et mida halvad inimesed tavaliselt ei ole, 596 00:35:53,560 --> 00:35:58,200 kas see programm käsurealt või graafilise programmi või veebilehe, 597 00:35:58,200 --> 00:35:59,940 sa lihtsalt alustada andes jama. 598 00:35:59,940 --> 00:36:03,980 Sa kirjutad tõesti suur sõna võtta otsingu väljale ja vajuta Enter, 599 00:36:03,980 --> 00:36:05,780 ja sa oodata, et näha, kui veebileht jookseb 600 00:36:05,780 --> 00:36:09,990 või sa oodata, et näha, kas programm avaldub mõne veateate 601 00:36:09,990 --> 00:36:14,330 sest kui sa õnnelik kui paha poiss ja pakute mõned hull sisend 602 00:36:14,330 --> 00:36:18,980 et jookseb programm, mis tähendab, et programmeerija ei osatud ette näha oma halva käitumise, 603 00:36:18,980 --> 00:36:23,630 mis tähendab, et saate ilmselt piisavalt vaeva, piisavalt katse-eksituse meetodil, 604 00:36:23,630 --> 00:36:26,650 nuputada, kuidas palkade täpsem rünnak. 605 00:36:26,650 --> 00:36:31,410 Nii et nii palju osa turvalisus ei ole ainult vältides nende rünnakute kokku 606 00:36:31,410 --> 00:36:34,100 kuid avastada neid ja tegelikult vaadates logisid 607 00:36:34,100 --> 00:36:36,780 ning vaadata mida hull sisendid on inimesed kirjutasid oma veebilehel, 608 00:36:36,780 --> 00:36:38,960 millised otsingusõnad on inimesed kirjutasid oma veebilehel 609 00:36:38,960 --> 00:36:42,870 loodab uputuse mõned puhver. 610 00:36:42,870 --> 00:36:45,500 Ja see kõik taandub lihtsalt põhitõdesid, mida on massiiv 611 00:36:45,500 --> 00:36:49,080 ja mida see tähendab paigutada ja kasutada mälu. 612 00:36:49,080 --> 00:36:51,710 >> Seotud, et siis liiga on see. 613 00:36:51,710 --> 00:36:54,280 Ütleme lihtsalt kiikama sees kõvaketas taas. 614 00:36:54,280 --> 00:36:58,440 Sa mäletate nädal või kaks tagasi, et kui lohistad failid prügikasti või prügikasti, 615 00:36:58,440 --> 00:37:03,710 mis juhtub? >> [Üliõpilane] Mitte midagi. >> Absoluutselt mitte midagi, eks? 616 00:37:03,710 --> 00:37:05,740 Lõpuks, kui sa jooksed vähe kettaruumi, 617 00:37:05,740 --> 00:37:08,190 Windows või Mac OS hakkab failide kustutamise eest. 618 00:37:08,190 --> 00:37:10,390 Aga kui lohistate midagi seal, et ei ole üldse ohutu. 619 00:37:10,390 --> 00:37:13,800 Kõik teie toakaaslane või sõber või pereliige peab tegema, on topeltklõps ja voila, 620 00:37:13,800 --> 00:37:16,310 seal on kõik pealiskaudsed failid, mida proovisin kustutada. 621 00:37:16,310 --> 00:37:19,590 Enamik meist vähemalt tean, et sa pead paremklõps või kontrolli kliki 622 00:37:19,590 --> 00:37:22,310 ja tühi prügikast või midagi sellist. 623 00:37:22,310 --> 00:37:25,000 Aga isegi siis, et ei ole päris trikki 624 00:37:25,000 --> 00:37:28,010 sest mis juhtub, kui sul on fail kõvakettale 625 00:37:28,010 --> 00:37:32,770 mis tähistab teatud Wordi dokumendi või mõne JPEG, ja see kujutab kõvakettal, 626 00:37:32,770 --> 00:37:35,350 ja oletame, et see Kiip näitab siin, et faili 627 00:37:35,350 --> 00:37:38,390 ja see koosneb terve hunnik 0. ja 1s. 628 00:37:38,390 --> 00:37:42,470 Mis juhtub, kui sa mitte ainult lohista see fail prügikasti või prügikasti 629 00:37:42,470 --> 00:37:48,020 kuid ka tühjenda see? Omamoodi midagi. 630 00:37:48,020 --> 00:37:49,640 See ei ole absoluutselt midagi nüüd. 631 00:37:49,640 --> 00:37:54,290 Nüüd see on lihtsalt midagi, sest natuke midagi juhtub kujul tabelis. 632 00:37:54,290 --> 00:37:58,370 Nii et seal on mingi andmebaasi või tabeli sees arvuti mällu 633 00:37:58,370 --> 00:38:03,850 et sisuliselt on üks veerg failide nimed ja üks veerg faili asukoha, 634 00:38:03,850 --> 00:38:07,720 kus see võib olla asukoht 123, lihtsalt suvaline number. 635 00:38:07,720 --> 00:38:14,560 Nii et meil oleks midagi x.jpeg ja asukoht 123. 636 00:38:14,560 --> 00:38:18,800 Mis juhtub siis, kui sa tegelikult tühjendada oma prügikasti? 637 00:38:18,800 --> 00:38:20,330 See läheb ära. 638 00:38:20,330 --> 00:38:23,610 Aga mis ei kao on 0. ja 1s. 639 00:38:23,610 --> 00:38:26,270 >> Mis siis seejärel ühendust pset4? 640 00:38:26,270 --> 00:38:31,240 Noh, pset4, lihtsalt sellepärast, et me oleme kogemata kustutatud compact flash kaart 641 00:38:31,240 --> 00:38:35,750 mis oli kõik need pildid või lihtsalt sellepärast, et seda halb õnn sai rikutud 642 00:38:35,750 --> 00:38:38,000 ei tähenda, et 0. ja 1s ei ole veel olemas. 643 00:38:38,000 --> 00:38:40,410 Võibolla mõned neist on kadunud, sest midagi sai rikutud 644 00:38:40,410 --> 00:38:43,320 selles mõttes, et mõned 0s sai 1s ja 1s sai 0.. 645 00:38:43,320 --> 00:38:47,240 Halbu asju võib juhtuda, sest lollakas tarkvara või rikkis riistvara. 646 00:38:47,240 --> 00:38:50,370 Aga paljud neist bitti, ehk isegi 100% neist on ikka veel seal. 647 00:38:50,370 --> 00:38:55,050 See on lihtsalt, et arvuti või kaamera ei tea, kus JPEG1 hakkas 648 00:38:55,050 --> 00:38:56,910 ja kus JPEG2 alanud. 649 00:38:56,910 --> 00:39:01,070 Aga kui sa, programmeerija, tean, kellel on veidi Savvy kui need JPEG on 650 00:39:01,070 --> 00:39:06,010 või millised nad välja näevad, nii et saate analüüsida 0. ja 1s ja öelda, JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 võite kirjutada programm, millel on põhimõtteliselt lihtsalt eest või samas loop 652 00:39:09,440 --> 00:39:12,820 mis taastab iga üks neist faile. 653 00:39:12,820 --> 00:39:16,030 Nii et õppetund siis on alustada kindlalt kustutamist failid 654 00:39:16,030 --> 00:39:18,340 kui soovite, et vältida seda täielikult. Jah. 655 00:39:18,340 --> 00:39:21,010 >> [Üliõpilane] Miks ta ütleb arvuti 656 00:39:21,010 --> 00:39:23,550 et teil on rohkem mälu kui sa tegid enne? 657 00:39:23,550 --> 00:39:27,820 Kas rohkem mälu kui sa tegid enne - >> [üliõpilane] rohkem vaba mälu. 658 00:39:27,820 --> 00:39:29,630 Oh. Hea küsimus. 659 00:39:29,630 --> 00:39:32,360 Nii et miks siis pärast tühjendamist prügikasti ei arvuti ütleb teile 660 00:39:32,360 --> 00:39:34,910 et teil on rohkem vaba ruumi kui sa tegid enne? 661 00:39:34,910 --> 00:39:36,770 Lühidalt, sest ta valetab. 662 00:39:36,770 --> 00:39:40,740 Rohkem tehniliselt, sul on rohkem ruumi, sest nüüd sa ütlesid 663 00:39:40,740 --> 00:39:43,680 võite panna muud kraami, kus see fail kunagi oli. 664 00:39:43,680 --> 00:39:45,450 Aga see ei tähenda, bitid lähevad ära, 665 00:39:45,450 --> 00:39:48,590 ja see ei tähenda, et neid tükke on muutunud kõik 0s, näiteks 666 00:39:48,590 --> 00:39:50,150 teie kaitseks. 667 00:39:50,150 --> 00:39:54,640 Nii seevastu kui te turvaliselt kustutab faili või füüsiliselt hävitada seadme 668 00:39:54,640 --> 00:39:57,300 et tegelikult on ainus viis kord ümber selle. 669 00:39:57,300 --> 00:40:02,020 >> Nii et miks me ei jäta, et pooleldi hirmutav teadmiseks, ja me näeme esmaspäeval. 670 00:40:02,020 --> 00:40:07,000 [Aplaus] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]