1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Viikko 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvardin yliopisto] 3 00:00:04,860 --> 00:00:07,260 [Tämä on CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Tämä on CS50, Viikko 5. 5 00:00:09,740 --> 00:00:12,900 Tänään ja tällä viikolla esittelemme hieman maailman Forensics 6 00:00:12,900 --> 00:00:14,850 yhteydessä Harjoitus 4. 7 00:00:14,850 --> 00:00:18,480 Tänään on lyhennetty luento, koska siellä on erityinen tapahtuma täällä jälkeenpäin. 8 00:00:18,480 --> 00:00:21,940 Joten me kurkistaa ja kammata sekä opiskelijoiden ja heidän vanhemmilleen tänään 9 00:00:21,940 --> 00:00:24,600 joitakin asioita, jotka ovat näköpiirissä. 10 00:00:24,600 --> 00:00:29,050 >> Niistä, kuten maanantaina, sinulla on muutama enemmän luokkatoverit. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvardin ja MIT: n uusi online aloite OpenCourseWare ja enemmän, 12 00:00:32,980 --> 00:00:36,730 käynnistää on Harvardin kampuksella maanantaina, mikä tarkoittaa tulevat maanantai 13 00:00:36,730 --> 00:00:40,930 sinulla on, koska viime count, 86000 ylimääräisiä luokkakaverit 14 00:00:40,930 --> 00:00:43,680 joka tulee sen jälkeen yhdessä CS50 luentoja ja osat 15 00:00:43,680 --> 00:00:45,890 ja walkthroughs ja ongelma sarjaa. 16 00:00:45,890 --> 00:00:51,870 Ja osana tätä, sinun tulee jäseniä avajais luokan CS50 ja nyt CS50x. 17 00:00:51,870 --> 00:00:56,150 Osana tätä nyt, ymmärtää, että siellä on joitakin upsides samoin. 18 00:00:56,150 --> 00:01:00,620 Saada valmis tähän, sillä valtava määrä opiskelijoita, 19 00:01:00,620 --> 00:01:03,820 on riittävää todeta, että vaikka meillä on 108 TF ja CAS, 20 00:01:03,820 --> 00:01:07,560 se ei ole aivan paras oppilas-opettaja-suhde, kun osuimme 80.000 opiskelijaa. 21 00:01:07,560 --> 00:01:09,830 Emme aio olla luokittelu niin monta ongelmaa asettaa manuaalisesti, 22 00:01:09,830 --> 00:01:13,050 joten käyttöön tällä viikolla Harjoitus on CS50 Tarkista, 23 00:01:13,050 --> 00:01:15,410 joka tulee olemaan komentoriviapuohjelman sisällä laitteen 24 00:01:15,410 --> 00:01:17,880 että saat kun päivittää myöhemmin tänä viikonloppuna. 25 00:01:17,880 --> 00:01:21,030 Pystyt ajaa komennon, check50, omalla PSET, 26 00:01:21,030 --> 00:01:24,770 ja saat välitöntä palautetta siitä, onko ohjelma oikea tai väärä 27 00:01:24,770 --> 00:01:27,980 mukaan eri eritelmät, jotka olemme antaneet. 28 00:01:27,980 --> 00:01:30,310 Lisää, että ongelma asetettu vaatimuksia. 29 00:01:30,310 --> 00:01:34,220 CS50x luokkatoverit tulee käyttämään tätä samoin. 30 00:01:34,220 --> 00:01:36,170 >> Harjoitus 4 on kyse Forensics, 31 00:01:36,170 --> 00:01:38,630 ja tämä PSET oli todella innoittamana joitakin tosielämän tavaraa 32 00:01:38,630 --> 00:01:41,210 jolloin kun olin tutkijakoulussa I turvasäilöön hetkeksi 33 00:01:41,210 --> 00:01:45,270 kanssa Middlesex County syyttäjän toimisto tekee oikeuslääketieteen työtä 34 00:01:45,270 --> 00:01:47,660 niiden lyijyä oikeuslääketieteen tutkija. 35 00:01:47,660 --> 00:01:50,280 Mitä tämä oli, niin kuin luulen mainitsin muutama viikko aiemmin, 36 00:01:50,280 --> 00:01:52,720 on Mass valtiollinen poliisi tai muut tulevat, 37 00:01:52,720 --> 00:01:56,150 he pudota pois asioita, kuten kiintolevyjen ja CD-levyjä ja levykkeitä ja vastaavia, 38 00:01:56,150 --> 00:01:58,770 ja sitten tavoitteena Forensics toimisto oli selvittää 39 00:01:58,770 --> 00:02:01,470 oliko vai ei todisteita jonkinlaisia. 40 00:02:01,470 --> 00:02:04,730 Tämä oli Special Investigations yksikkö, joten se oli valkokaulusrikollisuuden. 41 00:02:04,730 --> 00:02:10,949 Se oli enemmän huolestuttavia tavallaan rikoksia, mitään mukana jonkinlainen digitaalisen median. 42 00:02:10,949 --> 00:02:16,450 On käynyt ilmi, että ei ole, että monet ihmiset kirjoittavat sähköpostia sanomalla "Minä tein sen." 43 00:02:16,450 --> 00:02:20,490 Niin usein nämä oikeuslääketieteen haut eivät nosta kovin paljon hedelmää, 44 00:02:20,490 --> 00:02:22,820 mutta joskus ihmiset kirjoittavat tällaisia ​​sähköposteja. 45 00:02:22,820 --> 00:02:25,240 Joten joskus, ponnistelut palkittiin. 46 00:02:25,240 --> 00:02:31,210 >> Mutta johtaa jopa tämän oikeuslääketieteen PSET, me voidaan ottaa käyttöön vuonna pset4 vähän grafiikkaa. 47 00:02:31,210 --> 00:02:35,410 Olet luultavasti ottaa näitä asioita itsestäänselvyyksinä - JPEG, GIF, ja kuten - näinä päivinä. 48 00:02:35,410 --> 00:02:38,320 Mutta jos todella miettiä sitä, kuva, aivan kuten Rob kasvot, 49 00:02:38,320 --> 00:02:41,270 voitaisiin mallintaa sekvenssi pisteitä tai pikseliä. 50 00:02:41,270 --> 00:02:43,380 Tapauksessa Rob kasvot, siellä on kaikenlaisia ​​värejä, 51 00:02:43,380 --> 00:02:46,760 ja aloimme nähdä yksittäisiä pisteitä, muuten kutsutaan pikseliä, 52 00:02:46,760 --> 00:02:48,610 Kun aloimme Lähennä 53 00:02:48,610 --> 00:02:54,660 Mutta jos me yksinkertaistaa maailmaa hieman ja sanoa, että tämä tässä on Rob musta ja valkoinen, 54 00:02:54,660 --> 00:02:57,490 edustaa mustaa ja valkoista, voimme vain käyttää binääri. 55 00:02:57,490 --> 00:03:01,660 Ja jos aiomme käyttää binääri, 1 tai 0, voimme ilmaista tämän saman kuvan 56 00:03:01,660 --> 00:03:06,140 Rob on hymyilevät kasvot tämän kuvion bittiä. 57 00:03:06,140 --> 00:03:12,100 11000011 edustaa valkoinen, valkoinen, musta, musta, musta, musta, valkoinen, valkoinen. 58 00:03:12,100 --> 00:03:16,150 Ja niin se ei ole valtava harppaus sitten alkaa puhua värikkäitä valokuvia, 59 00:03:16,150 --> 00:03:18,600 asioita, joita haluat nähdä Facebookissa tai ottaa digitaalikameralla. 60 00:03:18,600 --> 00:03:21,410 Mutta varmasti kun se tulee väriä, tarvitset enemmän bittejä. 61 00:03:21,410 --> 00:03:25,690 Ja varsin yleisiä maailmassa valokuvat on käyttää ei 1-bittiset värit, 62 00:03:25,690 --> 00:03:29,560 koska tämä viittaa siihen, mutta 24-bittiset värit, jossa voit itse saada miljoonia värejä. 63 00:03:29,560 --> 00:03:32,250 Joten kuten kun zoomataan Rob silmään, 64 00:03:32,250 --> 00:03:36,370 , joka oli mikä tahansa määrä miljoonia erilaisia ​​värikkäitä mahdollisuuksia. 65 00:03:36,370 --> 00:03:39,040 Joten me esitellä tämän Harjoitus 4 sekä esittely, 66 00:03:39,040 --> 00:03:43,370 joka on tänään klo 3:30 sijasta tavallista 2:30 koska perjantain luento täällä. 67 00:03:43,370 --> 00:03:46,620 Mutta video on verkossa normaalisti huomenna. 68 00:03:46,620 --> 00:03:48,820 >> Otamme myös esitellä sinut toiseen tiedostomuotoon. 69 00:03:48,820 --> 00:03:51,270 Tämä on tarkoituksella tarkoitus tarkastella uhkaava aluksi, 70 00:03:51,270 --> 00:03:55,670 mutta tämä on vain joitakin asiakirjoja C struct. 71 00:03:55,670 --> 00:03:58,940 On käynyt ilmi, että Microsoft vuotta sitten auttoi kansantajuistaa tätä muotoa 72 00:03:58,940 --> 00:04:05,150 kutsutaan bitmap tiedostomuoto, bmp, ja tämä oli erittäin yksinkertainen, värikäs graafinen tiedostomuoto 73 00:04:05,150 --> 00:04:10,150 että on käytetty jo jonkin aikaa ja joskus vielä tapetteja pöydälle. 74 00:04:10,150 --> 00:04:14,760 Jos luulet takaisin Windows XP ja mäkiä ja sininen taivas, 75 00:04:14,760 --> 00:04:17,170 että oli tyypillisesti bmp tai bittikarttakuvana. 76 00:04:17,170 --> 00:04:19,959 Bittikartat ovat hauskoja meille, koska heillä on hieman enemmän monimutkaisuutta. 77 00:04:19,959 --> 00:04:22,610 Se ei ole aivan niin yksinkertaista kuin tämä ruudukko 0s ja 1s. 78 00:04:22,610 --> 00:04:27,510 Sen sijaan sinulla asioita, kuten otsikon alussa tiedoston. 79 00:04:27,510 --> 00:04:31,990 Eli toisin sanoen, sisällä. Bmp tiedosto on koko joukko 0s ja 1s, 80 00:04:31,990 --> 00:04:34,910 mutta siellä on joitakin ylimääräisiä 0s ja 1s siellä. 81 00:04:34,910 --> 00:04:38,220 Ja näyttää siltä, ​​että mitä olemme ehkä itsestäänselvyys jo vuosia - 82 00:04:38,220 --> 00:04:45,170 tiedostomuotoja kuten. doc tai. xls tai. mp3,. mp4 riippumatta tiedostomuodot 83 00:04:45,170 --> 00:04:48,480 että olet perehtynyt - mitä se edes tarkoittaa olla tiedostomuotoon, 84 00:04:48,480 --> 00:04:52,480 koska loppujen lopuksi kaikki nämä tiedostot käytämme on vain 0 ja 1s. 85 00:04:52,480 --> 00:04:56,810 Ja ehkä nuo 0s ja 1s edustavat ABC kautta ASCII tai vastaava, 86 00:04:56,810 --> 00:04:58,820 mutta loppujen lopuksi, se on silti vain 0s ja 1s. 87 00:04:58,820 --> 00:05:02,100 Joten ihmiset vain satunnaisesti päättää keksiä uusi tiedostomuoto 88 00:05:02,100 --> 00:05:06,420 jossa he standardoida mitä malleja bittien todella tarkoittaa. 89 00:05:06,420 --> 00:05:09,220 Ja tässä tapauksessa tänne, ihmiset, jotka on suunniteltu bitmap tiedostomuoto 90 00:05:09,220 --> 00:05:15,620 sanoi, että aivan ensimmäinen tavu bittikarttatiedostoa, kuten merkitään offset 0 siellä, 91 00:05:15,620 --> 00:05:18,940 siellä tulee olemaan joitakin arvoituksellisesti nimetty muuttuja nimeltä bfType, 92 00:05:18,940 --> 00:05:23,080 joka vain seisoo varten bittikarttatiedostoa tyyppi, millaista bittikarttana tätä. 93 00:05:23,080 --> 00:05:27,700 Voit päätellä ehkä toisen rivin offset 2, tavu numero 2, 94 00:05:27,700 --> 00:05:33,740 on kuvio 0s ja 1s joka edustaa mitä? Koko jotain. 95 00:05:33,740 --> 00:05:35,310 Ja se menee sieltä. 96 00:05:35,310 --> 00:05:37,410 Joten Harjoitus 4, voit kävellä läpi joitakin näistä asioista. 97 00:05:37,410 --> 00:05:39,520 Emme lopulta välittänyt niitä kaikkia. 98 00:05:39,520 --> 00:05:47,510 Mutta huomaa se alkaa saada mielenkiintoisia ympäri tavu 54: rgbtBlue, vihreä ja punainen. 99 00:05:47,510 --> 00:05:52,110 Jos olet koskaan kuullut lyhenne RGB - punainen, vihreä, sininen - tämä on viittaus kyseiseen 100 00:05:52,110 --> 00:05:54,610 koska se kääntyy pois, voit maalata kaikki sateenkaaren värit 101 00:05:54,610 --> 00:05:58,180 joidenkin yhdistelmä punainen ja sininen ja vihreä. 102 00:05:58,180 --> 00:06:03,320 Ja itse asiassa, vanhempien huoneessa voi muistaa joitakin pian projektorit. 103 00:06:03,320 --> 00:06:05,890 Nykyään voit vain nähdä yksi kirkkaan valon tulevan ulos linssin, 104 00:06:05,890 --> 00:06:09,800 mutta takaisin päivä sinulla oli punainen linssi, sininen linssi ja vihreä linssi, 105 00:06:09,800 --> 00:06:13,380 ja yhdessä ne pyritään näyttö ja muodostunut värikäs kuva. 106 00:06:13,380 --> 00:06:16,270 Ja melko usein, yläasteen ja lukion olisi nuo linssit 107 00:06:16,270 --> 00:06:19,720 koskaan niin hieman vinossa, joten olimme tavallaan nähdä kaksin-tai kolminkertainen kuvia. 108 00:06:19,720 --> 00:06:24,100 Mutta se oli ajatus. Sinulla oli punainen ja vihreä ja sininen valo maalaus kuvaa. 109 00:06:24,100 --> 00:06:26,590 Ja että samaa periaatetta käytetään tietokoneita. 110 00:06:26,590 --> 00:06:30,230 >> Joten joukossa haasteita niin sinulle Harjoitus 4 tulevat olemaan muutamia asioita. 111 00:06:30,230 --> 00:06:34,800 Yksi on todella muuttaa kuvan ryhtyä rakenteessa 0s ja 1s, 112 00:06:34,800 --> 00:06:40,200 selvittää, mitkä paloina 0s ja 1s edustavat mitä rakenteessa näin, 113 00:06:40,200 --> 00:06:43,630 ja sitten selvittää, miten toistaa pixels - punaiset, siniset, vihreät - 114 00:06:43,630 --> 00:06:46,660 sisällä siten, että kun kuva näyttää tämän aluksi, 115 00:06:46,660 --> 00:06:49,210 Se voisi näyttää tältä sijaan jälkeen. 116 00:06:49,210 --> 00:06:53,640 Niistä muista haasteista myös tulee olemaan, että sinun on luovutettava rikosteknisen kuva 117 00:06:53,640 --> 00:06:56,030 on todellinen tiedoston digitaalikamerasta. 118 00:06:56,030 --> 00:06:58,960 Ja se kamera, Olipa kerran, oli koko joukko kuvia. 119 00:06:58,960 --> 00:07:03,760 Ongelma on meillä vahingossa poistetaan tai on ollut kuvan vioittunut jotenkin. 120 00:07:03,760 --> 00:07:05,750 Bad Things Happen digitaalikameroissa. 121 00:07:05,750 --> 00:07:09,150 Ja niin me nopeasti kopioida kaikki 0s ja 1s pois tuosta kortin sinulle, 122 00:07:09,150 --> 00:07:13,610 pelasti heidät kaikki yhteen iso tiedosto, ja sitten me ojentaa ne sinulle Harjoitus 4 123 00:07:13,610 --> 00:07:19,320 jotta voit kirjoittaa ohjelman C, joka palauttaa kaikki ne JPEG, mieluiten. 124 00:07:19,320 --> 00:07:23,330 Ja näyttää siltä, ​​että JPEG, vaikka he jokseenkin monimutkainen tiedostomuoto - 125 00:07:23,330 --> 00:07:26,360 ne ovat paljon monimutkaisempia kuin tämä hymyilevät kasvot täällä - 126 00:07:26,360 --> 00:07:31,160 käy ilmi, että jokainen JPEG alkaa saman malleja 0s ja 1s. 127 00:07:31,160 --> 00:07:35,630 Joten käyttäen, lopulta, kun silmukan tai for-silmukka tai vastaava, 128 00:07:35,630 --> 00:07:38,880 voit toistaa kaikkia 0s ja 1s tässä oikeuslääketieteen kuva, 129 00:07:38,880 --> 00:07:43,150 ja joka kerta näet erityinen kuvio, joka on määritelty Harjoitus erittely, 130 00:07:43,150 --> 00:07:47,880 Voit olettaa tässä, hyvin suurella todennäköisyydellä, alku JPEG. 131 00:07:47,880 --> 00:07:51,230 Ja heti kun löytää sama kuvio joidenkin tavujen 132 00:07:51,230 --> 00:07:55,430 tai kilotavua tai megatavua uudempi, voit olettaa tässä on toinen JPEG, 133 00:07:55,430 --> 00:07:57,380 kuvan otin ensimmäisen jälkeen. 134 00:07:57,380 --> 00:08:01,370 Saanen lopettaa lukemisen että ensimmäistä tiedostoa, kirjoita tähän uuteen, 135 00:08:01,370 --> 00:08:06,310 ja tuotoksen teidän ohjelman pset4 tulee olemaan jopa 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 Ja jos se ei ole 50 JPEG, sinulla on vähän silmukan. 137 00:08:09,270 --> 00:08:12,490 Jos sinulla on ääretön määrä JPEG, sinulla on ääretön silmukka. 138 00:08:12,490 --> 00:08:14,910 Niin sekin on melko yhteinen asia. 139 00:08:14,910 --> 00:08:16,600 Niin, että mitä horisontissa. 140 00:08:16,600 --> 00:08:21,310 >> Quiz 0 takanamme, ymmärtää kohti minun email poikkeuksetta olemassa ihmisiä, jotka ovat molemmat tyytyväisiä, 141 00:08:21,310 --> 00:08:23,640 tavallaan neutraalia, ja surullinen noin tietovisa 0 kertaa. 142 00:08:23,640 --> 00:08:26,800 Ja älä tavoittaa minua, pää TF Zamyla, oma TF, 143 00:08:26,800 --> 00:08:31,180 tai yksi varmenteiden että tiedät, jos haluat keskustella siitä, miten asiat menivät. 144 00:08:31,180 --> 00:08:35,539 >> Joten vaikutuksen vanhemmille tässä huoneessa, mikä on CS50 kirjastoon? 145 00:08:36,429 --> 00:08:40,390 [Naurua] Hyvää työtä. 146 00:08:40,390 --> 00:08:48,340 Mikä CS50 kirjastoon? Joo. >> [Opiskelija] Se ennalta kirjoitetun joukko koodi [kuulumattomissa] 147 00:08:48,340 --> 00:08:49,750 Okei, hyvä. 148 00:08:49,750 --> 00:08:53,240 Se on ennalta kirjoitetun joukko koodin että henkilöstö kirjoitti tarjoamme sinulle, 149 00:08:53,240 --> 00:08:55,030 joka tarjoaa joitakin yhteisiä toimintoja, 150 00:08:55,030 --> 00:08:59,020 juttuja saada minut merkkijono, saa minua int - kaikki toiminnot, jotka on lueteltu tässä. 151 00:08:59,020 --> 00:09:02,260 >> Alkaa nyt, alamme todella nämä apupyörät pois. 152 00:09:02,260 --> 00:09:05,050 Aiomme aloittaa viedä merkkijono teiltä, 153 00:09:05,050 --> 00:09:08,870 mikä Recall oli vain synonyymi mitä todellinen tietotyypin? >> [Useita opiskelijoita] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Vanhemmille, joka oli luultavasti [tekee whooshing ääni]. Se on hyvä. 155 00:09:12,730 --> 00:09:17,550 Char * aloitamme nähdä ruudulla sitäkin me poistaa merkkijonon sanastosta, 156 00:09:17,550 --> 00:09:19,730 ainakin kun se tulee todella kirjoittaa koodia. 157 00:09:19,730 --> 00:09:22,840 Samoin me lopeta jotkut näistä toimii paljon 158 00:09:22,840 --> 00:09:25,280 koska meidän ohjelmat menevät kehittyneempiä. 159 00:09:25,280 --> 00:09:28,480 Sen sijaan vain kirjoittaa ohjelmia, jotka istuvat siellä nopeasti vilkkuva, 160 00:09:28,480 --> 00:09:31,870 odottaa käyttäjä kirjoittaa jotain, saatte tuloja muualta. 161 00:09:31,870 --> 00:09:35,490 Esimerkiksi, saat ne sarjan bittiä paikalliselle kiintolevylle. 162 00:09:35,490 --> 00:09:38,580 Sinä sen sijaan saada heidät tulevaisuudessa verkkoyhteyden, 163 00:09:38,580 --> 00:09:40,230 joitakin verkkosivuilla jonnekin. 164 00:09:40,230 --> 00:09:44,110 >> Joten Taitat tämän kerroksen ensimmäisen kerran ja vedä ylös CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 ja tämä tiedosto nimeltä cs50.h, joihin sinulla on # lukien viikkoja, 166 00:09:49,010 --> 00:09:51,140 mutta katsotaanpa itse nähdä mitä on sisällä tämän. 167 00:09:51,140 --> 00:09:54,430 Tiedoston alkuun sinisellä on vain koko joukko kommentit: 168 00:09:54,430 --> 00:09:57,050 takuutietoja ja lisensointi. 169 00:09:57,050 --> 00:09:59,050 Tämä on eräänlainen yhteinen paradigma ohjelmisto 170 00:09:59,050 --> 00:10:01,580 koska paljon ohjelmistoja näinä päivinä on mitä kutsutaan avoimen lähdekoodin, 171 00:10:01,580 --> 00:10:05,220 mikä tarkoittaa, että joku on kirjoittanut koodin ja teki vapaasti saatavilla 172 00:10:05,220 --> 00:10:10,470 ei vain ajaa ja käyttää, mutta itse lukenut ja muuttaa ja integroida omaan työhön. 173 00:10:10,470 --> 00:10:14,660 Niin, että mitä olet käyttänyt, avoimen lähdekoodin ohjelmistoja, vaikkakin hyvin pienikokoinen. 174 00:10:14,660 --> 00:10:18,560 Jos minä selaa ohi kommentit kuitenkin aloitamme nähdä joitakin tuttuja asioita. 175 00:10:18,560 --> 00:10:25,010 Ilmoitus huipulla tässä, että cs50.h tiedosto sisältää koko joukko header-tiedostot. 176 00:10:25,010 --> 00:10:28,560 Useimmat näistä, emme ole ennen nähneet, mutta yksi on tuttu. 177 00:10:28,560 --> 00:10:32,270 Mitkä näistä olemme nähneet, vaikkakin lyhyesti, tähän mennessä? >> [Opiskelija] Vakio kirjastoon. 178 00:10:32,270 --> 00:10:35,810 Joo, vakio kirjasto. stdlib.h on malloc. 179 00:10:35,810 --> 00:10:38,320 Kun aloimme puhua dynaamisen muistin jakamista, 180 00:10:38,320 --> 00:10:41,650 jonka tulemme takaisin ensi viikolla samoin, aloitimme mukaan lukien tiedoston. 181 00:10:41,650 --> 00:10:46,640 On käynyt ilmi, että bool ja tosi ja epätosi eivät todellisuudessa olemassa C sinänsä 182 00:10:46,640 --> 00:10:49,440 ellet sisällyttää tämän tiedoston täällä. 183 00:10:49,440 --> 00:10:52,710 Olemme jo viikkoja ollut lukien stdbool.h 184 00:10:52,710 --> 00:10:55,620 jotta voit käyttää käsitettä bool, tosi tai epätosi. 185 00:10:55,620 --> 00:10:58,620 Ilman tätä, sinun pitäisi lajitella väärennettyjä ja käyttää int 186 00:10:58,620 --> 00:11:02,610 ja vain mielivaltaisesti olettaa, että 0 on epätosi ja 1 on tosi. 187 00:11:02,610 --> 00:11:07,150 Jos me selaa edelleen, tässä on meidän määritelmä merkkijono. 188 00:11:07,150 --> 00:11:11,390 On käynyt ilmi, kuten olemme sanoneet, että jos tämä tähti on, ei ole väliä. 189 00:11:11,390 --> 00:11:13,720 Voit jopa tilaa ympäri. 190 00:11:13,720 --> 00:11:16,740 Olemme tällä lukukaudella on edistää sitä, koska se selventää 191 00:11:16,740 --> 00:11:18,620 että tähti on tekemistä tyyppi, 192 00:11:18,620 --> 00:11:21,700 mutta ymmärtää yhtä yleistä, jos ei hieman yleisempää, 193 00:11:21,700 --> 00:11:24,430 on laittaa se sinne, mutta toiminnallisesti se on sama asia. 194 00:11:24,430 --> 00:11:27,720 Mutta nyt jos luemme alas entisestään, katsotaanpa katsomaan GetInt 195 00:11:27,720 --> 00:11:32,190 koska käytimme että ehkä ennen kuin mitään muuta tällä lukukaudella. 196 00:11:32,190 --> 00:11:37,440 Tässä on GetInt. Tämä on mitä? >> [Opiskelija] prototyyppi. >> Tämä on vain prototyyppi. 197 00:11:37,440 --> 00:11:41,410 Usein olemme tehneet prototyyppien yläosien meidän. C-tiedostoja, 198 00:11:41,410 --> 00:11:46,690 mutta voit myös laittaa prototyyppejä header-tiedostoja,. h tiedostoja, kuten tämä täällä 199 00:11:46,690 --> 00:11:50,840 niin että kun kirjoittaa joitakin toimintoja, jotka haluat muut ihmiset voivat käyttää, 200 00:11:50,840 --> 00:11:53,550 joka on täsmälleen asianlaita CS50 kirjasto, 201 00:11:53,550 --> 00:11:57,040 et vain toteuttaa omia toimintoja jotain cs50.c, 202 00:11:57,040 --> 00:12:02,790 voit myös laittaa prototyyppejä ei yläreunassa tiedoston, mutta yläosassa otsikkotiedoston. 203 00:12:02,790 --> 00:12:07,170 Sitten se header tiedosto on mitä ystävät ja kollegat ovat 204 00:12:07,170 --> 00:12:09,760 kanssa # sisällyttää omiin koodin. 205 00:12:09,760 --> 00:12:12,210 Joten kaiken tämän ajan, olet myös kaikki nämä prototyyppejä, 206 00:12:12,210 --> 00:12:16,580 tehokkaasti yläreunassa tiedoston mutta miten tästä # include mekanismi, 207 00:12:16,580 --> 00:12:20,070 joka olennaisesti kopiot ja pastat tämä tiedosto omaan. 208 00:12:20,070 --> 00:12:23,070 Tässä on muutamia varsin yksityiskohtaiset ohjeet. 209 00:12:23,070 --> 00:12:25,640 Olemme melko itsestään selvänä, että GetInt saa int- 210 00:12:25,640 --> 00:12:27,640 mutta se osoittautuu joitakin rajatapauksissa. 211 00:12:27,640 --> 00:12:31,810 Entä jos käyttäjä tyypit ja määrä on aivan liian suuri, quintillion, 212 00:12:31,810 --> 00:12:35,490 että vain ei mahdu sisälle int? Mikä on odotettu käytös? 213 00:12:35,490 --> 00:12:38,020 Ihannetapauksessa se on ennustettavissa. 214 00:12:38,020 --> 00:12:40,280 Eli tässä tapauksessa, jos olet itse lukenut sakon tulostaa, 215 00:12:40,280 --> 00:12:44,500 voit itse nähdä, että jos rataa ei voi lukea, tämä palaa INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Emme ole koskaan puhuneet tästä, mutta perustuen arvo, mitä se luultavasti? 217 00:12:48,320 --> 00:12:50,640 [Opiskelija] vakiona. >> Se vakio. 218 00:12:50,640 --> 00:12:54,770 On joitakin erityisiä vakio, joka on luultavasti ilmoitettu johonkin näistä header-tiedostot 219 00:12:54,770 --> 00:13:00,090 Se on jopa suurempi tiedosto ja INT_MAX on luultavasti jotain noin 2 miljardia 220 00:13:00,090 --> 00:13:04,990 Ajatuksena on, että koska meidän jotenkin merkiksi, että jotain meni pieleen, 221 00:13:04,990 --> 00:13:10,700 me, kyllä, on 4000000000 numerot käytössämme: -2 miljardia jopa 2 miljardia, antaa tai ottaa. 222 00:13:10,700 --> 00:13:14,710 No, mikä on yleinen ohjelmointi on sinun varastaa vain yksi noita numeroita, 223 00:13:14,710 --> 00:13:18,920 ehkä 0, ehkä 2 miljardia ehkä -2000000000, 224 00:13:18,920 --> 00:13:23,280 joten voit viettää joku mahdollisista arvoista, jotta voit sitoutua maailmalle 225 00:13:23,280 --> 00:13:26,820 että jos jokin menee pieleen, palaan tähän super iso arvo. 226 00:13:26,820 --> 00:13:31,030 Mutta et halua käyttäjän kirjoittaa jotain arvoituksellinen kuin 234 ..., todella iso määrä. 227 00:13:31,030 --> 00:13:34,060 Sinä yleistää sen sijaan kuin vakiona. 228 00:13:34,060 --> 00:13:38,060 Siis todella, jos olisit on anaali viime viikkoina tahansa soitit GetInt, 229 00:13:38,060 --> 00:13:42,900 sinun olisi pitänyt tarkkailun jos ehto ei käyttäjän kirjoita INT_MAX, 230 00:13:42,900 --> 00:13:46,590 tai tarkemmin, ei GetInt paluu INT_MAX, koska jos se ei, 231 00:13:46,590 --> 00:13:51,830 että oikeastaan ​​tarkoittaa, että he eivät kirjoita sitä. Jokin meni pieleen tässä asiassa. 232 00:13:51,830 --> 00:13:56,080 Joten tämä on mitä yleisesti kutsutaan sentinel arvo, mikä tarkoittaa vain erityistä. 233 00:13:56,080 --> 00:13:58,120 >> Katsotaanpa nyt muuttuu. C tiedosto. 234 00:13:58,120 --> 00:14:01,340 C tiedosto on olemassa laitetta jonkin aikaa. 235 00:14:01,340 --> 00:14:06,840 Ja itse asiassa, laite on sen valmiiksi koottu sinut että asia vaadimme konekielisessä 236 00:14:06,840 --> 00:14:09,540 mutta se vain ei ole väliä missä se on, koska järjestelmä tietää 237 00:14:09,540 --> 00:14:11,730 Tässä tapauksessa se on: laite. 238 00:14:11,730 --> 00:14:17,400 Katsotaanpa selaa nyt GetInt ja nähdä miten GetInt on työskennellyt koko ajan. 239 00:14:17,400 --> 00:14:19,460 Täällä meillä on samankaltaisia ​​kommentteja ennen. 240 00:14:19,460 --> 00:14:21,660 Saanen suurentaa vain koodin osaa. 241 00:14:21,660 --> 00:14:23,900 Ja mitä olemme GetInt on seuraava. 242 00:14:23,900 --> 00:14:25,700 Siinä ei tulo. 243 00:14:25,700 --> 00:14:29,510 Se palauttaa int, while (true), joten meillä on tahallinen loputon silmukka, 244 00:14:29,510 --> 00:14:33,180 mutta oletettavasti me eroon tästä jotenkin tai palaa tämän. 245 00:14:33,180 --> 00:14:34,870 >> Katsotaanpa, miten tämä toimii. 246 00:14:34,870 --> 00:14:39,240 Meidän näyttävät käyttävän GetString tätä ensimmäisellä rivillä sisällä silmukan, 166. 247 00:14:39,240 --> 00:14:43,780 Tämä on nyt hyvä käytäntö, koska, missä olosuhteissa voisi GetString palata 248 00:14:43,780 --> 00:14:47,660 erikois NULL? >> [Opiskelija] Jos jokin menee pieleen. 249 00:14:47,660 --> 00:14:51,630 Jos jokin menee pieleen. Ja mikä voisi mennä pieleen, kun soitat jotain GetString? 250 00:14:54,960 --> 00:14:57,640 Joo. >> [Opiskelija] malloc ei anna sitä ints. 251 00:14:57,640 --> 00:14:59,150 Joo. Ehkä malloc epäonnistuu. 252 00:14:59,150 --> 00:15:03,190 Jossain alla huppu, GetString kutsuu malloc, joka allokoi muistia, 253 00:15:03,190 --> 00:15:06,020 jonka avulla tietokone tallentaa kaikki merkit 254 00:15:06,020 --> 00:15:07,750 että käyttäjän tyypit osaksi näppäimistö. 255 00:15:07,750 --> 00:15:11,590 Ja olettaa käyttäjän oli paljon vapaa-aikaa ja kirjoittanut enemmän esimerkiksi 256 00:15:11,590 --> 00:15:16,160 yli 2 miljardia merkkiä, enemmän merkkejä kuin tietokoneessa on jopa RAM. 257 00:15:16,160 --> 00:15:19,250 GetString on voitava merkiksi siitä, että teille. 258 00:15:19,250 --> 00:15:22,560 Vaikka tämä on super, super harvinaista kulma tapauksessa, 259 00:15:22,560 --> 00:15:24,340 se on jotenkin pystyä käsittelemään tätä, 260 00:15:24,340 --> 00:15:28,750 ja niin GetString, jos menimme takaisin ja lukea sen dokumentointi, itse asiassa paluuta NULL. 261 00:15:28,750 --> 00:15:34,460 Joten nyt jos GetString epäonnistuu palauttamalla NULL, GetInt on menossa epäonnistua palauttamalla INT_MAX 262 00:15:34,460 --> 00:15:37,690 aivan kuten sentinel. Nämä ovat vain ihmisen yleissopimukset. 263 00:15:37,690 --> 00:15:41,450 Ainoa tapa sinun pitäisi tietää tämä on asia lukemalla dokumentaation. 264 00:15:41,450 --> 00:15:45,040 >> Katsotaanpa selaa missä int todella saanut. 265 00:15:45,040 --> 00:15:51,160 Jos minä selaa hieman pidemmälle, linjassa 170, meillä kommentin yläpuolella näitä rivejä. 266 00:15:51,160 --> 00:15:55,100 Me julistamme 172 int, n, ja char, c, ja sitten tämä uusi toiminto, 267 00:15:55,100 --> 00:15:58,930 jonka jotkut teistä ovat törmänneet aiemmin, sscanf. 268 00:15:58,930 --> 00:16:00,870 Tämä tarkoittaa merkkijonoa scanf. 269 00:16:00,870 --> 00:16:05,700 Toisin sanoen, anna minulle merkkijono, ja aion tarkistaa sen palaset kiinnostavia tietoja. 270 00:16:05,700 --> 00:16:07,360 Mitä se tarkoittaa? 271 00:16:07,360 --> 00:16:11,800 Oletetaan, että minä kirjoita, kirjaimellisesti, 123-näppäimistö ja paina sitten Enter. 272 00:16:11,800 --> 00:16:16,470 Mikä on tietotyyppi 123 kun palauttamat GetString? >> [Opiskelija] String. 273 00:16:16,470 --> 00:16:18,380 Se on tietysti merkkijono, eikö? Sain merkkijono. 274 00:16:18,380 --> 00:16:23,220 Eli 123 on todella, lainaus-lainaus päättyy, 123 \ 0 lopussa se. 275 00:16:23,220 --> 00:16:27,110 Tämä ei ole int. Se ei ole numero. Se näyttää useita, mutta se ei ole oikeastaan. 276 00:16:27,110 --> 00:16:29,080 Joten mitä GetInt pitää tehdä? 277 00:16:29,080 --> 00:16:35,750 Se on skannata merkkijonon vasemmalta oikealle - 123 \ 0 - ja jotenkin muuntaa todellinen kokonaisluku. 278 00:16:35,750 --> 00:16:37,850 Voisit selvittää, miten tehdä tämä. 279 00:16:37,850 --> 00:16:41,450 Jos muistelen pset2, sinulla luultavasti sai vähän mukava Caesar 280 00:16:41,450 --> 00:16:44,820 tai Vigenere, joten voit toistaa yli merkkijono, voit muuntaa merkkiä ja ints. 281 00:16:44,820 --> 00:16:46,710 Mutta pahus, se on paljon työtä. 282 00:16:46,710 --> 00:16:49,860 Miksi ei kutsua toimivat kuten sscanf joka tekee sen puolestasi? 283 00:16:49,860 --> 00:16:54,230 Joten sscanf odottaa argumentti - tässä tapauksessa kutsutaan linja, joka on merkkijono. 284 00:16:54,230 --> 00:17:01,840 Olet määritä lainausmerkkeihin, hyvin samankaltainen kuin printf, mitä odottaa tältä merkkijono. 285 00:17:01,840 --> 00:17:09,000 Ja mitä minä sanon tässä on minun odottaa desimaaliluvun ja ehkä luonne. 286 00:17:09,000 --> 00:17:12,000 Ja näemme, miksi näin on vain hetken. 287 00:17:12,000 --> 00:17:15,869 Ja näyttää siltä, ​​että tämä merkintätapa on nyt muistuttaa kamaa aloimme puhua 288 00:17:15,869 --> 00:17:17,619 hieman yli viikko sitten. 289 00:17:17,619 --> 00:17:21,740 Mikä on & n ja & C tekee meille täällä? >> [Opiskelija] osoite n ja osoite c. 290 00:17:21,740 --> 00:17:25,400 Joo. Se antaa minulle osoite n ja osoite c. Miksi on niin tärkeää? 291 00:17:25,400 --> 00:17:30,220 Tiedät, että toimii C, voit aina palauttaa arvon tai lainkaan arvoa. 292 00:17:30,220 --> 00:17:34,530 Voit palauttaa int, string, float, char, mitä, tai voit palauttaa void- 293 00:17:34,530 --> 00:17:38,030 mutta voit vain palauttaa yksi asia maksimaalisesti. 294 00:17:38,030 --> 00:17:42,760 Mutta tässä me haluamme sscanf palauttaa minulle ehkä int, desimaaliluku, 295 00:17:42,760 --> 00:17:46,220 ja myös char, ja selitän miksi nieriää hetki. 296 00:17:46,220 --> 00:17:51,460 Voit tehokkaasti haluavat sscanf palata kaksi asiaa, mutta se ei vain ole mahdollista C. 297 00:17:51,460 --> 00:17:55,200 Voit kiertää viemällä kaksi osoitetta 298 00:17:55,200 --> 00:17:57,370 koska heti kun käsin tehtävä kaksi osoitetta, 299 00:17:57,370 --> 00:18:00,470 mitä tämä tehtävä tehdä niille? >> [Opiskelija] Kirjoita osoitteet. 300 00:18:00,470 --> 00:18:02,010 Se voi kirjoittaa osoitteet. 301 00:18:02,010 --> 00:18:05,770 Voit käyttää tähti toimintaa ja mennä sinne, jokainen näistä osoitteista. 302 00:18:05,770 --> 00:18:11,260 Se on eräänlainen tämän takaoven mekanismi, mutta hyvin tavallista muuttaa muuttujien arvot 303 00:18:11,260 --> 00:18:14,870 enemmän kuin vain yksi paikka - tässä tapauksessa kaksi. 304 00:18:14,870 --> 00:18:21,340 Nyt huomaa olen tarkistanut == 1 ja palaavat sitten n jos näin ei itse asiassa arvioi totta. 305 00:18:21,340 --> 00:18:26,170 Joten mitä on tekeillä? Teknisesti kaikki haluamme todella tapahtua GetInt on tässä. 306 00:18:26,170 --> 00:18:30,740 Haluamme jäsentää, niin sanoakseni, haluamme lukea merkkijono - lainaus-lainaus päättyy 123 - 307 00:18:30,740 --> 00:18:34,560 ja jos se näyttää siellä useita siellä, mitä me kerromme sscanf tehdä 308 00:18:34,560 --> 00:18:38,190 laitetaan että numero - 123 - Tämän muuttujan n minulle. 309 00:18:38,190 --> 00:18:42,090 Miksi sitten minä oikeastaan ​​tämän samoin? 310 00:18:42,090 --> 00:18:48,220 Mikä on rooli sscanf sanomalla saatat myös saada hahmo täällä? 311 00:18:48,220 --> 00:18:53,470 [Äänetön opiskelija vastausta] >> desimaalipilkun todella toimisi. 312 00:18:53,470 --> 00:18:56,330 Katsotaanpa katsonut, että mietti hetken. Mitä muuta? 313 00:18:56,330 --> 00:18:59,270 [Opiskelija] Voisi olla NULL. >> Hyvä ajatus. Se voisi olla nollamerkki. 314 00:18:59,270 --> 00:19:01,660 Se on oikeastaan ​​ole tässä tapauksessa. Joo. >> [Opiskelija] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Tai haluan yleistää entisestään. 316 00:19:04,340 --> 00:19:06,640 % C on vain Virheentarkistus. 317 00:19:06,640 --> 00:19:09,300 Me emme halua olla merkki jälkeen numero, 318 00:19:09,300 --> 00:19:11,870 mutta mitä tämä antaa minulle mahdollisuuden tehdä seuraavalla. 319 00:19:11,870 --> 00:19:18,210 On käynyt ilmi, että sscanf lisäksi tallentamiseen arvot N ja C tässä esimerkissä täällä 320 00:19:18,210 --> 00:19:24,890 Mitä se tekee on se palauttaa muuttujien määrä sen laittaa arvot tuumaa 321 00:19:24,890 --> 00:19:30,260 Joten jos vain kirjoitat 123, vain% d menee vastaamaan, 322 00:19:30,260 --> 00:19:33,880 ja vain n saa tallennettu arvo, kuten 123, 323 00:19:33,880 --> 00:19:35,640 ja mitään ei otettu c. 324 00:19:35,640 --> 00:19:37,620 C pysyy roskat arvo, niin sanoakseni - 325 00:19:37,620 --> 00:19:40,730 roskat koska se ei ole koskaan alustetaan jotain arvoa. 326 00:19:40,730 --> 00:19:45,520 Joten siinä tapauksessa, sscanf palauttaa 1 koska olen asuttu 1 näiden osoittimia, 327 00:19:45,520 --> 00:19:50,190 jolloin suuri, minulla int joten vapauttaa linjan vapauttaa muistia 328 00:19:50,190 --> 00:19:54,000 että GetString todellisuudessa varattu, ja sitten palaan n, 329 00:19:54,000 --> 00:19:58,500 if Oletko koskaan miettinyt minne se Uudelleen ilmoitus tulee, se tulee täällä. 330 00:19:58,500 --> 00:20:04,390 Joten jos sen sijaan, minä kirjoita 123foo - vain joitakin satunnaisia ​​järjestyksessä tekstiä - 331 00:20:04,390 --> 00:20:08,490 sscanf tulee nähdä numero, numero, numero, f, 332 00:20:08,490 --> 00:20:16,410 ja se tulee laittaa 123 N, se tulee laittaa F c ja palata sitten 2. 333 00:20:16,410 --> 00:20:20,640 Joten meillä on vain käyttää perusmääritelmää sscanf käyttäytymistä, hyvin yksinkertaisella tavalla - 334 00:20:20,640 --> 00:20:23,900 hyvin monimutkaisia ​​ensi silmäyksellä, mutta loppujen lopuksi melko yksinkertainen mekanismi - 335 00:20:23,900 --> 00:20:28,320 sanoa onko int ja jos niin on, että ainoa asia, löysin? 336 00:20:28,320 --> 00:20:29,860 Ja välilyönnit tässä on tahallista. 337 00:20:29,860 --> 00:20:34,000 Jos luet asiakirjat sscanf, se kertoo sinulle, että jos kuuluu pala whitespace 338 00:20:34,000 --> 00:20:38,810 alussa tai lopussa, sscanf liian sallii käyttäjän, mistä tahansa syystä, 339 00:20:38,810 --> 00:20:41,860 lyödä välilyönti 123 ja se tulee olemaan oikeutettu. 340 00:20:41,860 --> 00:20:44,150 Et huuda käyttäjä vain koska ne välilyöntiä 341 00:20:44,150 --> 00:20:48,640 alussa tai lopussa, mikä on vain hieman käyttäjäystävällinen. 342 00:20:48,640 --> 00:20:52,300 >> Kaikki kysymykset sitten GetInt? Joo. >> [Opiskelija] Mitä jos vain laittaa char? 343 00:20:52,300 --> 00:20:54,030 Hyvä kysymys. 344 00:20:54,030 --> 00:20:59,890 Mitä jos vain kirjoitetaan char kuten f ja paina Enter koskaan kirjoittaa 123? 345 00:20:59,890 --> 00:21:02,420 Mitä mieltä olette käytöksen koodirivin olisi sitten? 346 00:21:02,420 --> 00:21:04,730 [Äänetön opiskelija vastausta] 347 00:21:04,730 --> 00:21:08,790 Niin, joten sscanf voi kattaa että liian koska siinä tapauksessa, se ei tule täyttää n tai c. 348 00:21:08,790 --> 00:21:15,310 Se tulee sen sijaan palauttaa 0, jolloin olen myös kiinni siitä, että skenaario 349 00:21:15,310 --> 00:21:18,750 koska odotusarvo haluan on 1. 350 00:21:18,750 --> 00:21:22,000 Haluan vain yksi ja vain yksi asia täytettäväksi. Hyvä kysymys. 351 00:21:22,000 --> 00:21:24,290 >> Muut? Selvä. 352 00:21:24,290 --> 00:21:26,250 >> Älkäämme käydä läpi kaikki toiminnot tänne, 353 00:21:26,250 --> 00:21:29,500 mutta joka näyttää olevan kenties jäljellä korko on GetString 354 00:21:29,500 --> 00:21:32,790 koska näyttää siltä, ​​että GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 kaikki punt paljon niiden toiminnallisuutta GetString. 356 00:21:36,260 --> 00:21:39,750 Joten katsomaan kuinka hän on toteutettu täällä. 357 00:21:39,750 --> 00:21:43,630 Tämä näyttää hieman monimutkainen, mutta se käyttää samoja perusteita 358 00:21:43,630 --> 00:21:45,670 että aloimme puhua viime viikolla. 359 00:21:45,670 --> 00:21:49,490 Vuonna GetString, jossa ei väitettä kohti void täällä 360 00:21:49,490 --> 00:21:53,730 ja se palauttaa merkkijonon, olen ilmeisesti olen julistamisesta merkkijono kutsutaan puskurin. 361 00:21:53,730 --> 00:21:56,270 En todellakaan tiedä, mitä se tulee käyttää, mutta me näemme. 362 00:21:56,270 --> 00:21:58,390 Näyttää siltä kapasiteetti on oletuksena 0. 363 00:21:58,390 --> 00:22:01,350 Ole aivan varma mihin tämä on menossa, ei tiedä mitä n aiotaan käyttää vielä, 364 00:22:01,350 --> 00:22:03,590 mutta nyt se alkaa hieman mielenkiintoisemman. 365 00:22:03,590 --> 00:22:06,520 Linjassa 243, me julistamme int c. 366 00:22:06,520 --> 00:22:08,800 Tämä on eräänlainen tyhmä yksityiskohta. 367 00:22:08,800 --> 00:22:15,820 Char on 8 bittiä, ja 8 bittiä voi tallentaa miten monta eri arvoja? >> [Opiskelija] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Ongelma on, jos haluat olla 256 eri ASCII-merkkejä, jotka on 369 00:22:20,730 --> 00:22:23,340 jos luulet takaisin - ja tämä ei ole jotain muistaa. 370 00:22:23,340 --> 00:22:25,710 Mutta jos muistelen että iso ASCII kaavio meillä oli viikko sitten, 371 00:22:25,710 --> 00:22:30,600 oli tässä tapauksessa 128 tai 256 ASCII-merkkiä. 372 00:22:30,600 --> 00:22:32,940 Käytimme kaikki mallit 0s ja 1s ylös. 373 00:22:32,940 --> 00:22:36,210 Tämä on ongelma, jos haluat pystyä havaitsemaan virhettä 374 00:22:36,210 --> 00:22:40,190 koska jos käytät jo 256 arvoja hahmosi, 375 00:22:40,190 --> 00:22:43,050 et todellakaan suunnittele talouttaan sillä nyt sinulla ei ole tapa sanoa, 376 00:22:43,050 --> 00:22:46,270 Tämä ei ole legit luonnetta, tämä on noin virheellinen viesti. 377 00:22:46,270 --> 00:22:50,270 Joten mitä maailma tekee, on ne käyttävät seuraavaksi suurin arvo, jotain int- 378 00:22:50,270 --> 00:22:54,720 niin että sinulla on hullu määrä bittejä, 32, 4 miljardia mahdollisia arvoja 379 00:22:54,720 --> 00:22:58,860 niin että voit päätyä käyttämään pääasiassa 257 heistä, 380 00:22:58,860 --> 00:23:01,720 Jonka 1 on joitakin erityisiä merkitys kuin virhe. 381 00:23:01,720 --> 00:23:03,120 >> Joten miten tämä toimii. 382 00:23:03,120 --> 00:23:07,760 Linjassa 246, minulla on tämä iso, kun silmukka, joka soittaa fgetc, 383 00:23:07,760 --> 00:23:11,090 F Merkitys tiedosto, niin getc, ja sitten stdin. 384 00:23:11,090 --> 00:23:15,520 Paljastui, että tämä on vain tarkempi tapa sanoa luetaan panosta näppäimistö. 385 00:23:15,520 --> 00:23:19,300 Vakiosyöttökapasiteetti tarkoittaa näppäimistö, vakiotulosteeseen tarkoittaa näytön, 386 00:23:19,300 --> 00:23:23,310 ja keskivirhe, joka me nähdä pset4, tarkoittaa näytön 387 00:23:23,310 --> 00:23:27,490 mutta erityinen osa näytön niin, että se ei ole conflated varsinaiseen ulostulo 388 00:23:27,490 --> 00:23:30,750 että tarkoitus tulostaa. Mutta siitä lisää tulevaisuudessa. 389 00:23:30,750 --> 00:23:34,440 Joten fgetc tarkoittaa vain lukea yhden merkin päässä näppäimistön ja säilytä se minne? 390 00:23:34,440 --> 00:23:37,350 Säilytä se c. 391 00:23:37,350 --> 00:23:41,360 Ja tarkista sitten - joten olen vain käyttäen joitakin loogisia konjunktiot täällä - 392 00:23:41,360 --> 00:23:46,000 tarkista, että se ei vastaa - \ n, joten käyttäjä on Enter, haluamme lopettaa siinä vaiheessa, 393 00:23:46,000 --> 00:23:49,850 Silmukan lopussa - ja haluamme myös tarkistaa erityistä vakio EOF, 394 00:23:49,850 --> 00:23:53,610 jotka, jos tiedät tai arvailla, mitä se tarkoittaa? >> [Opiskelija] End of file. >> End of file. 395 00:23:53,610 --> 00:23:56,560 Tämä on tavallaan järjetöntä, koska jos olen kirjoittamalla klo näppäimistön, 396 00:23:56,560 --> 00:23:58,870 siellä oikeastaan ​​mitään tiedostoa mukana tässä, 397 00:23:58,870 --> 00:24:01,150 mutta tämä on vain eräänlainen yleinen termi tarkoittamaan 398 00:24:01,150 --> 00:24:04,220 että mikään muu on peräisin ihmisen sormet. 399 00:24:04,220 --> 00:24:06,460 EOF - tiedoston loppu. 400 00:24:06,460 --> 00:24:09,920 Sivuhuomautuksena, jos olet joskus lyönyt Ohjaus D näppäimistö, ei että olisit vielä - 401 00:24:09,920 --> 00:24:15,230 olet osuma Ohjaus C - Ohjaus D lähettää tätä erityistä vakio nimeltään EOF. 402 00:24:15,230 --> 00:24:19,850 Eli nyt meillä on vain muutamia dynaaminen muistin jakamista. 403 00:24:19,850 --> 00:24:23,440 >> Joten jos (n + 1> kapasiteettia). Nyt Selitän n. 404 00:24:23,440 --> 00:24:26,100 N on vain kuinka monta tavua on tällä hetkellä puskuriin, 405 00:24:26,100 --> 00:24:28,620 merkkijonon olet parhaillaan rakentaa käyttäjältä. 406 00:24:28,620 --> 00:24:33,450 Jos sinulla on enemmän merkkejä omassa puskurissa kuin sinulla kapasiteettia puskuriin, 407 00:24:33,450 --> 00:24:37,410 intuitiivisesti mitä meidän täytyy tehdä niin on jakaa enemmän kapasiteettia. 408 00:24:37,410 --> 00:24:43,330 Joten aion silmäillä joitakin aritmeettinen täällä ja keskittyä vain tätä toimintoa täällä. 409 00:24:43,330 --> 00:24:46,070 Tiedätkö mitä malloc on tai ainakin yleisesti tuttu. 410 00:24:46,070 --> 00:24:48,970 Ota arvaus mitä realloc tekee. >> [Opiskelija] Lisää muistia. 411 00:24:48,970 --> 00:24:52,920 Se ei ole aivan lisää muistia. Se allokoi uudelleen muistin seuraavasti. 412 00:24:52,920 --> 00:24:57,220 Jos siellä on vielä tilaa lopussa merkkijonon antaa sinulle enemmän että muistia 413 00:24:57,220 --> 00:25:00,000 kuin se alun perin antaa sinulle, niin saat että lisämuistia. 414 00:25:00,000 --> 00:25:03,460 Joten voit vain sysäämään merkkijonon merkkejä takaisin takaisin takaisin takaisin. 415 00:25:03,460 --> 00:25:05,830 Mutta jos se ei pidä paikkaansa, koska olet odottanut liian kauan 416 00:25:05,830 --> 00:25:07,940 ja jotain random pelaaja plopped muistissa on 417 00:25:07,940 --> 00:25:10,290 mutta siellä on ylimääräistä muistia täällä, se on okei. 418 00:25:10,290 --> 00:25:13,100 Realloc aikoo tehdä kaiken raskaan työn puolestasi, 419 00:25:13,100 --> 00:25:16,750 siirrä merkkijono olet lukenut näin kaukana täältä, laita se siellä, 420 00:25:16,750 --> 00:25:19,460 ja sitten antaa sinulle lisää kiitotien tässä vaiheessa. 421 00:25:19,460 --> 00:25:22,550 >> Joten aallon käden, haluan sanoa, että mitä GetString tekee 422 00:25:22,550 --> 00:25:26,330 on se alkaa pieni puskuri, ehkä yksi merkki, 423 00:25:26,330 --> 00:25:30,820 ja jos käyttäjä on kaksi merkkiä, GetString päätyy kutsuvan realloc ja sanoo 424 00:25:30,820 --> 00:25:33,150 yksi merkki ei riitä, anna minulle kaksi merkkiä. 425 00:25:33,150 --> 00:25:35,950 Sitten jos luet logiikan silmukan, se tulee sanoa 426 00:25:35,950 --> 00:25:39,600 käyttäjän kirjoittanut 3 merkkiä, anna minulle nyt ole 2, mutta 4 merkkiä, 427 00:25:39,600 --> 00:25:42,320 anna minulle 8, niin anna minulle 16 ja 32. 428 00:25:42,320 --> 00:25:45,000 Se, että olen kaksinkertaistaa kapasiteetin kerta 429 00:25:45,000 --> 00:25:48,570 tarkoittaa, että puskuri ei aio kasvaa hitaasti, se tulee kasvamaan erittäin nopeasti. 430 00:25:48,570 --> 00:25:51,380 Ja mikä voisi olla hyötyä siitä? 431 00:25:51,380 --> 00:25:54,600 Miksi olen koko kaksinkertaistui puskurin 432 00:25:54,600 --> 00:25:58,020 vaikka käyttäjä saattaa pitää vain yksi ylimääräinen merkki näppäimistöllä? 433 00:25:58,020 --> 00:26:01,750 [Äänetön opiskelija vastausta] >> Mikä tuo on? >> [Opiskelija] Sinun ei tarvitse kasvattaa sitä niin usein. 434 00:26:01,750 --> 00:26:03,300 Aivan. Sinun ei tarvitse kasvattaa sitä niin usein. 435 00:26:03,300 --> 00:26:05,510 Ja tämä on vain eräänlainen olet suojaavien vedot täällä, 436 00:26:05,510 --> 00:26:10,850 Ajatuksena on, että et halua soittaa realloc paljon, koska se on yleensä hidasta. 437 00:26:10,850 --> 00:26:12,910 Aina kysyä käyttöjärjestelmä muistia, 438 00:26:12,910 --> 00:26:16,990 niin saat pian nähdä tulevaisuudessa ongelma joukko, se yleensä kestää jonkin aikaa. 439 00:26:16,990 --> 00:26:20,010 Joten minimointi että aikaa, vaikka tuhlaat tilaa, 440 00:26:20,010 --> 00:26:21,900 yleensä hyvä asia. 441 00:26:21,900 --> 00:26:24,060 >> Mutta jos luemme läpi viimeisen osan GetString täällä - 442 00:26:24,060 --> 00:26:27,950 ja jälleen ymmärtää jokaisen rivin täällä ei ole niin tärkeää tänään - 443 00:26:27,950 --> 00:26:30,530 huomaa, että se lopulta kutsuu malloc uudelleen 444 00:26:30,530 --> 00:26:33,880 ja se jakaa tasan yhtä monta tavua kuin se tarvitsee merkkijono 445 00:26:33,880 --> 00:26:38,060 ja sitten heittää pois soittamalla ilmaiseksi liian suuri puskuri 446 00:26:38,060 --> 00:26:40,080 jos se todellakin voittamaan kaksinkertaistui liian monta kertaa. 447 00:26:40,080 --> 00:26:42,730 Eli lyhyesti sanottuna, että miten GetString on työskennellyt koko ajan. 448 00:26:42,730 --> 00:26:47,060 Kaikki se luetaan yksi merkki kerrallaan uudestaan ​​ja uudestaan ​​ja uudestaan, 449 00:26:47,060 --> 00:26:50,750 ja joka kerta se tarvitsee lisämuistia, se kysyy käyttöjärjestelmä sen 450 00:26:50,750 --> 00:26:53,670 soittamalla realloc. 451 00:26:53,670 --> 00:26:57,890 >> Kysyttävää? Selvä. 452 00:26:57,890 --> 00:26:59,270 >> Hyökkäys. 453 00:26:59,270 --> 00:27:04,060 Nyt ymmärrämme osoittimia tai ainakin ovat yhä paremmin perillä osoittimia, 454 00:27:04,060 --> 00:27:06,700 Tarkastellaan miten koko maailma alkaa romahtaa 455 00:27:06,700 --> 00:27:10,030 jos et ole aivan puolustautua kontradiktorisessa käyttäjiä, 456 00:27:10,030 --> 00:27:11,850 ihmiset, jotka yrittävät murtautua järjestelmään, 457 00:27:11,850 --> 00:27:16,890 ihmiset, jotka yrittävät varastaa ohjelmiston kiertämällä jotkut rekisteröintikoodin 458 00:27:16,890 --> 00:27:19,090 että niillä muutoin olisi kirjoittaa tuumaa 459 00:27:19,090 --> 00:27:22,990 >> Katsokaa tätä esimerkkiä täällä, mikä on vain C-koodia, joka on tehtävä tärkein alareunassa 460 00:27:22,990 --> 00:27:26,380 joka kutsuu funktio foo. Ja mitä on se ohimennen foo? 461 00:27:26,380 --> 00:27:29,680 [Opiskelija] yksittäisenä argumenttina. >> [Malan] yksittäisenä argumenttina. 462 00:27:29,680 --> 00:27:33,450 Joten argv [1], mikä tarkoittaa ensimmäistä sanaa että käyttäjä kirjoittaa komentoriville 463 00:27:33,450 --> 00:27:36,360 jälkeen a.out tai mikä ohjelma on nimeltään. 464 00:27:36,360 --> 00:27:41,680 Joten foo huipulla vie char *. Mutta char * on juuri mitä? >> [Opiskelija] merkkijono. 465 00:27:41,680 --> 00:27:43,350 [Malan] string, joten ei ole mitään uutta täällä. 466 00:27:43,350 --> 00:27:45,420 Tämä merkkijono on mielivaltaisesti kutsutaan bar. 467 00:27:45,420 --> 00:27:51,430 Tällä rivillä täällä, char c [12], on tavallaan puoliksi teknisiä Englanti, mitä tämä rivi tekee? 468 00:27:51,430 --> 00:27:55,220 [Opiskelija] joukko - >> Array? >> [Opiskelija] Characters. >> Characters. 469 00:27:55,220 --> 00:27:58,870 Anna minulle joukko 12 merkkiä. Joten voisimme kutsua tätä puskuria. 470 00:27:58,870 --> 00:28:02,920 Se on teknisesti kutsutaan C, mutta puskuri ohjelmointi tarkoittaa vain joukko avaruuden 471 00:28:02,920 --> 00:28:04,800 että voit laittaa kamaa sisään 472 00:28:04,800 --> 00:28:07,940 Sitten lopuksi, memcpy olemme ei käytetty ennen, mutta arvata saattaa, mitä se tekee. 473 00:28:07,940 --> 00:28:10,480 Se kopioi muistia. Mitä se tekee? 474 00:28:10,480 --> 00:28:19,270 Se ilmeisesti kopioi baari, sen panos, otetaan C mutta vain pituuden baarissa. 475 00:28:19,270 --> 00:28:24,930 Mutta on bugi täällä. >> [Opiskelija] Tarvitset sizeof luonnetta. >> Okei. 476 00:28:24,930 --> 00:28:30,860 Teknisesti, meidän pitäisi todella strlen (bar) * sizeof (char)). Aivan oikein. 477 00:28:30,860 --> 00:28:33,930 Mutta pahimmassa tapauksessa tässä oletetaan, että that's - 478 00:28:33,930 --> 00:28:35,950 Okei. Sitten on kaksi bugeja. 479 00:28:35,950 --> 00:28:39,160 Joten sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Tehdään tästä hieman laajemmin. 481 00:28:41,290 --> 00:28:44,910 Joten nyt on vielä bugi, joka on mitä? >> [Äänetön opiskelijan vastausta] 482 00:28:44,910 --> 00:28:46,990 Tarkista, mitä? >> [Opiskelija] Tarkista NULL. 483 00:28:46,990 --> 00:28:50,270 Meidän tulee yleensä tarkistamalla NULL koska pahoja asioita tapahtuu 484 00:28:50,270 --> 00:28:53,200 kun osoitin on NULL koska saatat päätyä sinne, 485 00:28:53,200 --> 00:28:57,630 ja sinun ei koskaan tule NULL by dereferencing se tähti operaattorin. 486 00:28:57,630 --> 00:29:01,050 Joten se on hyvä. Ja mitä muuta me teemme? Loogisesti siellä virhe tässäkin. 487 00:29:01,050 --> 00:29:04,450 [Opiskelija] Tarkista argc on> = 2. 488 00:29:04,450 --> 00:29:10,550 Joten tarkista jos argc on> = 2. Okei, joten siellä on kolme bugeja tästä ohjelmasta. 489 00:29:10,550 --> 00:29:16,630 Nyt tarkistaa, jos käyttäjä itse kirjoittanut mitään argv [1]. Hyvä. 490 00:29:16,630 --> 00:29:20,950 Joten mitä kolmas bugi? Joo. >> [Opiskelija] C ei ehkä tarpeeksi iso. 491 00:29:20,950 --> 00:29:23,320 Hyvä. Pyysimme Yhdessä skenaariossa. 492 00:29:23,320 --> 00:29:29,520 Meillä epäsuorasti tarkastetaan älä kopioi enemmän muistia kuin ylittäisi pituus baarissa. 493 00:29:29,520 --> 00:29:32,510 Joten jos merkkijono käyttäjä kirjoitettu on 10 merkkiä pitkä, 494 00:29:32,510 --> 00:29:36,020 tämä sanoo vain kopioida 10 merkkiä. Ja se on okei. 495 00:29:36,020 --> 00:29:39,940 Mutta entä jos käyttäjä kirjoitettu sana kehotteen 20-merkin sana? 496 00:29:39,940 --> 00:29:44,900 Tämä sanonta kopio 20 merkkiä siitä baarin, mitä? 497 00:29:44,900 --> 00:29:49,750 C, joka tunnetaan myös meidän puskuri, mikä tarkoittaa juuri kirjoitti dataa 498 00:29:49,750 --> 00:29:52,540 8 tavu paikkoihin että et omista, 499 00:29:52,540 --> 00:29:54,870 ja et omista niitä siinä mielessä, että et koskaan varattu niille. 500 00:29:54,870 --> 00:30:00,370 Joten tämä on mitä yleisesti kutsutaan puskurin ylivuoto hyökkäys tai puskurin ylivuoto hyökkäys. 501 00:30:00,370 --> 00:30:05,580 Ja se on hyökkäys siinä mielessä, että jos käyttäjä tai ohjelma, joka soittaa oman toiminnan 502 00:30:05,580 --> 00:30:10,490 tekee tätä vihamielisesti, mitä todella tapahtuu seuraavaksi voisi todella olla melko huono. 503 00:30:10,490 --> 00:30:12,450 >> Joten katsomaan tätä kuvaa täällä. 504 00:30:12,450 --> 00:30:16,060 Tämä kuva edustaa pinon muistin. 505 00:30:16,060 --> 00:30:19,580 Muistuttaa, että joka kerta kun soittaa toiminnon saat tämän pienen kehyksen pinoon 506 00:30:19,580 --> 00:30:21,520 ja sitten toinen ja sitten toinen ja toinen. 507 00:30:21,520 --> 00:30:24,300 Ja tähän mennessä olemme vain eräänlainen otetun näistä suorakulmioina 508 00:30:24,300 --> 00:30:26,290 joko aluksella tai ruudulla täällä. 509 00:30:26,290 --> 00:30:30,580 Mutta jos me zoomata yksi niistä suorakulmioita, kun soitat funktio foo- 510 00:30:30,580 --> 00:30:35,880 käy ilmi, että siellä on enemmän pinon sisällä että kehyksen että suorakulmion 511 00:30:35,880 --> 00:30:40,060 kuin vain x ja y ja a ja b, niin kuin emme puhu swap. 512 00:30:40,060 --> 00:30:44,410 On käynyt ilmi, että siellä on joku alemman tason yksityiskohdat, joukossa Return Address. 513 00:30:44,410 --> 00:30:49,550 Joten se kääntyy pois, kun tärkeimmät kutsuu foo, tärkein on ilmoitettava foo 514 00:30:49,550 --> 00:30:53,520 mitä tärkein osoite on tietokoneen muistiin 515 00:30:53,520 --> 00:30:57,770 koska muuten, niin pian kuin foo tehdään suorittamalla, kuten tässä tapauksessa tässä, 516 00:30:57,770 --> 00:31:00,830 Kun saavutat tämän suljetun kihara ahdin lopussa foo- 517 00:31:00,830 --> 00:31:05,310 Miten hitossa se foo tietää, missä valvonta ohjelman on tarkoitus mennä? 518 00:31:05,310 --> 00:31:08,970 On käynyt ilmi, että vastaus tähän kysymykseen on tämä punainen suorakulmion täällä. 519 00:31:08,970 --> 00:31:12,670 Tämä merkitsee osoittimen, ja se on jopa tietokone tallentaa tilapäisesti 520 00:31:12,670 --> 00:31:17,030 on ns pino osoite tärkeimmistä niin, että niin pian kuin foo on tehty täytäntöönpanovaltion, 521 00:31:17,030 --> 00:31:21,120 tietokone tietää missä ja mitä linjaa pääasiassa palata. 522 00:31:21,120 --> 00:31:23,940 Tallennetut Kehys osoitin liittyy samalla tämän. 523 00:31:23,940 --> 00:31:26,310 Char * bar täällä edustaa mitä? 524 00:31:26,310 --> 00:31:31,350 Nyt tämä sininen segmentti tässä foo runkoon. Mikä on baari? 525 00:31:31,570 --> 00:31:35,010 Bar on vain argumentti foo toimintoa. 526 00:31:35,010 --> 00:31:37,500 Joten nyt olemme takaisin tavallaan tuttu kuva. 527 00:31:37,500 --> 00:31:39,850 On enemmän tavaraa ja lisää häiriötekijöitä ruudulla, 528 00:31:39,850 --> 00:31:43,380 mutta tämä vaaleansininen segmentti juuri mitä olemme piirtämällä taululle 529 00:31:43,380 --> 00:31:45,790 jotain kuten swap. Tämä on runko foo. 530 00:31:45,790 --> 00:31:51,490 Ja ainoa asia juuri nyt on baari, joka on tämän parametrin. 531 00:31:51,490 --> 00:31:55,220 Mutta mitä muuta pitäisi olla pinon mukaan tämän koodin tänne? 532 00:31:55,220 --> 00:31:57,760 [Opiskelija] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Meidän pitäisi myös nähdä 12 ruutua varatun muistin muuttuja nimeltä C, 534 00:32:02,810 --> 00:32:04,970 ja todellakin meillä on, että ruudulla. 535 00:32:04,970 --> 00:32:08,480 Hyvin alkuun on c [0] ja sitten kirjoittanut tämän kaavion 536 00:32:08,480 --> 00:32:11,850 ei vaivaudu piirustus kaikki neliöt, mutta on todellakin 12 siellä 537 00:32:11,850 --> 00:32:16,590 sillä jos tarkastellaan oikeassa alakulmassa, c [11] jos lasketaan 0 on 12. tällaisen tavu. 538 00:32:16,590 --> 00:32:18,400 Mutta tässä on ongelma. 539 00:32:18,400 --> 00:32:22,390 Mihin suuntaan on C kasvaa? 540 00:32:22,390 --> 00:32:27,080 Järjestä ylhäältä alas, jos se alkaa ylhäältä ja kasvaa pohjaan. 541 00:32:27,080 --> 00:32:30,110 Se ei näytä jätimme itsellemme paljon kiitotien täällä ollenkaan. 542 00:32:30,110 --> 00:32:32,090 Olemme tavallaan maalannut itsemme nurkkaan, 543 00:32:32,090 --> 00:32:36,940 ja että c [11] on oikeassa vastaan ​​bar, mikä on oikea vastaan ​​Tallennetut Frame osoitin, 544 00:32:36,940 --> 00:32:39,960 mikä on oikea vastaan ​​Return Address. Ei ole enää tilaa. 545 00:32:39,960 --> 00:32:42,810 Joten mitä vaikutuksia silloin, jos mokaat 546 00:32:42,810 --> 00:32:46,500 ja yrität lukea 20 tavua 12-tavun puskuri? 547 00:32:46,500 --> 00:32:50,060 Missä ovat ne 8 lisätavujen menossa? >> [Opiskelija] Inside - 548 00:32:50,060 --> 00:32:53,200 Sisällä kaikki muu, joista osa on erittäin tärkeää. 549 00:32:53,200 --> 00:32:57,260 Ja tärkeintä, mahdollisesti, on punainen laatikko siellä, palautusosoite, 550 00:32:57,260 --> 00:33:03,560 koska Oletetaan, että sinulla on joko vahingossa tai adversarially ylikirjoittaa ne 4 tavua, 551 00:33:03,560 --> 00:33:07,260 että osoitin osoite, ei vain roskaa, mutta numero 552 00:33:07,260 --> 00:33:09,810 että sattuu edustamaan todellista osoitetta muistiin. 553 00:33:09,810 --> 00:33:13,880 Mitä vaikutuksia loogisesti? >> [Opiskelija] Toiminto tulee palata eri paikkaan. 554 00:33:13,880 --> 00:33:15,250 Aivan. 555 00:33:15,250 --> 00:33:19,170 Kun foo palaa ja osumia että kihara ahdin, ohjelma tulee edetä 556 00:33:19,170 --> 00:33:25,060 ei palata päävalikkoon, se tulee palauttaa mihin tahansa osoitteeseen on se punainen laatikko. 557 00:33:25,060 --> 00:33:28,600 >> Tapauksessa kiertää ohjelmiston rekisteröinnin 558 00:33:28,600 --> 00:33:32,260 mitä jos osoite on palautetaan on toiminto, joka normaalisti saa kutsutaan 559 00:33:32,260 --> 00:33:35,690 kun olet maksanut ohjelmiston ja syötetään rekisteröintikoodi? 560 00:33:35,690 --> 00:33:39,870 Voit lajitella temppu tietokoneen aio tässä vaan menee täällä. 561 00:33:39,870 --> 00:33:45,100 Tai jos olet todella fiksu, vastustaja voi todella kirjoittaa on näppäimistö, esimerkiksi 562 00:33:45,100 --> 00:33:50,690 ei todellista sanaa, ei 20 merkkiä, mutta kai hän todella tyypit 563 00:33:50,690 --> 00:33:52,770 joitakin merkkejä, jotka edustavat koodia. 564 00:33:52,770 --> 00:33:55,320 Ja se ei tule olemaan C-koodia, se on todella olemaan merkit 565 00:33:55,320 --> 00:33:59,290 jotka edustavat binary konekielelle, 0s ja 1s. 566 00:33:59,290 --> 00:34:01,290 Mutta oletetaan he tarpeeksi fiksu tehdä niin, 567 00:34:01,290 --> 00:34:06,500 jotenkin liitä GetString kehote mikä on olennaisesti käännetty koodi, 568 00:34:06,500 --> 00:34:09,980 ja viimeinen 4 tavua ylikirjoittaa että palautusosoite. 569 00:34:09,980 --> 00:34:13,360 Ja mitä osoite tuo panos tehdä? 570 00:34:13,360 --> 00:34:18,630 Se on itse asiassa tallentaa tämän punainen suorakulmio osoite ensimmäisen tavun puskuria. 571 00:34:18,630 --> 00:34:23,070 Joten sinun täytyy olla todella fiksu, ja tämä on paljon ja erehdyksen huonoja ihmisiä, 572 00:34:23,070 --> 00:34:25,639 mutta jos voit selvittää, kuinka suuri tämä puskuri on 573 00:34:25,639 --> 00:34:28,820 siten, että viime tavua tulo annat ohjelman 574 00:34:28,820 --> 00:34:33,540 sattuvat olemaan vastaavan osoitteen alussa oman puskurin, voit tehdä tämän. 575 00:34:33,540 --> 00:34:39,320 Jos sanomme tavallisesti Hei ja \ 0, sitähän päätyy puskuriin. 576 00:34:39,320 --> 00:34:44,420 Mutta jos olemme viisaampi ja täytämme sen puskuri mitä me yleisesti kutsua hyökkäys koodi - 577 00:34:44,420 --> 00:34:48,860 AAA, hyökkäys, hyökkäys, hyökkäys - jos tämä on vain jotain, joka tekee jotain pahaa, 578 00:34:48,860 --> 00:34:51,820 Mitä tapahtuu, jos olet todella fiksu, saatat tehdä tämän. 579 00:34:51,820 --> 00:34:58,610 Vuonna punainen laatikko tässä järjestyksessä numerot - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Huomaa, että vastaava määrä, joka on täällä. 581 00:35:01,610 --> 00:35:04,430 Se on käänteisessä järjestyksessä, mutta siitä lisää joku toinen kerta. 582 00:35:04,430 --> 00:35:08,140 Huomaa, että tämä paluu osoite on tarkoituksellisesti muutettu 583 00:35:08,140 --> 00:35:12,020 on yhtä osoitetta tänne, ei osoitetta tärkein. 584 00:35:12,020 --> 00:35:17,500 Joten jos pahis on super älykäs, hän aikoo sisällyttää kyseisen hyökkäyksen koodi 585 00:35:17,500 --> 00:35:20,930 jotain poistaa kaikki käyttäjän tiedostot tai kopioida salasanat 586 00:35:20,930 --> 00:35:24,680 tai luo käyttäjätili että voin sitten kirjautua - yhtään mitään. 587 00:35:24,680 --> 00:35:26,950 >> Ja tämä on sekä vaaran ja voiman C. 588 00:35:26,950 --> 00:35:29,840 Koska sinulla on pääsy muistiin kautta osoittimia 589 00:35:29,840 --> 00:35:32,520 Voit siis kirjoittaa mitä haluat osaksi tietokoneen muistiin, 590 00:35:32,520 --> 00:35:35,080 voit tehdä tietokoneen tehdä mitä haluat 591 00:35:35,080 --> 00:35:39,550 yksinkertaisesti ottaa se hypähdellä omassa muistia. 592 00:35:39,550 --> 00:35:44,650 Ja niin tänä päivänä niin monia ohjelmia ja niin monia sivustoja, jotka ovat vaarassa 593 00:35:44,650 --> 00:35:46,200 pohjimmiltaan ihmiset hyödyntää tätä. 594 00:35:46,200 --> 00:35:50,760 Ja tämä saattaa tuntua erittäin hienostunut hyökkäys, mutta se ei aina käynnisty niin. 595 00:35:50,760 --> 00:35:53,560 Tosiasia on, että mitä pahaa ihmiset yleensä tehdä, on, 596 00:35:53,560 --> 00:35:58,200 onko se ohjelma komentoriviltä tai GUI ohjelmaa tai verkkosivuilla, 597 00:35:58,200 --> 00:35:59,940 olet vain alkaa tarjota hölynpölyä. 598 00:35:59,940 --> 00:36:03,980 Kirjoitat todella iso sana hakukenttään ja paina Enter- 599 00:36:03,980 --> 00:36:05,780 ja odotat nähdä, jos sivusto kaatuu 600 00:36:05,780 --> 00:36:09,990 tai voit odottaa, jos ohjelma näkyy jonkin virheilmoituksen 601 00:36:09,990 --> 00:36:14,330 koska jos olet onnekas niin pahis ja annat joitakin hullu panos 602 00:36:14,330 --> 00:36:18,980 että kaatuu ohjelma, joka tarkoittaa ohjelmoija ei ennakoida huonoa käyttäytymistä, 603 00:36:18,980 --> 00:36:23,630 mikä tarkoittaa, että voit luultavasti tarpeeksi vaivaa, niin ja erehdyksen, 604 00:36:23,630 --> 00:36:26,650 selvittää, miten käydä tarkemmin hyökkäys. 605 00:36:26,650 --> 00:36:31,410 Niin paljon osa turvallisuutta ei ole vain välttää nämä hyökkäykset kokonaan 606 00:36:31,410 --> 00:36:34,100 mutta havaittuaan ne ja itse katsot lokit 607 00:36:34,100 --> 00:36:36,780 ja nähdä, mitä hulluja tulot ovat ihmisiä kirjoitetaan sivuston, 608 00:36:36,780 --> 00:36:38,960 mitä hakusanoja ihmiset ovat kirjoitetut sivustoosi 609 00:36:38,960 --> 00:36:42,870 toiveita täynnä joidenkin puskuria. 610 00:36:42,870 --> 00:36:45,500 Ja tämä kaikki pohjimmiltaan yksinkertainen perusasiat mitä array 611 00:36:45,500 --> 00:36:49,080 ja mitä se tarkoittaa kohdentaa ja käyttää muistia. 612 00:36:49,080 --> 00:36:51,710 >> Liittyvät että niin myös tämä. 613 00:36:51,710 --> 00:36:54,280 Toivotaan vain vilkaista sisällä kiintolevyn jälleen. 614 00:36:54,280 --> 00:36:58,440 Voit muistamme viikko tai kaksi sitten, että kun vedät tiedostot roskakoriin tai roskakoriin, 615 00:36:58,440 --> 00:37:03,710 mitä tapahtuu? >> [Opiskelija] Nothing. >> Yhtään mitään, eikö? 616 00:37:03,710 --> 00:37:05,740 Lopulta jos käytät vähän levytilaa, 617 00:37:05,740 --> 00:37:08,190 Windows tai Mac OS alkaa poistaa tiedostoja sinulle. 618 00:37:08,190 --> 00:37:10,390 Mutta jos vedät jotain siellä, että ei ole ollenkaan turvallista. 619 00:37:10,390 --> 00:37:13,800 Kaikki kämppäkaveri tai ystävä tai perheenjäsen tarvitsee vain tuplaklikkaa ja voila, 620 00:37:13,800 --> 00:37:16,310 siellä kaikki summittainen tiedostot yritit poistaa. 621 00:37:16,310 --> 00:37:19,590 Useimmat meistä ainakin tietää, että olet oikealla painikkeella tai Ctrl-osoittamalla 622 00:37:19,590 --> 00:37:22,310 ja tyhjennä roskakori tai jotain. 623 00:37:22,310 --> 00:37:25,000 Mutta silloinkaan se ei aivan tepsiä 624 00:37:25,000 --> 00:37:28,010 sillä mitä tapahtuu, kun olet tiedoston kiintolevylle 625 00:37:28,010 --> 00:37:32,770 joka edustaa jotkut Word-asiakirjan tai joidenkin JPEG, ja tämä merkitsee kiintolevylle, 626 00:37:32,770 --> 00:37:35,350 ja sanokaamme tämä suikale täällä edustaa tiedoston, 627 00:37:35,350 --> 00:37:38,390 ja se koostuu koko joukko 0s ja 1s. 628 00:37:38,390 --> 00:37:42,470 Mitä tapahtuu, kun ei vain vedä tätä tiedostoa roskakoriin tai roskakoriin 629 00:37:42,470 --> 00:37:48,020 mutta myös tyhjentää sen? Tavallaan mitään. 630 00:37:48,020 --> 00:37:49,640 Se ei ole mitään nyt. 631 00:37:49,640 --> 00:37:54,290 Nyt se on vain mitään, koska hieman jotain tapahtuu muodossa tämän taulukon. 632 00:37:54,290 --> 00:37:58,370 Joten siellä jonkinlainen tietokantaan tai taulukkoon sisällä tietokoneen muistiin 633 00:37:58,370 --> 00:38:03,850 että pohjimmiltaan on yksi sarake tiedostojen nimet ja yksi sarake tiedostojen sijainnin, 634 00:38:03,850 --> 00:38:07,720 jos tämä voi sijainti 123, vain satunnaisluku. 635 00:38:07,720 --> 00:38:14,560 Joten meillä voisi olla jotain x.jpeg ja sijainti 123. 636 00:38:14,560 --> 00:38:18,800 Mitä sitten tapahtuu kun itse tyhjentämään roskakorin? 637 00:38:18,800 --> 00:38:20,330 Se menee pois. 638 00:38:20,330 --> 00:38:23,610 Mutta mitä ei mene pois on 0s ja 1s. 639 00:38:23,610 --> 00:38:26,270 >> Joten mitä sitten yhteyden pset4? 640 00:38:26,270 --> 00:38:31,240 No, pset4, vain koska olemme vahingossa poistetaan compact flash-kortti 641 00:38:31,240 --> 00:38:35,750 että oli kaikki nämä valokuvat tai vain koska se huono tuuri tuli vioittunut 642 00:38:35,750 --> 00:38:38,000 ei tarkoita, että 0s ja 1s ole vielä olemassa. 643 00:38:38,000 --> 00:38:40,410 Ehkä muutama heistä menetetään, koska jotain todella vioittunut 644 00:38:40,410 --> 00:38:43,320 siinä mielessä, että jotkin 0s tuli 1s ja 1s tuli 0s. 645 00:38:43,320 --> 00:38:47,240 Pahoja asioita voi tapahtua, koska viallisista ohjelmistojen tai viallinen laitteisto. 646 00:38:47,240 --> 00:38:50,370 Mutta monet näistä bittiä, ehkä jopa 100% niistä, ovat edelleen olemassa. 647 00:38:50,370 --> 00:38:55,050 Se on vain, että tietokone tai kamera ei tiedä missä JPEG1 alkoi 648 00:38:55,050 --> 00:38:56,910 ja missä JPEG2 alkoi. 649 00:38:56,910 --> 00:39:01,070 Mutta jos, ohjelmoija, tietää vähän taju kun nämä JPEG ovat 650 00:39:01,070 --> 00:39:06,010 tai mitä ne näyttävät niin voit analysoida 0s ja 1s ja sanoa JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 Voit kirjoittaa ohjelman lähinnä vain varten tai kun silmukka 652 00:39:09,440 --> 00:39:12,820 että toipuu jokainen näistä tiedostoista. 653 00:39:12,820 --> 00:39:16,030 Joten oppitunnin jälkeen on aloittaa turvallisesti poistamatta tiedostoja 654 00:39:16,030 --> 00:39:18,340 Jos haluat välttää kokonaan. Kyllä. 655 00:39:18,340 --> 00:39:21,010 >> [Opiskelija] Miksi se sanoo tietokoneeseen 656 00:39:21,010 --> 00:39:23,550 että sinulla on enemmän muistia kuin teit ennen? 657 00:39:23,550 --> 00:39:27,820 On enemmän muistia kuin teit aikaisemmin - >> [opiskelija] Lisää muistia. 658 00:39:27,820 --> 00:39:29,630 Oh. Hyvä kysymys. 659 00:39:29,630 --> 00:39:32,360 Joten miksi sitten tyhjennyksen jälkeen roskakoriin ei tietokoneen kertoa 660 00:39:32,360 --> 00:39:34,910 että sinulla on enemmän tilaa kuin teit ennen? 661 00:39:34,910 --> 00:39:36,770 Pähkinänkuoressa, koska se valehtelee. 662 00:39:36,770 --> 00:39:40,740 Teknisesti, sinulla on enemmän tilaa, koska nyt olette sanoneet 663 00:39:40,740 --> 00:39:43,680 voit laittaa muita juttuja, jos tiedoston kerran oli. 664 00:39:43,680 --> 00:39:45,450 Mutta se ei tarkoita bitit ovat menossa pois, 665 00:39:45,450 --> 00:39:48,590 ja se ei tarkoita bitit ollaan muuttamassa kaikki 0s, esimerkiksi 666 00:39:48,590 --> 00:39:50,150 oman suojan. 667 00:39:50,150 --> 00:39:54,640 Niin sitä vastoin, jos turvallisesti poistaa tiedostoja tai fyysisesti tuhota laite, 668 00:39:54,640 --> 00:39:57,300 todella on ainoa tapa joskus kiertää. 669 00:39:57,300 --> 00:40:02,020 >> Joten miksi emme jätä tähän osittain pelottava note, ja näemme sinut maanantaina. 670 00:40:02,020 --> 00:40:07,000 [Aplodit] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]