1 00:00:00,000 --> 00:00:10,970 >> [Musikk spilles] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. MALAN: All right. 3 00:00:12,536 --> 00:00:13,392 >> [Latter] 4 00:00:13,392 --> 00:00:14,240 >> Velkommen tilbake. 5 00:00:14,240 --> 00:00:14,990 Dette er CS50. 6 00:00:14,990 --> 00:00:16,890 Og dette slutten av uke fem. 7 00:00:16,890 --> 00:00:20,020 Og frem til nå, har vi ganske mye tatt for gitt at det 8 00:00:20,020 --> 00:00:23,480 eksisterer denne kompilatoren, Clang, at du har blitt påkalle ved hjelp av denne 9 00:00:23,480 --> 00:00:27,100 andre verktøy kalt Gjør som liksom magisk konverterer kildekoden 10 00:00:27,100 --> 00:00:31,350 til objektkode, nuller og enere at datamaskinene CPU, sentral 11 00:00:31,350 --> 00:00:33,410 processing unit, forstår faktisk. 12 00:00:33,410 --> 00:00:36,770 Men det viser seg at det er et tall som er skjer under panseret i 13 00:00:36,770 --> 00:00:38,690 mellom inngang og utgang. 14 00:00:38,690 --> 00:00:41,800 >> Og jeg ønsker å foreslå at vi kjøtt at ut i litt mer detalj i 15 00:00:41,800 --> 00:00:45,130 disse fire trinnene, har noe som kalles pre-prosessering, noe 16 00:00:45,130 --> 00:00:48,300 kalles kompilering, som vi har sett, noe som kalles montering, og 17 00:00:48,300 --> 00:00:49,420 noe som kalles linking. 18 00:00:49,420 --> 00:00:53,270 Så frem til nå, i noen av våre programmer, har vi hatt skarpe omfatter. 19 00:00:53,270 --> 00:00:56,650 Mer nylig har vi hatt noen skarpe definerer for konstanter. 20 00:00:56,650 --> 00:01:00,660 Så det viser seg at de tingene som er prefiks med hash symbol eller 21 00:01:00,660 --> 00:01:04,150 pundet symbolet er pre-prosessor direktiver. 22 00:01:04,150 --> 00:01:07,960 Det er bare en fancy måte å si det en linje med kode som faktisk er 23 00:01:07,960 --> 00:01:12,280 omgjort til noe annet før datamaskinen selv prøve å konvertere 24 00:01:12,280 --> 00:01:13,800 programmet inn nuller og enere. 25 00:01:13,800 --> 00:01:19,000 >> For eksempel inneholder skarp standard I / O. H, ganske mye betyr bare gå 26 00:01:19,000 --> 00:01:24,010 fremover, ta tak i innholdet i filene stdio.h og lime dem rett der. 27 00:01:24,010 --> 00:01:25,880 Så ingen nuller og enere på det tidspunktet ennå. 28 00:01:25,880 --> 00:01:27,470 Det er egentlig bare et bytte. 29 00:01:27,470 --> 00:01:30,790 Og det er gjort under den såkalte pre-prosessering stadium, når du 30 00:01:30,790 --> 00:01:34,230 faktisk kjøre Clang eller spesifikt Lag i de fleste tilfeller. 31 00:01:34,230 --> 00:01:36,950 Så alt dette har skjedd første automatisk så langt. 32 00:01:36,950 --> 00:01:38,800 >> Så kommer kompilering trinn. 33 00:01:38,800 --> 00:01:40,920 Men vi har vært unyansert kompilering. 34 00:01:40,920 --> 00:01:45,060 Kompilere et program betyr egentlig å ta det fra noe sånt som C, den 35 00:01:45,060 --> 00:01:48,430 kildekoden vi har skrevet, ned til noe som kalles montering. 36 00:01:48,430 --> 00:01:52,900 Assembly er et lavere nivå språk som, heldigvis, vil vi ikke 37 00:01:52,900 --> 00:01:55,480 har mye anledning til å skrive dette semesteret. 38 00:01:55,480 --> 00:01:59,100 Men det er på det laveste nivået i forstand at du bokstavelig talt begynner å skrive 39 00:01:59,100 --> 00:02:04,270 legge til og trekke fra og multiplisere og laste fra minnet og lagre i minnet, den 40 00:02:04,270 --> 00:02:08,259 svært grunnleggende instruksjoner som en datamaskin, under panseret, 41 00:02:08,259 --> 00:02:09,639 faktisk forstår. 42 00:02:09,639 --> 00:02:14,930 >> Til slutt, tar montere dette språket til de nuller og enere som vi har vært 43 00:02:14,930 --> 00:02:16,190 beskriver så langt. 44 00:02:16,190 --> 00:02:19,270 Og virkelig slutt, det er den såkalte linking fasen, som vi vil 45 00:02:19,270 --> 00:02:22,360 se på bare et øyeblikk, som kombinerer dine nuller og enere med nuller og 46 00:02:22,360 --> 00:02:24,870 som andre mennesker før du har opprettet. 47 00:02:24,870 --> 00:02:26,660 >> Så vurdere dette super enkelt program. 48 00:02:26,660 --> 00:02:27,560 Det var fra uke 1. 49 00:02:27,560 --> 00:02:29,610 Det sa bare: Hello World, på skjermen. 50 00:02:29,610 --> 00:02:30,920 Vi kjørte dette gjennom Clang. 51 00:02:30,920 --> 00:02:33,200 Eller vi kjørte det gjennom Pass som kjørte Clang. 52 00:02:33,200 --> 00:02:36,170 Og sendes ut på det tidspunkt hvor noen nuller og enere. 53 00:02:36,170 --> 00:02:38,100 Men det viser seg at det er et mellomliggende trinn. 54 00:02:38,100 --> 00:02:40,460 Hvis jeg går over her - oops, gjorde ikke ønsker å se ham ennå. 55 00:02:40,460 --> 00:02:44,800 Hvis jeg går over her til apparatet mitt og jeg åpner opp hello.c, her 56 00:02:44,800 --> 00:02:46,160 er det samme programmet. 57 00:02:46,160 --> 00:02:48,600 Og hva jeg skal gjøre i terminalen min vinduet her er jeg kommer til å 58 00:02:48,600 --> 00:02:51,430 kjøre Clang snarere enn Gjør som automatiserer alle fire 59 00:02:51,430 --> 00:02:52,870 disse trinnene for oss. 60 00:02:52,870 --> 00:02:58,620 Og jeg kommer til å gjøre klang-S og deretter hello.c og deretter inn. 61 00:02:58,620 --> 00:03:00,590 >> Og jeg får en blinkende melding igjen, noe som er godt. 62 00:03:00,590 --> 00:03:05,280 Og nå i en litt større vindu, Jeg kommer til å åpne opp gedit her. 63 00:03:05,280 --> 00:03:09,610 Og jeg kommer til å åpne opp en fil som, viser seg, kalles hello.s dette 64 00:03:09,610 --> 00:03:11,870 inneholder det assembly Jeg refererte til tidligere. 65 00:03:11,870 --> 00:03:15,060 Og dette er det som kalles montering språk, ganske lavt nivå 66 00:03:15,060 --> 00:03:18,470 instruksjoner du Intel CPU eller hva det er som er inni 67 00:03:18,470 --> 00:03:19,350 forstår. 68 00:03:19,350 --> 00:03:24,480 Og mov er for trekk. samtalen er for ringer, et meget lavt nivå funksjon. 69 00:03:24,480 --> 00:03:26,380 sub er for trekke fra. 70 00:03:26,380 --> 00:03:30,370 >> Så når du har en spesiell CPU inne av datamaskinen, hva som gjør det 71 00:03:30,370 --> 00:03:34,300 distinkte, versus andre CPUer på markedet, som instruksjoner det 72 00:03:34,300 --> 00:03:39,460 forstår og ofte hvor effektiv den er, hvor fort det er på kjøre noen 73 00:03:39,460 --> 00:03:40,380 av disse instruksjonene. 74 00:03:40,380 --> 00:03:45,150 Nå for mer om dette, kan du ta neste høst CS61 ved høgskolen. 75 00:03:45,150 --> 00:03:48,170 Men her har vi, for eksempel, noen identifikatorer som kan se kjent. 76 00:03:48,170 --> 00:03:50,150 hello.c er navnet på programmet. 77 00:03:50,150 --> 00:03:51,070 >> . Tekst - 78 00:03:51,070 --> 00:03:54,190 det er ikke mye av interesse der bare nå, husker at teksten 79 00:03:54,190 --> 00:03:59,190 segment, som av mandag, er hvor i minne programmet ender faktisk opp. 80 00:03:59,190 --> 00:04:01,330 Så det er i hvert fall vagt kjent der. 81 00:04:01,330 --> 00:04:03,730 Her er naturligvis en nevne av våre viktigste funksjon. 82 00:04:03,730 --> 00:04:07,220 Bla nedover, disse refererer til ting såkalte registre, svært små biter av 83 00:04:07,220 --> 00:04:09,190 minne innsiden av selve CPU. 84 00:04:09,190 --> 00:04:12,930 Og hvis jeg ruller ned enda videre, ser jeg en slags 85 00:04:12,930 --> 00:04:14,240 indirekte omtale av ASCII. 86 00:04:14,240 --> 00:04:17,120 Og der, ja, det er streng, hallo, komma, verden. 87 00:04:17,120 --> 00:04:20,079 >> Så lang historie kort, dette har vært skjer for deg, automatisk, 88 00:04:20,079 --> 00:04:22,140 under panseret hele denne tiden. 89 00:04:22,140 --> 00:04:26,450 Og hva har skjedd er virkelig en gang du har kjørt Clang, eller i form av 90 00:04:26,450 --> 00:04:29,150 Lag, du får først, fra kildekoden, jo 91 00:04:29,150 --> 00:04:30,700 såkalt assembly. 92 00:04:30,700 --> 00:04:35,210 Deretter Clang er å konvertere denne forsamlingen språk ned til nuller og enere. 93 00:04:35,210 --> 00:04:38,340 Og dette er lysbildet som vi startet vår diskusjon i uke 0 på - 94 00:04:38,340 --> 00:04:39,840 og deretter Uke 1 på. 95 00:04:39,840 --> 00:04:44,030 Og så til slutt, de nuller og enere er kombinert med nuller og enere 96 00:04:44,030 --> 00:04:47,190 fra disse bibliotekene har vi tatt for gitt som standard I / O eller 97 00:04:47,190 --> 00:04:50,010 String Library eller den CS50 biblioteket. 98 00:04:50,010 --> 00:04:54,200 >> Så for å male dette bildet mer visuelt, har vi hello.c. 99 00:04:54,200 --> 00:04:57,220 Og det, selvfølgelig, bruker printf fungere å si, hallo verden. 100 00:04:57,220 --> 00:05:01,810 Sammenstillingen trinnet tar den ned til den filen vi nettopp så hello.s, selv 101 00:05:01,810 --> 00:05:04,290 selv om det er typisk slettet automatisk for deg. 102 00:05:04,290 --> 00:05:06,050 Men det er assemblerkode i midten trinn. 103 00:05:06,050 --> 00:05:09,750 Og så når vi monterer forsamlingen språk, så å si, er at når du 104 00:05:09,750 --> 00:05:10,830 få disse nuller og enere. 105 00:05:10,830 --> 00:05:13,920 Så vi har zoomet inn effektivt i dag på det vi har tatt for gitt, 106 00:05:13,920 --> 00:05:16,430 betyr å gå kildekoden til å protestere kode. 107 00:05:16,430 --> 00:05:18,850 >> Men til slutt, nå som samme bilde - la oss skyve den over til 108 00:05:18,850 --> 00:05:20,020 venstre side. 109 00:05:20,020 --> 00:05:22,880 Og vær oppmerksom på at toppen er det Jeg nevnte stdio.h. 110 00:05:22,880 --> 00:05:25,030 Det er en fil som vi har inkludert i nesten alle av de 111 00:05:25,030 --> 00:05:26,250 programmene vi har skrevet. 112 00:05:26,250 --> 00:05:28,830 Og det er den filen der innholdet få kopi limes, 113 00:05:28,830 --> 00:05:30,350 effektivt toppen koden din. 114 00:05:30,350 --> 00:05:34,170 Men det viser seg at, på en datamaskin systemet et sted, er det antagelig en 115 00:05:34,170 --> 00:05:39,150 stdio.c fil som noen skrev år siden som implementerer all 116 00:05:39,150 --> 00:05:41,870 funksjonene som ble erklært i stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Nå i virkeligheten er det sannsynligvis ikke på Mac-en eller PC-en eller i 118 00:05:45,465 --> 00:05:47,660 CS50 apparatet er en rå C-kode. 119 00:05:47,660 --> 00:05:52,710 Noen allerede samlet det og inkludert . O-fil for objekt-kode eller. En 120 00:05:52,710 --> 00:05:56,020 fil, som refererer til en felles bibliotek som er blitt forhåndsinstallert og 121 00:05:56,020 --> 00:05:57,240 pre-kompilert for deg. 122 00:05:57,240 --> 00:06:01,950 Men anta at det faktisk finnes på vår datamaskin stdio.c parallelt 123 00:06:01,950 --> 00:06:02,650 med Clang. 124 00:06:02,650 --> 00:06:04,960 Koden som blir kompilert og montert. 125 00:06:04,960 --> 00:06:09,200 stdio.c 's koden blir kompilert og montert, slik at dette siste 126 00:06:09,200 --> 00:06:13,730 trinn, her nede, må vi liksom link, så å si, dine nuller og enere 127 00:06:13,730 --> 00:06:18,430 med hans eller hennes nuller og enere i ett enkelt program som til slutt er 128 00:06:18,430 --> 00:06:20,540 kalt bare Hello. 129 00:06:20,540 --> 00:06:23,340 >> Så det er all den magien som er skjedd så langt. 130 00:06:23,340 --> 00:06:26,430 Og vil fortsette å ta disse prosesser for gitt, men innser 131 00:06:26,430 --> 00:06:28,750 det er mye av saftige detaljer skjer under der. 132 00:06:28,750 --> 00:06:31,920 Og dette er det som gjør din datamaskin med Intel inne 133 00:06:31,920 --> 00:06:33,940 spesielt tydelig. 134 00:06:33,940 --> 00:06:37,020 >> Så på dette notatet, hvis du ønsker å bli med oss ​​til lunsj denne fredagen, går 135 00:06:37,020 --> 00:06:41,570 til den vanlige plassen cs50.net/rsvp, 13:15 denne fredagen. 136 00:06:41,570 --> 00:06:43,400 Og nå noen kunngjøringer. 137 00:06:43,400 --> 00:06:44,670 Så vi har noen gode nyheter. 138 00:06:44,670 --> 00:06:45,970 Og vi har noen dårlige nyheter. 139 00:06:45,970 --> 00:06:47,260 Starte med noen gode nyheter her. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Tenker:] 142 00:06:54,510 --> 00:06:54,710 >> OK. 143 00:06:54,710 --> 00:06:56,670 Vel, det er teknisk sett en ferie, så det er ikke så mye en gave fra oss. 144 00:06:56,670 --> 00:06:58,030 Men da de dårlige nyhetene selvfølgelig. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Tenker:] 147 00:07:01,880 --> 00:07:03,530 >> Jeg brukte mye tid på disse animasjonene. 148 00:07:03,530 --> 00:07:04,690 >> [Latter] 149 00:07:04,690 --> 00:07:07,000 >> Det vil bli en gjennomgang session førstkommende mandag. 150 00:07:07,000 --> 00:07:08,340 Det kommer til å være på 05:30. 151 00:07:08,340 --> 00:07:11,210 Vi vil minne deg om alle disse detaljene via e-post på kursets 152 00:07:11,210 --> 00:07:13,470 nettsiden i løpet av et par dager tid. 153 00:07:13,470 --> 00:07:16,610 Det vil bli filmet og gjort tilgjengelig kort tid etterpå. 154 00:07:16,610 --> 00:07:19,200 Så hvis du ikke kan gjøre det mandag natt slot, ikke bekymre deg. 155 00:07:19,200 --> 00:07:22,270 Seksjoner denne kommende uken vil også fokus på vurdering for quiz. 156 00:07:22,270 --> 00:07:25,670 Hvis delen er på mandag, som er faktisk universitet ferie, vil vi 157 00:07:25,670 --> 00:07:26,920 fortsatt møtes i seksjonen. 158 00:07:26,920 --> 00:07:28,890 Hvis du bare ikke kan gjøre det delen fordi du kommer 159 00:07:28,890 --> 00:07:29,860 borte, det er fint. 160 00:07:29,860 --> 00:07:33,710 Delta på en søndag eller tirsdag seksjon eller tune-in til Jasons delen, som er 161 00:07:33,710 --> 00:07:35,110 tilgjengelig på nettet. 162 00:07:35,110 --> 00:07:37,490 >> Så, flere dårlige nyheter. 163 00:07:37,490 --> 00:07:41,960 Så i henhold til pensum, vi har forelesning neste fredag. 164 00:07:41,960 --> 00:07:43,690 Men den gode nyheten - 165 00:07:43,690 --> 00:07:44,860 klart, jeg har brukt for mye tid på dette. 166 00:07:44,860 --> 00:07:45,280 >> [Latter] 167 00:07:45,280 --> 00:07:47,140 >> Vi vil avbryte neste fredag ​​forelesninger. 168 00:07:47,140 --> 00:07:50,590 Så det vil være en gave til oss, slik at du kan virkelig ha en fin frist i 169 00:07:50,590 --> 00:07:52,990 mellom denne uken og to uker frem i tid. 170 00:07:52,990 --> 00:07:57,460 Så ingen forelesninger neste uke, bare en liten liten quiz, som du bør være 171 00:07:57,460 --> 00:07:59,030 får stadig mer spent. 172 00:07:59,030 --> 00:08:03,870 >> Så la oss nå vende oppmerksomheten mot noe som faktisk er mer visuell 173 00:08:03,870 --> 00:08:06,990 og mer spennende, og for å sette scenen for hva som kommer til å være på horisonten 174 00:08:06,990 --> 00:08:08,420 i løpet av et par ukers tid. 175 00:08:08,420 --> 00:08:12,160 Etter den første quiz, vil vi snu fokusere på våre oppgavesett til en annen 176 00:08:12,160 --> 00:08:16,710 domene spesifikt problem, nemlig etterforskning eller sikkerhet mer generelt. 177 00:08:16,710 --> 00:08:19,550 >> Faktisk, tradisjonen med dette problemet sett er for meg en av de 178 00:08:19,550 --> 00:08:24,850 undervisning stipendiat eller CAer å gå over campus å ta noen bilder av 179 00:08:24,850 --> 00:08:29,450 identifiserbare, men ikke åpenbare mennesker, steder, eller ting, deretter hvert år jeg 180 00:08:29,450 --> 00:08:34,520 eller annen måte klarer å ved et uhell sletter eller ødelegge digital media kortet 181 00:08:34,520 --> 00:08:35,720 det er innsiden av kameraet vårt. 182 00:08:35,720 --> 00:08:36,860 Men ingen big deal. 183 00:08:36,860 --> 00:08:39,200 Jeg kan gå videre og koble som inn i datamaskinen min. 184 00:08:39,200 --> 00:08:43,010 Jeg kan lage en rettsmedisinsk bilde av det, så å snakke, ved å kopiere nuller og 185 00:08:43,010 --> 00:08:46,830 de av av at minnekortet, enten sin et SD-kort eller Compact Flash-kort eller 186 00:08:46,830 --> 00:08:48,100 hva du er kjent med. 187 00:08:48,100 --> 00:08:49,300 Og så kan vi overlate den ut. 188 00:08:49,300 --> 00:08:53,190 >> Og så utfordringen fremover, blant annet ting for deg, vil være å skrive 189 00:08:53,190 --> 00:08:58,630 C-kode som gjenoppretter en hel haug med JPEG-bilder for meg og avslørt vil være 190 00:08:58,630 --> 00:09:00,190 disse personer, steder eller ting. 191 00:09:00,190 --> 00:09:03,340 Og vi vil også snakke, i dette problemet satt, og i dagene som kommer, om 192 00:09:03,340 --> 00:09:04,440 Grafikken mer generelt. 193 00:09:04,440 --> 00:09:06,140 Vi har brukt dem, et kurs, for å bryte ut. 194 00:09:06,140 --> 00:09:09,080 Men du har liksom tatt for gitt det finnes disse høye nivå forestillinger 195 00:09:09,080 --> 00:09:10,680 av rektangler og ovaler. 196 00:09:10,680 --> 00:09:12,450 Men under panseret det er piksler. 197 00:09:12,450 --> 00:09:14,370 Og du har måttet starte tenker om dem. 198 00:09:14,370 --> 00:09:18,800 Eller vil du for p-set fire må tenke om gapet mellom mursteinene, hvordan 199 00:09:18,800 --> 00:09:21,990 raskt du ball beveger seg på tvers skjermen for å bryte ut. 200 00:09:21,990 --> 00:09:24,830 Så det er denne forestillingen om den prikker på skjermen som er 201 00:09:24,830 --> 00:09:26,290 kommer inn i bildet allerede. 202 00:09:26,290 --> 00:09:29,430 >> Nå hva du ser, er imidlertid hva du får på en dataskjerm. 203 00:09:29,430 --> 00:09:33,680 Hvis du noen gang har sett noen gode eller dårlig TV, oddsen er de ganske mye 204 00:09:33,680 --> 00:09:36,280 behandle publikum som teknofober som ikke egentlig 205 00:09:36,280 --> 00:09:37,630 vet mye om databehandling. 206 00:09:37,630 --> 00:09:40,840 Og så det er svært enkelt for politiet detektiv å si, kan du 207 00:09:40,840 --> 00:09:41,710 rydde det opp for meg? 208 00:09:41,710 --> 00:09:42,710 Eller forbedre, ikke sant? 209 00:09:42,710 --> 00:09:45,550 Forbedre er som den buzz ordet i de fleste noen forbrytelse relatert show. 210 00:09:45,550 --> 00:09:49,240 Og realiteten er hvis du tar en svært uskarpt bilde av en mistenkt gjøre 211 00:09:49,240 --> 00:09:51,620 noe dårlig, kan du ikke bare forbedre den. 212 00:09:51,620 --> 00:09:53,080 Du kan ikke zoome inn uendelig. 213 00:09:53,080 --> 00:09:56,350 Du kan ikke se i glimt av noens øye som begikk at 214 00:09:56,350 --> 00:09:59,860 Særlig kriminalitet, til tross for Forekomsten av dette på TV. 215 00:09:59,860 --> 00:10:04,110 >> Og så med det la oss motivere at kommende problem satt med et glimt i 216 00:10:04,110 --> 00:10:05,765 noen show som du kan bli kjent. 217 00:10:05,765 --> 00:10:06,500 >> [VIDEOAVSPILLING] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Nå, la oss få en god titt på deg. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Hold det. 222 00:10:17,766 --> 00:10:18,658 Kjør den tilbake. 223 00:10:18,658 --> 00:10:19,550 >> -Vent litt. 224 00:10:19,550 --> 00:10:21,580 Gå rett. 225 00:10:21,580 --> 00:10:21,800 >> -Det. 226 00:10:21,800 --> 00:10:22,690 Fryse det. 227 00:10:22,690 --> 00:10:23,692 >> -Full skjerm. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Fryse det. 230 00:10:24,154 --> 00:10:25,140 >> -Stram opp på det, vil ya? 231 00:10:25,140 --> 00:10:27,090 >> -Vector inn på den fyren av bakhjulet. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom inn her på dette stedet. 233 00:10:29,730 --> 00:10:33,700 >> -Med det rette utstyret, avbildes kan forstørres og skjerpet. 234 00:10:33,700 --> 00:10:34,490 >> -Hva er det? 235 00:10:34,490 --> 00:10:35,870 >> -Det er en forbedring program. 236 00:10:35,870 --> 00:10:36,793 >> -Kan du klare det opp noe? 237 00:10:36,793 --> 00:10:38,560 >> -Jeg vet ikke. 238 00:10:38,560 --> 00:10:39,090 La oss forbedre den. 239 00:10:39,090 --> 00:10:41,690 >> -Forbedre seksjon A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Jeg forbedret detaljer og - 241 00:10:43,510 --> 00:10:44,456 >> -Jeg tror det er nok til å øke. 242 00:10:44,456 --> 00:10:45,402 Slipper den til skjermen min. 243 00:10:45,402 --> 00:10:47,300 >> -Forbedre refleksjonen i øyet hennes. 244 00:10:47,300 --> 00:10:49,330 >> -La oss kjøre dette gjennom video ekstrautstyr. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, kan du forbedre dette? 246 00:10:50,340 --> 00:10:52,320 >> -Vent. 247 00:10:52,320 --> 00:10:54,290 >> -Jeg har jobbet med denne refleksjonen. 248 00:10:54,290 --> 00:10:55,560 >> -Noens refleksjon. 249 00:10:55,560 --> 00:10:56,440 >> -Refleksjon. 250 00:10:56,440 --> 00:10:57,940 >> -Det er en refleksjon av mannens ansikt. 251 00:10:57,940 --> 00:10:58,860 >> -The refleksjon. 252 00:10:58,860 --> 00:10:59,710 >> -Det er en refleksjon. 253 00:10:59,710 --> 00:11:00,900 >> -Zoom inn på speilet. 254 00:11:00,900 --> 00:11:03,500 >> Du kan se en refleksjon. 255 00:11:03,500 --> 00:11:04,700 >> -Kan du forbedre bildet herfra? 256 00:11:04,700 --> 00:11:05,700 >> -Kan du forbedre ham akkurat her? 257 00:11:05,700 --> 00:11:06,500 >> -Kan du forbedre den? 258 00:11:06,500 --> 00:11:07,380 >> -Kan du forbedre den? 259 00:11:07,380 --> 00:11:08,190 >> -Kan vi forbedre dette? 260 00:11:08,190 --> 00:11:08,940 >> -Kan du forbedre den? 261 00:11:08,940 --> 00:11:10,280 >> -Vent litt, jeg skal forbedre. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom inn på døren. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Latter] 266 00:11:13,197 --> 00:11:14,360 >> -Flytt i. 267 00:11:14,360 --> 00:11:15,100 >> -Vent, stopp. 268 00:11:15,100 --> 00:11:15,740 >> -Stopp. 269 00:11:15,740 --> 00:11:16,290 >> -Pause det. 270 00:11:16,290 --> 00:11:19,390 >> -Roter en 75 grader rundt den vertikale behage. 271 00:11:19,390 --> 00:11:19,886 >> [Latter] 272 00:11:19,886 --> 00:11:24,350 >> -Stopp, og tilbake til den delen om døren igjen. 273 00:11:24,350 --> 00:11:26,330 >> -Fikk et bilde Enhancer som kan punktgrafikk? 274 00:11:26,330 --> 00:11:28,990 >> -Kanskje vi kan bruke Pradeep Sen metode for å se inn vinduene. 275 00:11:28,990 --> 00:11:30,680 >> -Denne programvaren er state of the art. 276 00:11:30,680 --> 00:11:31,676 >> -Ikonet verdi er av. 277 00:11:31,676 --> 00:11:34,166 >> -Med den rette kombinasjonen av algoritmer. 278 00:11:34,166 --> 00:11:38,399 >> -Han har tatt belysning algoritmer for å neste nivå, og jeg kan bruke dem til å 279 00:11:38,399 --> 00:11:38,648 forsterke dette bildet. 280 00:11:38,648 --> 00:11:42,050 >> -Lås på og forstørre z-aksen. 281 00:11:42,050 --> 00:11:42,760 >> -Forbedre. 282 00:11:42,760 --> 00:11:43,060 >> -Forbedre. 283 00:11:43,060 --> 00:11:43,760 >> -Forbedre. 284 00:11:43,760 --> 00:11:45,010 >> -Fryse og forbedre. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END VIDEOAVSPILLING] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. MALAN: Så Problem Set 5 er hva som ligger foran der. 288 00:11:51,470 --> 00:11:55,260 Så vi vil snart få en bedre forståelse av når og hvorfor du kan 289 00:11:55,260 --> 00:11:57,300 og vår ikke kan forbedre på den måten. 290 00:11:57,300 --> 00:12:00,090 Men først, la oss gå tilbake vår oppmerksomhet til noen av de byggesteinene vi vil 291 00:12:00,090 --> 00:12:02,250 må være i stand til å fortelle denne historien. 292 00:12:02,250 --> 00:12:05,580 >> Så husker at vi trakk dette bildet på Mandag og litt forrige uke. 293 00:12:05,580 --> 00:12:09,970 Og dette beskriver oppsettet av ting i datamaskinens minne når 294 00:12:09,970 --> 00:12:11,000 kjører noen program. 295 00:12:11,000 --> 00:12:14,310 Den tech segment opp toppen, tilbakekalling, henviser til selve nuller og enere 296 00:12:14,310 --> 00:12:16,000 som komponerer programmet. 297 00:12:16,000 --> 00:12:19,340 Det er, under det, noen initialisert eller uinitialiserte data, som typisk 298 00:12:19,340 --> 00:12:22,910 refererer til ting som konstanter eller strenger eller globale variabler som har 299 00:12:22,910 --> 00:12:24,200 blitt erklært på forhånd. 300 00:12:24,200 --> 00:12:26,500 Det er haugen, men vi vil komme tilbake til den i en bit. 301 00:12:26,500 --> 00:12:27,410 >> Og så er det stabelen. 302 00:12:27,410 --> 00:12:30,660 Mye som en stabel med magasiner i kafeteria, dette er hvor minnet blir 303 00:12:30,660 --> 00:12:33,610 lagdelt og lagvis når du gjør det i et program? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Hva er bunken bruk for? 306 00:12:37,730 --> 00:12:39,320 >> Yeah? 307 00:12:39,320 --> 00:12:40,000 >> Call of funksjon. 308 00:12:40,000 --> 00:12:42,890 Hver gang du kalle en funksjon, er det gitt til flis av minnet for sin 309 00:12:42,890 --> 00:12:45,020 lokale variabler eller dets parametre. 310 00:12:45,020 --> 00:12:48,810 Og billedlig, ser vi at med hver suksessiv funksjon kalles, når A 311 00:12:48,810 --> 00:12:52,520 samtaler B syner C syner D, de bli lagvis på bunken. 312 00:12:52,520 --> 00:12:55,630 Og innenfor hver av disse skiver minne er egentlig et unikt omfang 313 00:12:55,630 --> 00:12:58,590 for denne funksjon, som selvsagt er problematisk hvis du ønsker å levere 314 00:12:58,590 --> 00:13:01,850 fra en funksjon til en annen Et stykke av data som du vil ha det 315 00:13:01,850 --> 00:13:03,500 å mutere eller endre. 316 00:13:03,500 --> 00:13:08,060 >> Så hva var vår løsning for å aktivere En funksjon representert ved en stabel 317 00:13:08,060 --> 00:13:11,390 ramme for å endre minnet inne av en annen stack ramme? 318 00:13:11,390 --> 00:13:14,590 Hvordan disse to snakke med hverandre? 319 00:13:14,590 --> 00:13:18,510 Så ved hjelp av pekere eller adresser, som, igjen, bare beskrive hvor i 320 00:13:18,510 --> 00:13:22,280 hukommelse, i form av en spesifikk bit nummer, den bestemte 321 00:13:22,280 --> 00:13:23,830 verdi kan bli funnet. 322 00:13:23,830 --> 00:13:26,860 Så husker sist også vi fortsatte historien og så på en 323 00:13:26,860 --> 00:13:28,280 ganske buggy program. 324 00:13:28,280 --> 00:13:32,900 Og dette programmet er buggy for noen grunner, men den mest bekymringsfulle er ett 325 00:13:32,900 --> 00:13:34,620 fordi den ikke klarer å kontrollere hva? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ja, ikke det å kontrollere kilden. 328 00:13:40,450 --> 00:13:41,870 Sorry? 329 00:13:41,870 --> 00:13:43,880 >> Hvis det er mer enn 12 tegn. 330 00:13:43,880 --> 00:13:47,260 Så veldig smart, når du ringer memcopy, som, som navnet antyder, bare 331 00:13:47,260 --> 00:13:50,630 kopier minne fra sin andre argument inn i sin første argumentet. 332 00:13:50,630 --> 00:13:54,730 Det tredje argumentet, veldig smart, er kontrolleres for å forsikre deg om at du ikke 333 00:13:54,730 --> 00:13:59,400 kopiere mer enn, i dette tilfellet lengden av bar, antall tegn, 334 00:13:59,400 --> 00:14:03,810 inn i målet, er der denne matrise C. Men problemet er at det 335 00:14:03,810 --> 00:14:07,230 hvis C i seg selv er ikke stor nok å håndtere det? 336 00:14:07,230 --> 00:14:09,900 Du kommer til å kopiere antallet bytes som du har fått. 337 00:14:09,900 --> 00:14:13,040 Men hva gjør du egentlig har mer bytes enn du har plass til? 338 00:14:13,040 --> 00:14:16,770 >> Vel, dette programmet veldig tåpelig bare blindt fortsetter å ta hva det er 339 00:14:16,770 --> 00:14:20,650 gitt, er hallo backslash 0 flott hvis strengen er kort 340 00:14:20,650 --> 00:14:22,040 nok, som fem tegn. 341 00:14:22,040 --> 00:14:26,470 Men hvis det er faktisk 12 tegn eller 1200 tegn, så vi forrige gang 342 00:14:26,470 --> 00:14:29,380 at du bare kommer til helt overskrive minnet som 343 00:14:29,380 --> 00:14:30,470 ikke tilhører deg. 344 00:14:30,470 --> 00:14:34,390 Og verste fall, hvis du overskrive røde delen der som vi kalte 345 00:14:34,390 --> 00:14:35,380 returadresse - 346 00:14:35,380 --> 00:14:38,370 Dette er nettopp der datamaskinen automatisk, for deg, bak 347 00:14:38,370 --> 00:14:43,130 scener, tucks unna en 32-bits verdi som minner det til hvilken adresse det skal 348 00:14:43,130 --> 00:14:47,080 tilbake når foo, denne annen funksjon, gjøres utføring. 349 00:14:47,080 --> 00:14:49,320 Det er et brød smule av sorterer til hvilken den returnerer. 350 00:14:49,320 --> 00:14:52,490 Hvis du overskriver at det potensielt hvis du er skurken, kan kunne 351 00:14:52,490 --> 00:14:54,750 potensielt ta over noens datamaskin. 352 00:14:54,750 --> 00:14:58,020 Og du vil ganske sikkert krasjer den i de fleste tilfeller. 353 00:14:58,020 --> 00:15:01,690 >> Nå er dette problemet ble bare forverret så vi begynte å snakke om hukommelse 354 00:15:01,690 --> 00:15:03,010 forvaltning mer generelt. 355 00:15:03,010 --> 00:15:07,150 Og malloc, for hukommelse tildeling, er en funksjon som vi kan bruke til å tildele 356 00:15:07,150 --> 00:15:11,260 minne når vi ikke vet på forhånd at vi kanskje trenger noen. 357 00:15:11,260 --> 00:15:13,960 Så, for eksempel, hvis jeg går tilbake til apparatet her. 358 00:15:13,960 --> 00:15:21,010 Og jeg åpner opp fra forrige gang hello2.c, husker dette programmet her, som så 359 00:15:21,010 --> 00:15:23,500 litt noe sånt som dette, bare tre linjer - 360 00:15:23,500 --> 00:15:27,940 oppgi navn, deretter string navn, til venstre, lik getstring. 361 00:15:27,940 --> 00:15:29,690 Og da vi skrive den ut, brukerens navn. 362 00:15:29,690 --> 00:15:31,170 >> Så dette var en super enkelt program. 363 00:15:31,170 --> 00:15:34,870 Å være klar, la meg gå videre og gjøre hallo-2. 364 00:15:34,870 --> 00:15:36,680 Jeg kommer til å gjøre dot slash hallo-2. 365 00:15:36,680 --> 00:15:37,750 Oppgi navn - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Hei David. 369 00:15:39,540 --> 00:15:41,060 Det ser ut til å fungere OK. 370 00:15:41,060 --> 00:15:43,140 Men hva som egentlig skjer under panseret her? 371 00:15:43,140 --> 00:15:44,670 Først la oss skrelle tilbake noen lag. 372 00:15:44,670 --> 00:15:48,380 String er bare et synonym vi har realisert for hva? 373 00:15:48,380 --> 00:15:49,110 Char stjerne. 374 00:15:49,110 --> 00:15:52,740 Så la oss gjøre det litt mer uforståelige men mer teknisk korrekt at dette 375 00:15:52,740 --> 00:15:55,570 er en char stjerne, som betyr at navn, ja, er en variabel. 376 00:15:55,570 --> 00:15:59,920 Men hva navn butikker er adressen til en røye, som føles litt rart 377 00:15:59,920 --> 00:16:01,050 fordi jeg får tilbake en streng. 378 00:16:01,050 --> 00:16:03,580 Jeg får tilbake flere chars ikke en røye. 379 00:16:03,580 --> 00:16:07,400 >> Men selvfølgelig, trenger du bare den første røye adresse å huske hvor 380 00:16:07,400 --> 00:16:08,870 Hele streng er fordi hvorfor? 381 00:16:08,870 --> 00:16:12,700 Hvordan finne du ut hvor enden av strengen er å vite i begynnelsen? 382 00:16:12,700 --> 00:16:13,630 Den omvendte skråstreken null. 383 00:16:13,630 --> 00:16:17,260 Så med disse to ledetråder du regne ut før begynnelsen og slutten av 384 00:16:17,260 --> 00:16:20,280 noen streng er, så lenge de er skikkelig dannet med at null 385 00:16:20,280 --> 00:16:22,110 terminator, som backslash null. 386 00:16:22,110 --> 00:16:24,520 >> Men dette er ringer getstring. 387 00:16:24,520 --> 00:16:28,020 Og det viser seg at getstring hele denne tiden har vært litt 388 00:16:28,020 --> 00:16:28,820 juks for oss. 389 00:16:28,820 --> 00:16:32,460 Det har gjort dette arbeidskraft, for å være sikker, får en streng fra brukeren. 390 00:16:32,460 --> 00:16:34,580 Men hvor er det minne kommet fra? 391 00:16:34,580 --> 00:16:38,440 Hvis vi går tilbake til bildet her og gjelder definisjonen fra bare en 392 00:16:38,440 --> 00:16:42,610 øyeblikk siden, at bunken er der minnet går når funksjonene kalles, 393 00:16:42,610 --> 00:16:45,370 den logikken, når du ringer getstring, og da jeg skriver i 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Enter, der er D-A-V-I-D skråstrek null lagres, utgangspunkt i 395 00:16:50,900 --> 00:16:53,480 historie vi har fortalt oss langt? 396 00:16:53,480 --> 00:16:55,190 >> Det synes å være i bunken, ikke sant? 397 00:16:55,190 --> 00:16:58,120 Når du ringer får streng du får en lite stykke minne på stakken. 398 00:16:58,120 --> 00:17:01,630 Så det står til grunn at D-A-V-I-D backslash null lagres 399 00:17:01,630 --> 00:17:02,770 der i bunken. 400 00:17:02,770 --> 00:17:07,680 Men vent litt, getstring avkastning strengen, så å si, som betyr 401 00:17:07,680 --> 00:17:11,700 det er skuffen fra kantina er tatt av stabelen. 402 00:17:11,700 --> 00:17:14,560 Og vi sa sist gang at så snart en funksjonen returnerer, og du tar det 403 00:17:14,560 --> 00:17:20,109 skuffen, så å si, av stabelen, hva kan du anta om restene av 404 00:17:20,109 --> 00:17:21,819 som minne? 405 00:17:21,819 --> 00:17:25,160 Jeg slags redrew dem som spørsmålstegn fordi de effektivt blir 406 00:17:25,160 --> 00:17:26,250 ukjente verdier. 407 00:17:26,250 --> 00:17:29,500 De kan gjenbrukes når noen neste funksjonen kalles. 408 00:17:29,500 --> 00:17:31,870 >> Med andre ord, hvis vi tilfeldigvis å være lagring - 409 00:17:31,870 --> 00:17:34,350 Jeg skal tegne et raskt bilde her av stabelen. 410 00:17:34,350 --> 00:17:38,690 Hvis vi måtte være tegning bunnen av min hukommelse segment, og vi vil si 411 00:17:38,690 --> 00:17:42,230 at dette er stedet for minne okkupert av hoved-og kanskje arg c og 412 00:17:42,230 --> 00:17:46,790 arg v og alt annet i programmet, når getstring kalles, 413 00:17:46,790 --> 00:17:51,120 formodentlig getstring får en del av minnet her. 414 00:17:51,120 --> 00:17:53,940 Og deretter D-A-V-I-D liksom ender opp i denne funksjonen. 415 00:17:53,940 --> 00:17:55,320 Og jeg kommer til å overforenkle. 416 00:17:55,320 --> 00:18:00,050 Men la oss anta at D-A-V-I-D backslash null. 417 00:18:00,050 --> 00:18:03,500 Så dette mange byte brukes i rammen for getstring. 418 00:18:03,500 --> 00:18:08,270 >> Men så snart getstring avkastning, vi sa sist gang at dette minnet i løpet 419 00:18:08,270 --> 00:18:11,340 her hele blir - woops! - 420 00:18:11,340 --> 00:18:14,270 alt blir effektivt slettet. 421 00:18:14,270 --> 00:18:17,220 Og vi kan tenke på dette nå som spørsmålet karakterer fordi hvem vet 422 00:18:17,220 --> 00:18:18,720 hva kommer til å bli av dette minnet. 423 00:18:18,720 --> 00:18:22,130 Faktisk, jeg veldig ofte kaller funksjoner annet enn getstring. 424 00:18:22,130 --> 00:18:24,750 Og så snart jeg ringe noen andre funksjon enn getstring, kanskje ikke i 425 00:18:24,750 --> 00:18:28,860 dette programmet vi har nettopp sett på, men noen andre, sikkert noen andre 426 00:18:28,860 --> 00:18:34,180 Funksjonen kan ende opp med å bli gitt dette neste sted i bunken. 427 00:18:34,180 --> 00:18:39,410 >> Så det kan være at getstring butikker D-A-V-I-D på stabelen fordi jeg ville 428 00:18:39,410 --> 00:18:41,040 umiddelbart miste tilgang til den. 429 00:18:41,040 --> 00:18:43,720 Men vi vet at de getstring returnerer bare hva? 430 00:18:43,720 --> 00:18:47,220 Det er ikke tilbake til meg seks tegn. 431 00:18:47,220 --> 00:18:51,090 Hva er det virkelig tilbake gjorde vi konkludere siste gang? 432 00:18:51,090 --> 00:18:52,480 Adressen til den første. 433 00:18:52,480 --> 00:18:56,650 Så en eller annen måte, når du ringte getstring, det er tildeling av en del av minnet for 434 00:18:56,650 --> 00:18:59,620 strengen at brukerne skriver og deretter returnere adressen til det. 435 00:18:59,620 --> 00:19:02,930 Og det viser seg at når du ønsker å fungere å allokere minne i denne 436 00:19:02,930 --> 00:19:08,390 måte og gå tilbake til personen som ringte at funksjon, adressen 437 00:19:08,390 --> 00:19:11,870 som del av minnet, absolutt du kan ikke sette den i bunken på 438 00:19:11,870 --> 00:19:14,750 bunn, fordi funksjonelt er det bare skal ikke bli din veldig 439 00:19:14,750 --> 00:19:17,800 raskt, så du kan sikkert gjette hvor vi sannsynligvis kommer til å kaste den 440 00:19:17,800 --> 00:19:20,130 stedet, den såkalte haug. 441 00:19:20,130 --> 00:19:25,290 >> Så mellom bunnen av hukommelsen sin layout og toppen av hukommelsen sin 442 00:19:25,290 --> 00:19:26,820 layout er en hel haug med segmenter. 443 00:19:26,820 --> 00:19:29,270 Den ene er stabelen, og rett ovenfor er det haugen. 444 00:19:29,270 --> 00:19:33,680 Og heap er bare en annen del av minne som ikke brukes for funksjoner 445 00:19:33,680 --> 00:19:34,770 når de blir kalt. 446 00:19:34,770 --> 00:19:38,100 Det er brukt for lengre sikt minne, når du vil ha en funksjon for å hente noen 447 00:19:38,100 --> 00:19:42,700 minne og være i stand til å henge på den uten å miste kontroll over det. 448 00:19:42,700 --> 00:19:45,550 >> Nå kan du kanskje umiddelbart se at dette ikke er 449 00:19:45,550 --> 00:19:48,060 nødvendigvis en perfekt design. 450 00:19:48,060 --> 00:19:51,350 Som programmet tildelte minnet på bunken, eller som du kaller mer og 451 00:19:51,350 --> 00:19:55,540 flere funksjoner, eller som du tildele minne på haugen med malloc av som 452 00:19:55,540 --> 00:20:00,690 getstring gjør, hva klart synes å være uunngåelig problem? 453 00:20:00,690 --> 00:20:00,860 >> Høyre. 454 00:20:00,860 --> 00:20:03,150 Liker det faktum at disse pilene peker mot hverandre 455 00:20:03,150 --> 00:20:04,380 lover ikke godt. 456 00:20:04,380 --> 00:20:08,630 Og ja, vi kunne svært raskt krasje et program i en rekke måter. 457 00:20:08,630 --> 00:20:12,050 Faktisk tror jeg vi kan ha gjort dette ved et uhell en gang. 458 00:20:12,050 --> 00:20:14,020 Eller hvis ikke, la oss gjøre det bevisst nå. 459 00:20:14,020 --> 00:20:21,330 La meg gå videre og skrive super raskt et program som heter dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Og nå skal jeg gå inn her og ikke skarp inkluderer stdio.h. 461 00:20:26,730 --> 00:20:32,620 La oss erklære funksjon foo tar ingen argumenter, som er 462 00:20:32,620 --> 00:20:34,040 betegnes som godt av tomrommet. 463 00:20:34,040 --> 00:20:37,830 >> Og det eneste foo kommer til å gjøre er samtale foo, som trolig ikke er den 464 00:20:37,830 --> 00:20:39,100 smarteste ideen, men så bli det. 465 00:20:39,100 --> 00:20:40,490 Ent viktigste ugyldig. 466 00:20:40,490 --> 00:20:45,270 Nå er den eneste tingen viktigste kommer å gjøre er å ringe foo også. 467 00:20:45,270 --> 00:20:51,050 Og bare for morro skyld, jeg kommer til å gå fremover her og si printf "Hello from 468 00:20:51,050 --> 00:20:52,340 foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Så hvis jeg ikke gjør noen feil, Gjør dontdothis dot slash. 471 00:21:00,160 --> 00:21:01,960 Og la oss gjøre det i et større vindu - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Kom igjen. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Angivelig, kan du gjøre dette. 478 00:21:13,100 --> 00:21:15,190 Pokker. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Vent. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Har vi - 483 00:21:18,270 --> 00:21:20,110 Vi brukte det med Gjør. 484 00:21:20,110 --> 00:21:22,050 >> [Sukk] 485 00:21:22,050 --> 00:21:25,110 >> Jeg vet, men jeg tror vi bare slettet det. 486 00:21:25,110 --> 00:21:28,410 Uh, ja. 487 00:21:28,410 --> 00:21:30,660 Pokker. 488 00:21:30,660 --> 00:21:32,640 Løs dette Rob. 489 00:21:32,640 --> 00:21:34,678 Hva? 490 00:21:34,678 --> 00:21:35,928 Det er veldig enkelt. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ja, snudde vi optimalisering av. 493 00:21:47,360 --> 00:21:48,970 OK, stå bye. 494 00:21:48,970 --> 00:21:49,950 Nå føler jeg meg bedre. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 OK. 497 00:21:51,780 --> 00:21:53,430 >> Så la oss rekompilere denne - 498 00:21:53,430 --> 00:21:55,880 Gjør du dontdothis. 499 00:21:55,880 --> 00:22:00,090 Du må kanskje endre navn på denne til dothis.c på bare et øyeblikk. 500 00:22:00,090 --> 00:22:00,710 Det vi går. 501 00:22:00,710 --> 00:22:01,240 Takk. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Så det faktum at jeg var utskrift noe ut var faktisk bare 504 00:22:05,480 --> 00:22:08,150 sakker den prosessen som vi ville ha nådd det punktet. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Phew! 507 00:22:08,870 --> 00:22:11,180 >> Så hva som faktisk skjer? 508 00:22:11,180 --> 00:22:14,440 Grunnen til at det, akkurat som en side, er gjør noe i form av innspill og 509 00:22:14,440 --> 00:22:17,270 utgang tendens til å bli tregere fordi du må skrive tegn til 510 00:22:17,270 --> 00:22:18,600 skjermen, har det å rulle. 511 00:22:18,600 --> 00:22:21,720 Så lang historie kort, jeg hadde faktisk skjedd så utålmodig, ville vi ha 512 00:22:21,720 --> 00:22:23,260 sett dette sluttresultat også. 513 00:22:23,260 --> 00:22:26,220 Nå som jeg fikk ri av print-ups, vi ser det med en gang. 514 00:22:26,220 --> 00:22:28,410 Så hvorfor skjer dette. 515 00:22:28,410 --> 00:22:31,300 Vel, den enkle forklaringen selvsagt er at foo sannsynligvis burde ikke 516 00:22:31,300 --> 00:22:32,500 være å kalle seg selv. 517 00:22:32,500 --> 00:22:34,470 >> Nå i generelle termer, dette er rekursjon. 518 00:22:34,470 --> 00:22:36,970 Og vi tenkte et par uker siden rekursiv er bra. 519 00:22:36,970 --> 00:22:40,330 Rekursjon er denne magiske måten uttrykke deg super konsist. 520 00:22:40,330 --> 00:22:41,400 Og det bare virker. 521 00:22:41,400 --> 00:22:45,060 Men det er en viktig funksjon i alle de rekursive programmer vi har snakket 522 00:22:45,060 --> 00:22:48,260 om og sett på hittil, som var at de hadde det? 523 00:22:48,260 --> 00:22:52,610 En base tilfellet, som var noen hardkodet sak at nevnte i enkelte situasjoner 524 00:22:52,610 --> 00:22:56,210 kaller ikke foo, som er klart ikke tilfelle her. 525 00:22:56,210 --> 00:22:58,920 >> Så hva som egentlig skjer i forhold til dette bilde? 526 00:22:58,920 --> 00:23:01,790 Vel, når main kaller foo, det får en bit av minne. 527 00:23:01,790 --> 00:23:04,150 Når foo kaller foo, det blir en bit av minne. 528 00:23:04,150 --> 00:23:06,430 Når foo kaller foo, det blir en skive. 529 00:23:06,430 --> 00:23:07,080 Det blir en skive. 530 00:23:07,080 --> 00:23:08,120 Det blir en skive. 531 00:23:08,120 --> 00:23:09,460 Fordi foo aldri tilbake. 532 00:23:09,460 --> 00:23:12,160 Vi kommer aldri slette en av dem rammer fra bunken. 533 00:23:12,160 --> 00:23:15,930 Så vi blåser gjennom haugen, ikke å nevne hvem vet hva annet, og 534 00:23:15,930 --> 00:23:19,600 vi overskridelser grensene for vår så-kalt segment av hukommelse. 535 00:23:19,600 --> 00:23:21,790 Feil gå segmentering falsk. 536 00:23:21,790 --> 00:23:24,110 >> Så løsningen er det tydelig ikke gjør dette. 537 00:23:24,110 --> 00:23:28,830 Men jo større implikasjon er at, ja, det er absolutt en grense, 538 00:23:28,830 --> 00:23:32,470 selv om det ikke er godt definert, med hensyn til hvordan mange funksjoner du kan ringe i en 539 00:23:32,470 --> 00:23:34,970 program, hvor mange ganger en funksjon kan kalle seg. 540 00:23:34,970 --> 00:23:38,430 Så selv om vi forkynte rekursjon da dette potensielt magisk ting en 541 00:23:38,430 --> 00:23:41,870 par uker siden for sigma funksjon, og når vi får data 542 00:23:41,870 --> 00:23:45,270 strukturer og CS50, vil du se andre applikasjoner for det, er det ikke 543 00:23:45,270 --> 00:23:46,500 nødvendigvis det beste. 544 00:23:46,500 --> 00:23:50,070 Fordi hvis en funksjon kaller seg, kaller seg, selv om det er en base 545 00:23:50,070 --> 00:23:54,860 tilfelle, hvis du ikke treffer som base case for 1000 anrop eller 10.000 anrop, ved å 546 00:23:54,860 --> 00:23:58,800 den tiden du kan ha kjørt ut av rommet på såkalte stack og hit 547 00:23:58,800 --> 00:24:00,400 noen andre deler av minnet. 548 00:24:00,400 --> 00:24:03,950 Så det er for et design trade-off mellom eleganse og mellom 549 00:24:03,950 --> 00:24:06,920 robusthet av din spesielle gjennomføring. 550 00:24:06,920 --> 00:24:10,780 >> Så det er en annen ulempe eller en annen fikser til hva vi har 551 00:24:10,780 --> 00:24:11,720 gjort så langt. 552 00:24:11,720 --> 00:24:12,980 Når jeg ringte getstring - 553 00:24:12,980 --> 00:24:15,120 la meg gå tilbake til hei-2. 554 00:24:15,120 --> 00:24:18,170 Legg merke til at jeg ringer getstring, som blir tilbake en adresse. 555 00:24:18,170 --> 00:24:20,730 Og vi hevder i dag at adresse er fra haugen. 556 00:24:20,730 --> 00:24:24,480 Og nå er jeg skrive ut string på denne adressen. 557 00:24:24,480 --> 00:24:27,000 Men vi har aldri kalt motsatte av getstring. 558 00:24:27,000 --> 00:24:30,850 Vi har aldri hatt å calll en funksjon som ungetstring, hvor du leverer tilbake 559 00:24:30,850 --> 00:24:31,610 dette minnet. 560 00:24:31,610 --> 00:24:33,250 Men ærlig vi trolig skulle ha vært. 561 00:24:33,250 --> 00:24:37,390 Fordi hvis vi fortsette å spørre datamaskinen for hukommelse, i form av en som 562 00:24:37,390 --> 00:24:40,830 getstring men aldri gi den tilbake, sikkert som er for bundet til å føre til 563 00:24:40,830 --> 00:24:42,970 problemer der vi går tom for minne. 564 00:24:42,970 --> 00:24:46,140 >> Og faktisk, kan vi se etter disse problemer med det nye verktøyet hvis bruken 565 00:24:46,140 --> 00:24:47,640 er litt kryptisk å skrive. 566 00:24:47,640 --> 00:24:50,960 Men la meg gå videre og sprute det opp på skjermen i løpet av et øyeblikk. 567 00:24:50,960 --> 00:24:56,940 Jeg kommer til å gå videre og kjøre Valgrind med parameter som første kommando 568 00:24:56,940 --> 00:25:00,260 -argumentet er navnet av programmet hallo-2. 569 00:25:00,260 --> 00:25:02,650 Og dessverre er det produksjonen er atrociously 570 00:25:02,650 --> 00:25:04,290 komplisert for ingen god grunn. 571 00:25:04,290 --> 00:25:06,280 Så vi ser alt det rotet. 572 00:25:06,280 --> 00:25:07,530 David er oppgi navnet mitt. 573 00:25:07,530 --> 00:25:09,760 Så det er programmet faktisk kjører. 574 00:25:09,760 --> 00:25:11,180 Og nå får vi denne utgangen. 575 00:25:11,180 --> 00:25:13,400 >> Så Valgrind er lik i ånden til GDB. 576 00:25:13,400 --> 00:25:14,950 Det er ikke en debugger per se. 577 00:25:14,950 --> 00:25:16,270 Men det er et minne brikke. 578 00:25:16,270 --> 00:25:20,140 Det er et program som vil kjøre programmere og fortelle deg om du spurte en 579 00:25:20,140 --> 00:25:23,860 datamaskin for hukommelse og aldri ga den tilbake, og dermed noe som betyr at du har 580 00:25:23,860 --> 00:25:24,570 en minnelekkasje. 581 00:25:24,570 --> 00:25:26,240 Og minnelekkasjer tendens til å være dårlig. 582 00:25:26,240 --> 00:25:29,120 Og du er brukere av datamaskiner har sannsynligvis følt dette, om du har en 583 00:25:29,120 --> 00:25:30,300 Mac eller en PC. 584 00:25:30,300 --> 00:25:33,730 Har du noen gang brukt datamaskinen for mens og ikke startet på nytt i flere 585 00:25:33,730 --> 00:25:36,820 dager, eller du nettopp har fått en mye programmer som kjører, og den jævla ting 586 00:25:36,820 --> 00:25:42,360 bremser til en sliping stoppe, eller i det minste det er super irriterende å bruke, fordi 587 00:25:42,360 --> 00:25:44,350 alt bare fikk super slow. 588 00:25:44,350 --> 00:25:46,260 >> Nå som kan være en rekke årsaker. 589 00:25:46,260 --> 00:25:49,600 Det kan være en uendelig loop, en bug i noens kode, eller ganske enkelt, det 590 00:25:49,600 --> 00:25:53,250 kan bety at du bruker mer minne, eller prøver å, enn din 591 00:25:53,250 --> 00:25:54,920 Datamaskinen har faktisk. 592 00:25:54,920 --> 00:25:57,770 Og kanskje det er en bug i noen program at holde ber om minne. 593 00:25:57,770 --> 00:26:02,480 Nettlesere for årene var beryktet for dette, ber om mer og mer minne 594 00:26:02,480 --> 00:26:03,870 men aldri levere det tilbake. 595 00:26:03,870 --> 00:26:07,220 Sikkert, hvis du bare har en begrenset mye minne, kan du ikke be 596 00:26:07,220 --> 00:26:09,990 uendelig mange ganger for noe av det minnet. 597 00:26:09,990 --> 00:26:13,070 >> Og så det du ser her, selv om igjen Valgrind produksjon er 598 00:26:13,070 --> 00:26:17,490 unødvendig komplisert å titte på først, dette er den interessante delen. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 i bruk ved avkjørsel. 601 00:26:20,060 --> 00:26:22,810 Så her er hvor mye minne var i bruk i haug på 602 00:26:22,810 --> 00:26:24,300 min tid program gått ut - 603 00:26:24,300 --> 00:26:27,280 tilsynelatende seks bytes i en blokk. 604 00:26:27,280 --> 00:26:28,710 Så jeg kommer til å vinke hendene mine på hva en blokk. 605 00:26:28,710 --> 00:26:31,270 Tenk på det er bare en blings, en mer teknisk ord for blings. 606 00:26:31,270 --> 00:26:33,140 Men seks bytes - 607 00:26:33,140 --> 00:26:36,870 hva som er de seks byte som var fortsatt i bruk? 608 00:26:36,870 --> 00:26:37,390 >> Nettopp. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D null skråstrek, fem bokstav navn pluss null terminator. 610 00:26:41,520 --> 00:26:46,350 Så dette programmet Valgrind merke til at jeg ba om seks bytes, tilsynelatende, etter 611 00:26:46,350 --> 00:26:48,950 måte getstring, men aldri ga dem tilbake. 612 00:26:48,950 --> 00:26:52,030 Og faktisk, dette kan ikke være så tydelig hvis mitt program er ikke tre 613 00:26:52,030 --> 00:26:53,590 linjer, men det er 300 linjer. 614 00:26:53,590 --> 00:26:56,920 Så vi kan faktisk gi en annen kommando -argumentet til Valgrind til 615 00:26:56,920 --> 00:26:58,290 gjøre det mer ordrik. 616 00:26:58,290 --> 00:26:59,760 Det er litt irriterende å huske. 617 00:26:59,760 --> 00:27:01,580 Men hvis jeg gjør - 618 00:27:01,580 --> 00:27:01,930 la oss se. 619 00:27:01,930 --> 00:27:03,540 Lekke - 620 00:27:03,540 --> 00:27:05,030 Ble det lekke - 621 00:27:05,030 --> 00:27:07,580 selv jeg ikke husker hva det er av hånden. 622 00:27:07,580 --> 00:27:08,550 >> - Lekkasje-sjekk tilsvarer full. 623 00:27:08,550 --> 00:27:10,180 Jepp, takk. 624 00:27:10,180 --> 00:27:12,520 - Lekkasje-sjekk tilsvarer full. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Samme programmet kjører. 627 00:27:14,940 --> 00:27:16,180 Skriver i David igjen. 628 00:27:16,180 --> 00:27:17,660 Nå ser jeg litt mer detalj. 629 00:27:17,660 --> 00:27:20,890 Men under haugen sammendraget, hvilken er identisk med fire - ah, 630 00:27:20,890 --> 00:27:22,120 dette er slags hyggelig. 631 00:27:22,120 --> 00:27:25,460 Nå Valgrind faktisk ser litt hardere i koden min. 632 00:27:25,460 --> 00:27:29,580 Og det er å si det, tilsynelatende, malloc på line - 633 00:27:29,580 --> 00:27:30,580 vi zoome ut. 634 00:27:30,580 --> 00:27:31,980 På line - 635 00:27:31,980 --> 00:27:32,930 vi ikke ser hvilken linje det er. 636 00:27:32,930 --> 00:27:35,110 Men malloc er den første skyldige. 637 00:27:35,110 --> 00:27:38,630 Det er en blogg i malloc. 638 00:27:38,630 --> 00:27:39,810 >> Greit? 639 00:27:39,810 --> 00:27:40,450 OK, nei. 640 00:27:40,450 --> 00:27:40,940 Høyre? 641 00:27:40,940 --> 00:27:42,520 Jeg ringte getstring. 642 00:27:42,520 --> 00:27:44,460 getstring kaller tilsynelatende malloc. 643 00:27:44,460 --> 00:27:47,800 Så hva kodelinje er tilsynelatende på feil for å ha 644 00:27:47,800 --> 00:27:49,050 allokert dette minnet? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 La oss anta at den som skrev malloc har eksistert lenge nok til at det er 647 00:27:55,540 --> 00:27:56,390 ikke deres feil. 648 00:27:56,390 --> 00:27:57,520 Så det er nok mine. 649 00:27:57,520 --> 00:28:02,000 getstring i cs50.c - så det er en fil et sted på datamaskinen - 650 00:28:02,000 --> 00:28:05,210 på linje 286 ser ut til å være den skyldige. 651 00:28:05,210 --> 00:28:08,140 Nå la oss anta at CS50 har vært rundt for anstendig tid, så 652 00:28:08,140 --> 00:28:09,720 også vi er ufeilbarlige. 653 00:28:09,720 --> 00:28:14,080 Og så det er sannsynligvis ikke i getstring at feilen ligger, men snarere i 654 00:28:14,080 --> 00:28:17,810 hallo-2.c linje 18. 655 00:28:17,810 --> 00:28:20,670 >> Så la oss ta en titt på hva som linje 18 var. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Somehow denne linjen er ikke nødvendigvis avlytting, per se, men det er grunnen 658 00:28:27,130 --> 00:28:28,630 bak at minnelekkasje. 659 00:28:28,630 --> 00:28:32,140 Så super enkelt, hva ville intuitivt være løsningen her? 660 00:28:32,140 --> 00:28:34,710 Hvis vi ber for hukommelse, var aldri å gi den tilbake, og som synes å være en 661 00:28:34,710 --> 00:28:37,940 problem fordi det over tid datamaskinen min kanskje går tom for minne, kan bremse 662 00:28:37,940 --> 00:28:42,110 ned, kan dårlige ting skje, vel, hva er den enkle intuitive løsningen? 663 00:28:42,110 --> 00:28:43,140 Bare gi den tilbake. 664 00:28:43,140 --> 00:28:44,770 >> Hvordan frigjøre dere opp som minne? 665 00:28:44,770 --> 00:28:49,970 Vel, heldigvis er det ganske enkelt å bare si fri navn. 666 00:28:49,970 --> 00:28:51,260 Og vi har aldri gjort dette før. 667 00:28:51,260 --> 00:28:55,890 Men du kan egentlig tenke på gratis som det motsatte av malloc. 668 00:28:55,890 --> 00:28:58,030 fri er det motsatte av tildele minne. 669 00:28:58,030 --> 00:28:59,540 Så nå la meg rekompilere dette. 670 00:28:59,540 --> 00:29:02,050 Gjør hallo-2. 671 00:29:02,050 --> 00:29:04,620 La meg kjøre den på nytt. hallo-2 David. 672 00:29:04,620 --> 00:29:07,290 Så det ser ut til å fungere i nøyaktig samme måte. 673 00:29:07,290 --> 00:29:11,180 Men hvis jeg går tilbake til Valgrind og re-run den samme kommandoen på min nylig 674 00:29:11,180 --> 00:29:14,720 kompilert program, skrive i mitt navn som før - 675 00:29:14,720 --> 00:29:15,370 hyggelig. 676 00:29:15,370 --> 00:29:16,760 Heap oppsummering - 677 00:29:16,760 --> 00:29:17,740 i bruk ved avkjørsel - 678 00:29:17,740 --> 00:29:19,370 null byte i null blokker. 679 00:29:19,370 --> 00:29:21,840 Og dette er super hyggelig, alle heap blokker ble frigjort. 680 00:29:21,840 --> 00:29:23,480 Ingen lekkasjer er mulig. 681 00:29:23,480 --> 00:29:27,200 >> Så kommer opp, ikke med Problem Set 4, men med Problem Set 5, de dataanalyse 682 00:29:27,200 --> 00:29:30,740 og videre, også dette vil bli en mål på riktigheten av 683 00:29:30,740 --> 00:29:33,630 program, om du har eller ikke har minnelekkasjer. 684 00:29:33,630 --> 00:29:36,900 Men heldigvis, ikke bare kan du resonnere gjennom dem intuitivt, som 685 00:29:36,900 --> 00:29:40,430 er, uten tvil, lett for små programmer men vanskeligere for store programmer 686 00:29:40,430 --> 00:29:43,860 Valgrind, for de større programmer, kan hjelpe deg med å identifisere 687 00:29:43,860 --> 00:29:45,360 det spesielle problemet. 688 00:29:45,360 --> 00:29:47,500 >> Men det er en annen problem som kan oppstå. 689 00:29:47,500 --> 00:29:51,245 La meg åpne opp denne filen her, som er, igjen, en noe enkelt eksempel. 690 00:29:51,245 --> 00:29:53,760 Men la oss fokusere på hva dette programmet gjør. 691 00:29:53,760 --> 00:29:55,190 Dette kalles memory.c. 692 00:29:55,190 --> 00:29:58,380 Vi vil legge dette senere i dag i zip dagens kildekode. 693 00:29:58,380 --> 00:30:01,610 Og legg merke til at jeg har en funksjon som heter f som tar ingen argumenter og 694 00:30:01,610 --> 00:30:02,800 returnerer ingenting. 695 00:30:02,800 --> 00:30:07,240 I tråd 20, jeg tydeligvis erklære en pekeren til en int og kaller det x. 696 00:30:07,240 --> 00:30:09,570 Jeg tilordne er avkastningen Verdien av malloc. 697 00:30:09,570 --> 00:30:14,590 Og bare for å være klar, hvor mange byte am Jeg sannsynligvis komme tilbake fra malloc 698 00:30:14,590 --> 00:30:17,080 i denne situasjonen? 699 00:30:17,080 --> 00:30:18,040 >> Sannsynligvis 40. 700 00:30:18,040 --> 00:30:18,840 Hvor får du det fra? 701 00:30:18,840 --> 00:30:22,410 Vel, hvis du husker at en int er ofte 4 bytes, i hvert fall det er i 702 00:30:22,410 --> 00:30:25,110 apparatet, er 10 ganger 4 åpenbart 40 år. 703 00:30:25,110 --> 00:30:28,920 Så malloc returnerer en adresse en del av minne og lagring som 704 00:30:28,920 --> 00:30:30,800 ta slutt i x. 705 00:30:30,800 --> 00:30:32,570 Så for å være klar, hva da skjer? 706 00:30:32,570 --> 00:30:34,990 Vel, la meg bytte tilbake til vår bilde her. 707 00:30:34,990 --> 00:30:38,150 La meg ikke bare trekke bunnen av mitt datamaskinens minne, la meg gå videre og 708 00:30:38,150 --> 00:30:42,990 trekke hele rektangelet som representerer alle RAM min. 709 00:30:42,990 --> 00:30:44,790 >> Vi vil si at bunken er på bunnen. 710 00:30:44,790 --> 00:30:47,010 Og det er en tekst segment i de uinitialiserte data. 711 00:30:47,010 --> 00:30:49,880 Men jeg skal bare abstrakte de andre ting unna som prikk, prikk prikk. 712 00:30:49,880 --> 00:30:53,470 Jeg kommer bare til å referere til dette som haugen på toppen. 713 00:30:53,470 --> 00:30:57,070 Og deretter ved bunnen av dette bildet, å representere viktigste, jeg kommer 714 00:30:57,070 --> 00:30:59,880 å gi den en skiver minne på stabelen. 715 00:30:59,880 --> 00:31:03,150 For f, jeg skal gi det en skive minne på stakken. 716 00:31:03,150 --> 00:31:05,140 Nå fikk jeg kontakt med min kildekoden igjen. 717 00:31:05,140 --> 00:31:07,170 Hva er de lokale variablene for main? 718 00:31:07,170 --> 00:31:10,710 Tilsynelatende ingenting, slik at skive er effektivt tom eller ikke engang så stor 719 00:31:10,710 --> 00:31:11,600 som jeg har tegnet det. 720 00:31:11,600 --> 00:31:15,730 Men i f, jeg har en lokal variabel, som kalles x. 721 00:31:15,730 --> 00:31:20,410 Så jeg kommer til å gå videre og gi f en del av minnet, og kaller det x. 722 00:31:20,410 --> 00:31:24,680 >> Og nå malloc av 10 ganger 4, Så 40 malloc, hvor det er 723 00:31:24,680 --> 00:31:25,430 minne kommer fra? 724 00:31:25,430 --> 00:31:27,530 Vi har ikke tegnet et bilde liker dette før. 725 00:31:27,530 --> 00:31:31,140 Men la oss anta at det er effektivt kommer fra her, så en, 726 00:31:31,140 --> 00:31:33,170 to, tre, fire, fem. 727 00:31:33,170 --> 00:31:34,680 Og nå trenger jeg 40 av disse. 728 00:31:34,680 --> 00:31:37,540 Så jeg vil bare gjøre prikk, prikk, prikk til å foreslå at det er enda mer minne 729 00:31:37,540 --> 00:31:39,350 kommer tilbake fra haugen. 730 00:31:39,350 --> 00:31:40,710 Nå hva er adressen? 731 00:31:40,710 --> 00:31:42,620 La oss velge vår vilkårlig adresse som alltid - 732 00:31:42,620 --> 00:31:46,310 Ox123, selv om det sannsynligvis kommer å være noe helt annet. 733 00:31:46,310 --> 00:31:50,420 Det er adressen til den første byte i minne som jeg ber malloc for. 734 00:31:50,420 --> 00:31:53,630 >> Så kort sagt, når linjen 20. utfører, hva er bokstavelig talt 735 00:31:53,630 --> 00:31:57,170 lagret inne i x her? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 Og Ox er uinteressant. 739 00:32:01,550 --> 00:32:03,200 Det betyr bare her er en heksadesimalt tall. 740 00:32:03,200 --> 00:32:06,490 Men kjernen er at det jeg har butikken i x, som er en lokal variabel. 741 00:32:06,490 --> 00:32:10,260 Men dens datatype, igjen, er en adresse til en int. 742 00:32:10,260 --> 00:32:12,710 Vel, jeg kommer til å lagre Ox123. 743 00:32:12,710 --> 00:32:16,610 Men igjen, hvis det er litt for komplisert unødvendig, hvis jeg ruller 744 00:32:16,610 --> 00:32:21,490 tilbake, kan vi abstrakte dette bort ganske rimelig og bare si at x er en 745 00:32:21,490 --> 00:32:23,910 peker til denne del av minnet. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Nå er spørsmålet på hånden er følgende - 748 00:32:26,230 --> 00:32:29,910 linje 21, det viser seg, er buggy. 749 00:32:29,910 --> 00:32:31,160 Hvorfor? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Sorry? 752 00:32:36,930 --> 00:32:38,640 Det har ikke - 753 00:32:38,640 --> 00:32:40,390 si at når mer. 754 00:32:40,390 --> 00:32:41,240 Vel, det gjør det ikke gratis. 755 00:32:41,240 --> 00:32:42,350 Så det er den andre men. 756 00:32:42,350 --> 00:32:45,000 Så det er en annen, men spesielt på linje 21.. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Nettopp. 759 00:32:50,040 --> 00:32:54,980 Denne enkle kodelinje er bare en buffer overflow, en buffer overkjørt. 760 00:32:54,980 --> 00:32:57,050 En buffer betyr bare en del av minnet. 761 00:32:57,050 --> 00:33:01,520 Men det del av minnet er på størrelse 10, 10 heltall, som betyr at hvis vi 762 00:33:01,520 --> 00:33:05,350 indeksen inn det ved hjelp av syntaktisk sukker av matrise notasjon, torget 763 00:33:05,350 --> 00:33:09,220 parentes, har du tilgang til x brakett 0 x brakett 1 x, 764 00:33:09,220 --> 00:33:10,390 brakett prikk, prikk, prikk. 765 00:33:10,390 --> 00:33:13,270 x brakett 9 er den største. 766 00:33:13,270 --> 00:33:17,680 Så hvis jeg gjør x 10 brakett, hvor Jeg faktisk kommer i minnet? 767 00:33:17,680 --> 00:33:19,120 >> Vel, hvis jeg har 10 int - 768 00:33:19,120 --> 00:33:21,070 la oss faktisk trekke alle av disse ut her. 769 00:33:21,070 --> 00:33:22,700 Så det var de første fem. 770 00:33:22,700 --> 00:33:24,660 Her er de fem andre ints. 771 00:33:24,660 --> 00:33:29,580 Så x brakett 0 er her. x trinn 1 er her. x brakett 9 er her. x brakett 772 00:33:29,580 --> 00:33:37,960 10 er her, noe som betyr at jeg forteller, i linje 21, til datamaskinen sette 773 00:33:37,960 --> 00:33:39,400 nummer der? 774 00:33:39,400 --> 00:33:42,010 Tallet 0 der? 775 00:33:42,010 --> 00:33:43,380 Vel, det er 0, ja. 776 00:33:43,380 --> 00:33:45,460 Men bare det faktum at dens 0 er litt av en tilfeldighet. 777 00:33:45,460 --> 00:33:47,140 Det kan være antall 50, for alt vi bryr oss. 778 00:33:47,140 --> 00:33:50,480 Men vi prøver å sette den på x brakett 10, som er hvor denne 779 00:33:50,480 --> 00:33:53,700 spørsmålstegnet er trukket, som er ikke en god ting. 780 00:33:53,700 --> 00:33:57,070 Dette programmet kan godt krasje som resultat. 781 00:33:57,070 --> 00:33:59,400 >> Nå, la oss gå videre og se om dette er, faktisk, hva skjer. 782 00:33:59,400 --> 00:34:02,600 Lag hukommelse, siden filen kalles memory.c. 783 00:34:02,600 --> 00:34:05,950 La oss gå videre og kjøre programmet minne. 784 00:34:05,950 --> 00:34:08,239 Så vi hadde flaks, faktisk, synes det. 785 00:34:08,239 --> 00:34:09,340 Vi hadde flaks. 786 00:34:09,340 --> 00:34:11,060 Men la oss se om vi nå kjøre Valgrind. 787 00:34:11,060 --> 00:34:14,170 Ved første øyekast, mitt program makt synes å være helt korrekt. 788 00:34:14,170 --> 00:34:18,010 Men la meg kjøre Valgrind med - Lekkasje-sjekk tilsvarer full på hukommelse. 789 00:34:18,010 --> 00:34:20,110 >> Og nå når jeg kjører dette - 790 00:34:20,110 --> 00:34:21,030 interessant. 791 00:34:21,030 --> 00:34:26,800 Ugyldig skrive av størrelse 4 på linje 21 av memory.c. 792 00:34:26,800 --> 00:34:29,284 Linje 21 av memory.c er hvilken? 793 00:34:29,284 --> 00:34:30,340 Oh, interessant. 794 00:34:30,340 --> 00:34:31,080 Men vent. 795 00:34:31,080 --> 00:34:32,389 Størrelse 4, hva er det snakk om? 796 00:34:32,389 --> 00:34:34,969 Jeg bare gjorde en skriver, men det er av størrelse 4. 797 00:34:34,969 --> 00:34:36,889 Hvorfor er det fire? 798 00:34:36,889 --> 00:34:39,280 Det er fordi det er en int, som er, igjen, fire byte. 799 00:34:39,280 --> 00:34:42,510 Så Valgrind funnet en bug som jeg, skotter på koden min, gjorde det ikke. 800 00:34:42,510 --> 00:34:45,040 Og kanskje din TF ville eller ikke ville. 801 00:34:45,040 --> 00:34:48,469 Hva Men Valgrind sikkert funnet ut at vi har gjort en feil der, selv 802 00:34:48,469 --> 00:34:52,719 selv om vi hadde flaks, og datamaskinen besluttet, eh, jeg kommer ikke til å krasje 803 00:34:52,719 --> 00:34:57,470 bare fordi du rørt en byte, en int er verdt av minne som du ikke 804 00:34:57,470 --> 00:34:58,550 faktisk eier. 805 00:34:58,550 --> 00:35:00,380 >> Vel, hva annet er buggy her. 806 00:35:00,380 --> 00:35:01,180 Adresse - 807 00:35:01,180 --> 00:35:03,190 Dette er en sprø jakt adresse i heksadesimal. 808 00:35:03,190 --> 00:35:06,890 Det betyr at bare et sted i haugen er null byte etter en blokk med størrelse 40 809 00:35:06,890 --> 00:35:07,620 er tildelt. 810 00:35:07,620 --> 00:35:10,610 La meg zoome ut her og se om dette er litt mer nyttig. 811 00:35:10,610 --> 00:35:11,410 Interessant. 812 00:35:11,410 --> 00:35:15,600 40 bytes er definitivt tapt i tap rekord 1 av 1. 813 00:35:15,600 --> 00:35:17,840 Igjen er flere ord enn nyttig her. 814 00:35:17,840 --> 00:35:21,350 Men basert på de markerte linjer, hvor skal jeg sannsynligvis fokusere min 815 00:35:21,350 --> 00:35:24,070 oppmerksomhet for en annen bug? 816 00:35:24,070 --> 00:35:26,570 Ser ut som en linje 20 av memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Så hvis vi går tilbake til linje 20, som er den en som du identifiserte tidligere. 818 00:35:30,990 --> 00:35:33,030 Og det er ikke nødvendigvis buggy. 819 00:35:33,030 --> 00:35:35,160 Men vi har dette snudd dens virkninger. 820 00:35:35,160 --> 00:35:38,790 Så hvordan retter jeg minst en av disse feilene? 821 00:35:38,790 --> 00:35:42,240 Hva kan jeg gjøre etter linje 21? 822 00:35:42,240 --> 00:35:47,110 Jeg kunne gjøre uten x, er så å gi tilbake som minne. 823 00:35:47,110 --> 00:35:49,230 Og hvordan fikser jeg dette feil? 824 00:35:49,230 --> 00:35:52,120 Jeg bør definitivt gå ikke lenger enn 0. 825 00:35:52,120 --> 00:35:53,670 Så la meg prøve og kjøre dette. 826 00:35:53,670 --> 00:35:56,080 Beklager, definitivt gå ikke lenger enn ni. 827 00:35:56,080 --> 00:35:57,510 Gjør minne. 828 00:35:57,510 --> 00:36:00,650 La meg reprise Valgrind i et større vindu. 829 00:36:00,650 --> 00:36:01,580 Og nå ser. 830 00:36:01,580 --> 00:36:02,250 Nice. 831 00:36:02,250 --> 00:36:03,270 Alle haug blokker ble frigjort. 832 00:36:03,270 --> 00:36:04,270 Ingen lekkasjer er mulig. 833 00:36:04,270 --> 00:36:07,520 Og opp over her, det er ingen omtale noe mer av det ugyldige høyre. 834 00:36:07,520 --> 00:36:09,820 >> Bare for å bli grådig, og la oss se om en annen demonstrasjon 835 00:36:09,820 --> 00:36:11,050 ikke går som forutsatt - 836 00:36:11,050 --> 00:36:12,560 Jeg fikk heldig for et øyeblikk siden. 837 00:36:12,560 --> 00:36:15,530 Og det faktum at dette er 0 er kanskje unødvendig misvisende. 838 00:36:15,530 --> 00:36:20,650 La oss bare gjøre 50, en noe vilkårlig nummer, få minne dot slash minne - 839 00:36:20,650 --> 00:36:21,410 fortsatt ha flaks. 840 00:36:21,410 --> 00:36:22,510 Ingenting å krasje. 841 00:36:22,510 --> 00:36:26,150 Tenk om jeg bare gjøre noe virkelig tåpelig, og jeg gjør 100. 842 00:36:26,150 --> 00:36:30,360 La meg remake minne, dot slash minne - 843 00:36:30,360 --> 00:36:31,075 hadde flaks igjen. 844 00:36:31,075 --> 00:36:32,800 Hva med 1000? 845 00:36:32,800 --> 00:36:35,370 ints utover, omtrent, der jeg skal være? 846 00:36:35,370 --> 00:36:37,410 Gjør minne - 847 00:36:37,410 --> 00:36:38,570 faen. 848 00:36:38,570 --> 00:36:39,920 >> [Latter] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 La oss ikke rote rundt lenger. 851 00:36:43,920 --> 00:36:45,120 Reprise minne. 852 00:36:45,120 --> 00:36:45,840 Det vi går. 853 00:36:45,840 --> 00:36:46,410 OK. 854 00:36:46,410 --> 00:36:52,500 Så tilsynelatende du indekserer 100.000 ints bortenfor der du skulle ha vært i 855 00:36:52,500 --> 00:36:54,410 minne, dårlige ting skje. 856 00:36:54,410 --> 00:36:56,430 Så dette er åpenbart ikke en hard, fast regel. 857 00:36:56,430 --> 00:36:58,190 Jeg var litt hjelp rettssaken og feiling for å komme dit. 858 00:36:58,190 --> 00:37:02,230 Men dette er fordi, lang historie kort, datamaskinens minne er også delt 859 00:37:02,230 --> 00:37:03,580 inn i disse tingene kalles segmenter. 860 00:37:03,580 --> 00:37:07,260 Og noen ganger, datamaskinen faktisk har gitt deg litt mer minne 861 00:37:07,260 --> 00:37:08,400 enn du ber om. 862 00:37:08,400 --> 00:37:12,170 Men for effektivitet, er det bare enklere å få mer minne, men bare fortelle deg 863 00:37:12,170 --> 00:37:13,780 at du får en del av det. 864 00:37:13,780 --> 00:37:16,370 >> Og hvis du får heldig noen ganger, derfor kan du være i stand til å røre 865 00:37:16,370 --> 00:37:17,795 minne som ikke tilhører deg. 866 00:37:17,795 --> 00:37:21,860 Du har ingen garanti for at det verdi du setter det vil bo der, fordi 867 00:37:21,860 --> 00:37:25,080 datamaskinen fortsatt mener det ikke er din, men det er ikke nødvendigvis kommer 868 00:37:25,080 --> 00:37:29,910 å treffe et annet segment av minne i datamaskin og indusere en feil som 869 00:37:29,910 --> 00:37:31,710 denne her. 870 00:37:31,710 --> 00:37:32,060 OK. 871 00:37:32,060 --> 00:37:37,240 Eventuelle spørsmål deretter på minne? 872 00:37:37,240 --> 00:37:37,590 >> OK. 873 00:37:37,590 --> 00:37:40,610 La oss ta en titt her, da, noe vi har tatt for 874 00:37:40,610 --> 00:37:48,361 innvilget i ganske lang tid, noe som er i denne filen som heter cs50.h. 875 00:37:48,361 --> 00:37:49,420 Så dette er en fil. 876 00:37:49,420 --> 00:37:51,130 Dette er bare en hel haug av kommentarene opp topp. 877 00:37:51,130 --> 00:37:53,900 Og du har kanskje sett på dette hvis du stakk rundt på apparatet. 878 00:37:53,900 --> 00:37:57,000 Men det viser seg at hele tiden, da vi pleide å bruke streng som en 879 00:37:57,000 --> 00:38:01,130 synonym, de midler som vi erklærte som synonym var med denne 880 00:38:01,130 --> 00:38:03,990 søkeord typedef, for type definisjon. 881 00:38:03,990 --> 00:38:07,500 Og vi egentlig sier, gjør strengen en synonym for røye stjerne. 882 00:38:07,500 --> 00:38:11,190 At den måte hvorved stabelen skapte disse trening hjul kjent som 883 00:38:11,190 --> 00:38:12,040 strengen. 884 00:38:12,040 --> 00:38:14,830 >> Nå her er bare en prototype for getchar. 885 00:38:14,830 --> 00:38:17,350 Vi har kanskje sett det før, men det er faktisk hva den gjør. getchar 886 00:38:17,350 --> 00:38:19,070 tar ingen argumenter, returnerer en røye. 887 00:38:19,070 --> 00:38:21,340 getdouble tar ingen argumenter, returnerer en dobbel. 888 00:38:21,340 --> 00:38:24,440 getfloat tar ingen argumenter, returnerer en flottør, og så videre. 889 00:38:24,440 --> 00:38:27,270 getint er her inne. getlonglong er her inne. 890 00:38:27,270 --> 00:38:28,820 Og getstring er her inne. 891 00:38:28,820 --> 00:38:29,420 Og det er det. 892 00:38:29,420 --> 00:38:33,080 Denne lilla linjen er en annen preprocessor direktiv på grunn av 893 00:38:33,080 --> 00:38:35,550 hashtag på begynnelsen av det. 894 00:38:35,550 --> 00:38:35,870 >> OK. 895 00:38:35,870 --> 00:38:38,380 Så nå la meg gå inn cs50.c. 896 00:38:38,380 --> 00:38:40,400 Og vi vil ikke snakke for lenge på dette. 897 00:38:40,400 --> 00:38:43,280 Men for å gi deg et glimt av hva som er pågått alt dette 898 00:38:43,280 --> 00:38:46,434 tid, la meg gå til - 899 00:38:46,434 --> 00:38:48,250 la oss gjøre getchar. 900 00:38:48,250 --> 00:38:51,050 Så getchar er for det meste kommentarer. 901 00:38:51,050 --> 00:38:52,060 Men det ser ut som dette. 902 00:38:52,060 --> 00:38:54,800 Så dette er den faktiske funksjon getchar at vi har vært 903 00:38:54,800 --> 00:38:56,055 tar for gitt eksisterer. 904 00:38:56,055 --> 00:38:59,370 Og selv om vi ikke har bruk denne ene som ofte, om noen gang, er det minst 905 00:38:59,370 --> 00:39:00,470 relativt enkel. 906 00:39:00,470 --> 00:39:02,580 Så det er verdt å ta en rask titt på her. 907 00:39:02,580 --> 00:39:06,540 >> Så getchar har en uendelig loop, bevisst slik tilsynelatende. 908 00:39:06,540 --> 00:39:10,050 Det krever da - og dette er en type fin gjenbruk av kode vi selv skrev. 909 00:39:10,050 --> 00:39:11,220 Det kaller getstring. 910 00:39:11,220 --> 00:39:12,460 Fordi det gjør det bety å få en røye? 911 00:39:12,460 --> 00:39:14,730 Vel, kan du like godt prøve å få en Hele tekstlinje fra brukeren og 912 00:39:14,730 --> 00:39:16,940 så bare se på ett av disse tegnene. 913 00:39:16,940 --> 00:39:19,170 I tråd 60, her er litt litt av en mental helse sjekk. 914 00:39:19,170 --> 00:39:21,610 Hvis getstring returneres null, la oss ikke fortsette. 915 00:39:21,610 --> 00:39:22,820 Noe gikk galt. 916 00:39:22,820 --> 00:39:28,120 >> Nå er dette litt irriterende, men konvensjonelle i C. røye maks trolig 917 00:39:28,120 --> 00:39:29,960 representerer det bare basert på navnet sitt? 918 00:39:29,960 --> 00:39:31,670 Det er en konstant. 919 00:39:31,670 --> 00:39:36,040 Det er som den numeriske verdien av største røye du kan representere med 920 00:39:36,040 --> 00:39:40,370 en matbit, som sannsynligvis er antallet 255, som er den største nummeret du 921 00:39:40,370 --> 00:39:42,720 representerer åtte bits, starter fra null. 922 00:39:42,720 --> 00:39:47,460 Så jeg har bruker dette, i denne funksjonen, når skrive denne koden, bare fordi 923 00:39:47,460 --> 00:39:51,753 hvis noe går galt i getchar men sitt formål i livet er å returnere en 924 00:39:51,753 --> 00:39:54,830 røye, må du liksom kunne å signalisere til brukeren om at 925 00:39:54,830 --> 00:39:55,840 noe gikk galt. 926 00:39:55,840 --> 00:39:56,970 Vi kan ikke returnere null. 927 00:39:56,970 --> 00:39:58,480 Det viser seg at null er en peker. 928 00:39:58,480 --> 00:40:01,030 Og igjen, har getchar å returnere en røye. 929 00:40:01,030 --> 00:40:04,760 >> Så konvensjonen, hvis noe går galt, er du som programmerer, eller i 930 00:40:04,760 --> 00:40:08,160 dette tilfellet meg med biblioteket, hadde jeg en bare bestemme vilkårlig, hvis 931 00:40:08,160 --> 00:40:12,230 noe går galt, kommer jeg til å returnere antall 255, som er virkelig 932 00:40:12,230 --> 00:40:17,240 betyr at vi kan ikke, kan ikke brukeren skriver tegnet representert ved 933 00:40:17,240 --> 00:40:21,410 nummer 255 fordi vi hadde en stjele den som en såkalt fast punkt verdi til 934 00:40:21,410 --> 00:40:23,410 representere et problem. 935 00:40:23,410 --> 00:40:27,010 Nå viser det seg at karakteren 255 er ikke noe du kan skrive på 936 00:40:27,010 --> 00:40:28,380 tastaturet, så det er ingen big deal. 937 00:40:28,380 --> 00:40:30,910 Brukeren merker ikke at Jeg har stjålet denne karakter. 938 00:40:30,910 --> 00:40:34,620 Men hvis du noen gang ser i man-sidene på en datasystem noen henvisning til en 939 00:40:34,620 --> 00:40:38,560 alle caps konstant som dette som sier, i tilfeller av feil dette konstant makt 940 00:40:38,560 --> 00:40:42,720 bli returnert, det er alt noen mennesker gjorde år siden ble vilkårlig besluttet å 941 00:40:42,720 --> 00:40:45,680 returnere denne spesielle verdi og kaller det en konstant i tilfelle 942 00:40:45,680 --> 00:40:46,840 noe går galt. 943 00:40:46,840 --> 00:40:48,580 >> Nå magien skjer her nede. 944 00:40:48,580 --> 00:40:52,600 Først, jeg erklære på linje 67 to tegn, C1 og C2. 945 00:40:52,600 --> 00:40:57,080 Og så i tråd 68, det er faktisk en linje med kode som minner om 946 00:40:57,080 --> 00:41:01,140 vår venn printf, gitt at det har prosent Cs i anførselstegn. 947 00:41:01,140 --> 00:41:06,490 Men legg merke til hva som skjer her. sscanf betyr streng scan - 948 00:41:06,490 --> 00:41:11,690 betyr skanne en formatert string, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Hva betyr det? 950 00:41:12,590 --> 00:41:16,310 Det betyr at du passerer å sscanf en streng. 951 00:41:16,310 --> 00:41:18,420 Og linjen er uansett brukeren skriver i. 952 00:41:18,420 --> 00:41:23,520 Du passerer til sscanf et format streng som dette som forteller scanf hva er 953 00:41:23,520 --> 00:41:25,870 du håper at brukeren har skrevet i. 954 00:41:25,870 --> 00:41:29,730 Deretter passerer-i adressene til to biter av hukommelse, i dette tilfellet, 955 00:41:29,730 --> 00:41:31,150 fordi jeg har to plassholdere. 956 00:41:31,150 --> 00:41:34,610 Så jeg kommer til å gi den adressen av C1 og adressen til C2. 957 00:41:34,610 --> 00:41:37,700 >> Og minner om at du gir en funksjon adressen til noen variable, hva er 958 00:41:37,700 --> 00:41:38,950 implikasjonen? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Hva kan denne funksjonen gjøre som et resultat for å gi den adressen til en 961 00:41:45,050 --> 00:41:48,170 variabel, i motsetning til variabelen selv? 962 00:41:48,170 --> 00:41:49,450 Det kan endre det, ikke sant? 963 00:41:49,450 --> 00:41:53,250 Hvis du hadde noen et kart til en fysisk adresse, kan de gå der og gjøre 964 00:41:53,250 --> 00:41:54,750 hva de vil på denne adressen. 965 00:41:54,750 --> 00:41:55,800 Samme ideen her. 966 00:41:55,800 --> 00:41:59,950 Hvis vi passerer til sscanf, adressen til to biter av minne, selv disse ørsmå 967 00:41:59,950 --> 00:42:03,585 små biter av minne, C1 og C2, men vi forteller det adressen til dem, 968 00:42:03,585 --> 00:42:05,170 sscanf kan endre det. 969 00:42:05,170 --> 00:42:08,530 >> Så sscanf hensikt i livet, hvis vi leser man-siden, er å lese hva 970 00:42:08,530 --> 00:42:13,420 brukeren har skrevet inn, håpe på at brukeren trenger skrevet i en karakter og kanskje 971 00:42:13,420 --> 00:42:16,470 en annen karakter, og hva brukeren skrevet, går det første tegnet 972 00:42:16,470 --> 00:42:19,310 her går det andre tegnet her. 973 00:42:19,310 --> 00:42:22,470 Nå, som en side, dette, og du ville bare vet dette fra dokumentasjonen, 974 00:42:22,470 --> 00:42:25,570 det faktum at jeg setter en tom plass der betyr bare at jeg bryr meg ikke om 975 00:42:25,570 --> 00:42:28,440 brukeren treffer på mellomromstasten noen ganger før han eller hun tar en 976 00:42:28,440 --> 00:42:30,400 karakter, kommer jeg til å ignorere noen hvite felt. 977 00:42:30,400 --> 00:42:32,510 Så det vet jeg fra dokumentasjonen. 978 00:42:32,510 --> 00:42:36,570 >> Det faktum at det er en annen% c etterfulgt av mellomrom er faktisk 979 00:42:36,570 --> 00:42:37,410 bevisst. 980 00:42:37,410 --> 00:42:41,190 Jeg ønsker å være i stand til å oppdage om brukeren skrudd opp eller ikke samarbeide. 981 00:42:41,190 --> 00:42:45,630 Så jeg håper at brukeren kun har skrevet i ett tegn, derfor jeg håper 982 00:42:45,630 --> 00:42:50,640 at sscanf er bare kommer til å returnere verdien 1 fordi, igjen, hvis jeg leser 983 00:42:50,640 --> 00:42:55,400 dokumentasjonen, sscanf hensikt i liv er å gå tilbake til antallet 984 00:42:55,400 --> 00:42:59,170 variabler som var fylt med brukerundersøkelser. 985 00:42:59,170 --> 00:43:02,270 >> Jeg gikk i to variabler adresser, C1 og C2. 986 00:43:02,270 --> 00:43:06,420 Jeg håper imidlertid at bare én av dem blir drept fordi hvis sscanf 987 00:43:06,420 --> 00:43:11,130 returnerer 2, hva er formodentlig implikasjonen logisk? 988 00:43:11,130 --> 00:43:14,600 At brukeren ikke bare gi meg en karakter som jeg fortalte ham eller henne. 989 00:43:14,600 --> 00:43:17,860 De sannsynligvis skrevet på minst to tegn. 990 00:43:17,860 --> 00:43:22,430 Så hvis jeg i stedet hadde ikke den andre % C, måtte jeg bare en, som 991 00:43:22,430 --> 00:43:25,370 ærlig ville være mer intuitivt tilnærming, jeg tror en første øyekast, 992 00:43:25,370 --> 00:43:30,220 du kommer ikke til å være i stand til å oppdage hvis brukeren har vært å gi deg mer 993 00:43:30,220 --> 00:43:31,780 innspill enn du egentlig ønsket. 994 00:43:31,780 --> 00:43:34,100 Så dette er et implisitt skjema av feilsjekking. 995 00:43:34,100 --> 00:43:35,640 >> Men legg merke til hva jeg gjør her. 996 00:43:35,640 --> 00:43:39,970 Når jeg er sikker på at brukeren ga meg en karakter, frigjøre jeg linjen, gjør 997 00:43:39,970 --> 00:43:44,450 det motsatte av getstring, som i sin tur bruker malloc, og da jeg kommer tilbake 998 00:43:44,450 --> 00:43:51,030 C1, tegnet som jeg håpet Brukeren gitt og bare gitt. 999 00:43:51,030 --> 00:43:54,680 Så en rask skimtet bare, men spørsmål om getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Vi vil komme tilbake til noen av de andre. 1002 00:43:59,590 --> 00:44:03,770 >> Vel, la meg gå videre og gjøre dette - anta nå, bare for å motivere våre 1003 00:44:03,770 --> 00:44:08,910 diskusjon i en uke pluss tid, dette er en fil som heter structs.h. 1004 00:44:08,910 --> 00:44:11,440 Og igjen, dette er bare en forsmak av noe som ligger foran oss. 1005 00:44:11,440 --> 00:44:13,090 Men legg merke til at mye av dette er kommentarene. 1006 00:44:13,090 --> 00:44:17,440 Så la meg markere bare interessante delen for nå. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 det er det samme søkeordet igjen. 1009 00:44:19,700 --> 00:44:23,100 typedef vi bruker til å erklære string som en spesiell datatype. 1010 00:44:23,100 --> 00:44:27,490 Du kan bruke typedef å lage helt nye datatyper som ikke fantes da 1011 00:44:27,490 --> 00:44:28,570 C ble oppfunnet. 1012 00:44:28,570 --> 00:44:32,520 For eksempel, kommer int med C. char kommer med C. dobbel kommer med C. Men 1013 00:44:32,520 --> 00:44:34,000 det er ingen forestilling om en student. 1014 00:44:34,000 --> 00:44:37,230 Og likevel det ville være ganske nyttig å være stand til å skrive et program som lagrer 1015 00:44:37,230 --> 00:44:40,440 i en variabel, en student ID-nummer, deres navn, og huset deres. 1016 00:44:40,440 --> 00:44:42,890 Med andre ord, tre stykker av data, som en int og en 1017 00:44:42,890 --> 00:44:44,420 streng og en annen streng. 1018 00:44:44,420 --> 00:44:48,220 >> Med typedef, er det ganske kraftig om dette og søkeordet sturct for 1019 00:44:48,220 --> 00:44:53,660 struktur, du som programmerer i 2013, faktisk kan definere din egen på 1020 00:44:53,660 --> 00:44:57,530 datatyper som ikke fantes år siden, men som passer ditt formål. 1021 00:44:57,530 --> 00:45:01,910 Og så her, i linjene 13 til 19, vi erklære en ny datatype, som 1022 00:45:01,910 --> 00:45:04,320 en int, men kaller det student. 1023 00:45:04,320 --> 00:45:09,310 Og inne i denne variabelen kommer til å være tre ting - en int, en streng, 1024 00:45:09,310 --> 00:45:09,930 og en streng. 1025 00:45:09,930 --> 00:45:13,040 Så du kan tenke på hva som er virkelig skjedde her, selv om dette er en 1026 00:45:13,040 --> 00:45:17,160 litt av en forenkling for i dag, en student er i hovedsak går 1027 00:45:17,160 --> 00:45:19,450 å se ut som dette. 1028 00:45:19,450 --> 00:45:22,580 Den kommer til å være en del av minne med en ID, et navn 1029 00:45:22,580 --> 00:45:25,580 feltet, og et hus feltet. 1030 00:45:25,580 --> 00:45:30,670 Og vi vil være i stand til å bruke disse biter av minne og få tilgang til dem som følger. 1031 00:45:30,670 --> 00:45:38,870 >> Hvis jeg går inn struct0.c, her er en forholdsvis lang, men etter en 1032 00:45:38,870 --> 00:45:42,630 mønster, med kode som bruker denne nye triks. 1033 00:45:42,630 --> 00:45:45,790 Så først, la meg trekke oppmerksomheten din til de interessante delene opp topp. 1034 00:45:45,790 --> 00:45:49,670 Sharp definerer studenter 3, erklærer en konstant kalt studenter og stedfortredere 1035 00:45:49,670 --> 00:45:53,450 det vilkårlig nummer 3, bare så jeg har tre studenter bruker 1036 00:45:53,450 --> 00:45:54,830 dette programmet for nå. 1037 00:45:54,830 --> 00:45:55,960 Her kommer Main. 1038 00:45:55,960 --> 00:45:58,860 Og legg merke til, hvordan kan jeg erklære en rekke studenter? 1039 00:45:58,860 --> 00:46:00,480 Vel, jeg bare bruke samme syntaks. 1040 00:46:00,480 --> 00:46:02,110 Ordet student er tydeligvis ny. 1041 00:46:02,110 --> 00:46:04,790 Men studentlivet, klasse, brakett studenter. 1042 00:46:04,790 --> 00:46:06,720 >> Så dessverre er det mye av gjenbruk av begreper her. 1043 00:46:06,720 --> 00:46:07,660 Dette er bare et tall. 1044 00:46:07,660 --> 00:46:09,040 Så dette er som å si tre. 1045 00:46:09,040 --> 00:46:11,430 Klasse er akkurat hva jeg vil å kalle variabelen. 1046 00:46:11,430 --> 00:46:12,840 Jeg kan kalle det studenter. 1047 00:46:12,840 --> 00:46:15,880 Men klasse, dette er ikke en klasse i en objektorientert Java slags måte. 1048 00:46:15,880 --> 00:46:17,220 Det er bare en klasse av studenter. 1049 00:46:17,220 --> 00:46:20,590 Og datatypen for hvert element i denne matrisen er student. 1050 00:46:20,590 --> 00:46:23,040 Så dette er litt annerledes og fra å si noe 1051 00:46:23,040 --> 00:46:25,250 som dette, er det bare - 1052 00:46:25,250 --> 00:46:29,500 Jeg sier gi meg tre studenter og kaller denne matrisen klassen. 1053 00:46:29,500 --> 00:46:29,800 >> OK. 1054 00:46:29,800 --> 00:46:30,680 Nå her en fire loop. 1055 00:46:30,680 --> 00:46:33,480 Denne fyren er kjent - iterasjon fra null på opp til tre. 1056 00:46:33,480 --> 00:46:35,160 Og her er den nye stykke syntaks. 1057 00:46:35,160 --> 00:46:37,710 Programmet kommer til å spørre meg, mennesket, for å gi den en student 1058 00:46:37,710 --> 00:46:39,200 ID, som er en int. 1059 00:46:39,200 --> 00:46:44,650 Og her er syntaksen som du kan lagre noe i ID-feltet på 1060 00:46:44,650 --> 00:46:48,630 plassering klasse brakett I. Så denne syntaksen er ikke ny. 1061 00:46:48,630 --> 00:46:51,450 Dette betyr bare gi meg den åttende elev i klassen. 1062 00:46:51,450 --> 00:46:52,940 Men dette symbolet er nytt. 1063 00:46:52,940 --> 00:46:56,320 Frem til nå har vi ikke brukt prikk, i det minste i kode som dette. 1064 00:46:56,320 --> 00:47:01,490 Dette betyr gå til struct kjent som en student og sette noe der. 1065 00:47:01,490 --> 00:47:05,670 Tilsvarende, i denne neste linje, 31, går fremover og plassere hva brukeren skriver 1066 00:47:05,670 --> 00:47:10,530 etter et navn her og hva de gjør for en huset, det samme, gå videre og 1067 00:47:10,530 --> 00:47:13,230 sette den inn. huset. 1068 00:47:13,230 --> 00:47:15,955 >> Så hva gjør dette programmet til slutt gjøre? 1069 00:47:15,955 --> 00:47:17,220 Du kan se en liten teaser der. 1070 00:47:17,220 --> 00:47:24,780 La meg gå videre og gjør structs 0 dot slash struct 0, student ID-en, 1071 00:47:24,780 --> 00:47:28,250 sier David Mather, student ID to. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, student ID tre. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 og det eneste dette programmet gjorde, som bare er helt vilkårlig, blir 1075 00:47:38,380 --> 00:47:40,980 Jeg ønsket å gjøre noe med disse dataene, nå som jeg har lært oss hvordan vi skal 1076 00:47:40,980 --> 00:47:43,450 bruke structs, er jeg bare måtte denne ekstra sløyfe her. 1077 00:47:43,450 --> 00:47:45,260 Jeg iterere over rekken av studenter. 1078 00:47:45,260 --> 00:47:49,170 Jeg brukte vår, kanskje nå velkjente venn, string sammenligne, stircomp til 1079 00:47:49,170 --> 00:47:53,780 sjekk er åttende student hus lik Mather? 1080 00:47:53,780 --> 00:47:56,760 Og hvis så, bare skrive noe vilkårlig liker, ja, det er det. 1081 00:47:56,760 --> 00:47:59,430 Men igjen, bare gi meg muligheter å bruke og gjenbruke og 1082 00:47:59,430 --> 00:48:02,270 gjenbruke denne nye dot notasjon. 1083 00:48:02,270 --> 00:48:03,250 >> Så hvem bryr seg, ikke sant? 1084 00:48:03,250 --> 00:48:06,270 Kommer opp med en student programmet er noe vilkårlig, men det viser seg 1085 00:48:06,270 --> 00:48:09,800 at vi kan gjøre nyttige ting med denne, for eksempel på følgende måte. 1086 00:48:09,800 --> 00:48:14,600 Dette er en mye mer komplisert struct i C. Det har et dusin eller flere felt, 1087 00:48:14,600 --> 00:48:15,880 noe kryptisk heter. 1088 00:48:15,880 --> 00:48:20,110 Men hvis du noen gang hørt om en grafikk filformat kalt bitmap, BMP, det 1089 00:48:20,110 --> 00:48:22,830 viser seg at bitmap filformat pen ser mye ut som dette. 1090 00:48:22,830 --> 00:48:24,200 Det er en dum liten Smileansikt. 1091 00:48:24,200 --> 00:48:27,840 Det er et lite bilde som jeg har zoomet inn på ganske stor slik at jeg kunne se hver 1092 00:48:27,840 --> 00:48:30,410 av de enkelte punkter eller piksler. 1093 00:48:30,410 --> 00:48:33,800 Nå viser det seg at vi kan representere en svart prikk med, si, antall 0. 1094 00:48:33,800 --> 00:48:35,520 Og en hvit dot med tallet 1. 1095 00:48:35,520 --> 00:48:39,140 >> Så med andre ord, å hvis du vil tegne en Smilefjes og lagre det bildet i en 1096 00:48:39,140 --> 00:48:42,680 datamaskin, er det nok til å lagre nuller og de som ser ut som dette, hvor, 1097 00:48:42,680 --> 00:48:45,250 igjen, de er hvite og nuller er svart. 1098 00:48:45,250 --> 00:48:48,290 Og sammen, hvis du effektivt har en omgjord av enere og nuller, har du en 1099 00:48:48,290 --> 00:48:51,030 rutenett av piksler, og hvis du legger dem ut, har du en søt 1100 00:48:51,030 --> 00:48:52,560 Litt Smileansikt. 1101 00:48:52,560 --> 00:48:58,150 Nå er bitmap filformat, BMP, effektivt at under panseret, 1102 00:48:58,150 --> 00:49:00,970 men med flere piksler sot som du kan faktisk representere farger. 1103 00:49:00,970 --> 00:49:05,170 >> Men når du har mer sofistikert filformater som BMP og JPEG og GIF 1104 00:49:05,170 --> 00:49:09,360 som du kanskje bli kjent, de filer på disken vanligvis ikke bare 1105 00:49:09,360 --> 00:49:13,760 har nuller og enere for piksler, men de har noen metadata samt - 1106 00:49:13,760 --> 00:49:16,960 meta i den forstand som egentlig ikke er data, men det er nyttig å ha. 1107 00:49:16,960 --> 00:49:21,370 Så disse feltene her er noe som tyder på, og vi får se dette i mer detalj i P-set 1108 00:49:21,370 --> 00:49:25,810 5, som før nuller og enere som representerer piksler i et bilde, 1109 00:49:25,810 --> 00:49:29,110 det er en haug av metadata som størrelsen av bildet og den 1110 00:49:29,110 --> 00:49:30,250 bredden av bildet. 1111 00:49:30,250 --> 00:49:32,910 Og legg merke til jeg plukker ut noen vilkårlige ting her - 1112 00:49:32,910 --> 00:49:34,260 bredde og høyde. 1113 00:49:34,260 --> 00:49:36,160 Bit teller og noen andre ting. 1114 00:49:36,160 --> 00:49:37,840 Så er det noen metadata i en fil. 1115 00:49:37,840 --> 00:49:41,470 >> Men ved å forstå hvordan filer er lagt ut på denne måten, kan du faktisk 1116 00:49:41,470 --> 00:49:45,890 deretter manipulere bilder, gjenopprette bilder fra disk, endre størrelsen på bilder. 1117 00:49:45,890 --> 00:49:47,560 Men du kan ikke nødvendigvis forbedre dem. 1118 00:49:47,560 --> 00:49:48,480 Jeg trengte et fotografi. 1119 00:49:48,480 --> 00:49:52,840 Så jeg gikk tilbake til RJ her, som du så på skjermen en stund siden. 1120 00:49:52,840 --> 00:49:57,160 Og hvis jeg åpner opp Keynote her, er dette hva skjer hvis du prøver å zoome inn og 1121 00:49:57,160 --> 00:49:59,380 forbedre RJ. 1122 00:49:59,380 --> 00:50:01,480 Han er ikke få noe bedre egentlig. 1123 00:50:01,480 --> 00:50:06,240 Nå Keynote er slags uskarphet det en litt, bare for å glatte over 1124 00:50:06,240 --> 00:50:11,040 At RJ ikke får særlig forbedret når du zoomer inn 1125 00:50:11,040 --> 00:50:13,310 Og hvis gjør det på denne måten, se rutene? 1126 00:50:13,310 --> 00:50:15,490 Ja, kan du definitivt se rutene på en projektor. 1127 00:50:15,490 --> 00:50:17,690 >> Det er hva du får når du forbedre. 1128 00:50:17,690 --> 00:50:22,570 Men i å forstå hvordan vår RJ eller Smilefjes er implementert vil la oss 1129 00:50:22,570 --> 00:50:24,950 faktisk skrive kode som manipulerer disse tingene. 1130 00:50:24,950 --> 00:50:29,970 Og jeg trodde jeg ville ende på dette notatet, med 55 sekunder av en styrke som er, 1131 00:50:29,970 --> 00:50:31,230 Jeg tør si ganske misvisende. 1132 00:50:31,230 --> 00:50:32,990 >> [VIDEOAVSPILLING] 1133 00:50:32,990 --> 00:50:34,790 >> -Han lyver. 1134 00:50:34,790 --> 00:50:38,310 Om hva, vet jeg ikke. 1135 00:50:38,310 --> 00:50:41,200 >> -Så hva vet vi? 1136 00:50:41,200 --> 00:50:45,280 >> -Det at 9:15 Ray Santoya var ved minibanken. 1137 00:50:45,280 --> 00:50:47,830 >> -Så spørsmålet er hva gjorde han på 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Skyting de ni millimeter på noe. 1139 00:50:50,750 --> 00:50:52,615 Kanskje han så snikskytter. 1140 00:50:52,615 --> 00:50:54,760 >> -Eller jobbet med ham. 1141 00:50:54,760 --> 00:50:56,120 >> -Vent. 1142 00:50:56,120 --> 00:50:57,450 Gå tilbake ett. 1143 00:50:57,450 --> 00:50:58,700 >> -Hva ser du? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Ta med ansiktet opp, full skjerm. 1146 00:51:09,490 --> 00:51:09,790 >> -Hans briller. 1147 00:51:09,790 --> 00:51:11,040 >> -Det er en refleksjon. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Det er Neuvitas baseball team. 1150 00:51:23,520 --> 00:51:24,530 Det er deres logo. 1151 00:51:24,530 --> 00:51:27,040 >> -Og han snakker til den som er iført den jakken. 1152 00:51:27,040 --> 00:51:27,530 >> [END VIDEOAVSPILLING] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. MALAN: Dette vil være Problem Set 5. 1154 00:51:29,180 --> 00:51:30,720 Vi vil se deg neste uke. 1155 00:51:30,720 --> 00:51:32,330 >> MALE SPEAKER: Ved neste CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Sirisser kvitret] 1157 00:51:39,240 --> 00:51:41,270 >> [Musikk spilles]