1 00:00:00,000 --> 00:00:10,970 >> [MUSIC Playing] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. MALAN: Okay. 3 00:00:12,536 --> 00:00:13,392 >> [Latter] 4 00:00:13,392 --> 00:00:14,240 >> Velkommen tilbage. 5 00:00:14,240 --> 00:00:14,990 Dette er CS50. 6 00:00:14,990 --> 00:00:16,890 Og dette i slutningen af ​​uge fem. 7 00:00:16,890 --> 00:00:20,020 Og indtil nu, vi har temmelig meget taget for givet, at der 8 00:00:20,020 --> 00:00:23,480 eksisterer denne compiler, Clang, at du har været påberåber ved hjælp af dette 9 00:00:23,480 --> 00:00:27,100 andet værktøj kaldet Make at anden magisk konverterer din kildekode 10 00:00:27,100 --> 00:00:31,350 i objektkode, de nuller og ettaller at din computer CPU, central 11 00:00:31,350 --> 00:00:33,410 behandlingsenhed, faktisk forstår. 12 00:00:33,410 --> 00:00:36,770 Men det viser sig at der er et tal, der er foregår under hætten i 13 00:00:36,770 --> 00:00:38,690 mellem input og output. 14 00:00:38,690 --> 00:00:41,800 >> Og jeg vil gerne foreslå, at vi kød det ud i en lidt mere detaljeret ind 15 00:00:41,800 --> 00:00:45,130 disse fire trin, har noget, der hedder forbehandling, noget 16 00:00:45,130 --> 00:00:48,300 kaldes kompilering, som vi har set, noget, der hedder samling, og 17 00:00:48,300 --> 00:00:49,420 noget, der hedder sammenkædning. 18 00:00:49,420 --> 00:00:53,270 Så indtil nu, i nogle af vores programmer, vi har haft skarpe omfatter. 19 00:00:53,270 --> 00:00:56,650 For nylig har vi haft nogle skarpe definerer for konstanter. 20 00:00:56,650 --> 00:01:00,660 Så det viser sig, at de ting, der er præfikset med hash symbol eller 21 00:01:00,660 --> 00:01:04,150 pund symbolet er pre-processoren direktiver. 22 00:01:04,150 --> 00:01:07,960 Det er bare en fancy måde at sige det er en linje kode, der er faktisk 23 00:01:07,960 --> 00:01:12,280 omdannes til noget andet før computer, selv forsøger at konvertere din 24 00:01:12,280 --> 00:01:13,800 program i nuller og ettaller. 25 00:01:13,800 --> 00:01:19,000 >> For eksempel omfatter skarpe standard I / O. H, temmelig meget betyder blot gå 26 00:01:19,000 --> 00:01:24,010 forude, tag fat i indholdet af filer stdio.h og indsætte dem lige der. 27 00:01:24,010 --> 00:01:25,880 Altså ingen nuller og ettaller på det tidspunkt endnu. 28 00:01:25,880 --> 00:01:27,470 Det er egentlig bare en udskiftning. 29 00:01:27,470 --> 00:01:30,790 Og der er gjort under den såkaldte forbehandling scene, når du 30 00:01:30,790 --> 00:01:34,230 faktisk køre Clang eller specifikt Gør i de fleste tilfælde. 31 00:01:34,230 --> 00:01:36,950 Så alt dette har været tilfældet først automatisk hidtil. 32 00:01:36,950 --> 00:01:38,800 >> Så kommer udarbejdelse skridt. 33 00:01:38,800 --> 00:01:40,920 Men vi har været lemfældig kompilering. 34 00:01:40,920 --> 00:01:45,060 Oversættelse af en program egentlig vil sige at tage det fra noget som C, er 35 00:01:45,060 --> 00:01:48,430 kildekode vi har været at skrive, ned til noget, der hedder forsamling. 36 00:01:48,430 --> 00:01:52,900 Assembler er et lavere niveau sprog, heldigvis, vil vi ikke 37 00:01:52,900 --> 00:01:55,480 har meget lejlighed til at skrive dette semester. 38 00:01:55,480 --> 00:01:59,100 Men det er på det laveste niveau i forstand, at du bogstaveligt talt begynde at skrive 39 00:01:59,100 --> 00:02:04,270 tilføje og trække og formere sig og indlæse fra hukommelsen og gemme til hukommelsen, 40 00:02:04,270 --> 00:02:08,259 meget grundlæggende instruktioner, som en computer, under hætten, 41 00:02:08,259 --> 00:02:09,639 faktisk forstår. 42 00:02:09,639 --> 00:02:14,930 >> Endelig, montage finder, at sproget til nuller og ettaller, som vi har været 43 00:02:14,930 --> 00:02:16,190 beskriver hidtil. 44 00:02:16,190 --> 00:02:19,270 Og virkelig endelig er der den såkaldte forbinder fase, som vi vil 45 00:02:19,270 --> 00:02:22,360 se på bare et øjeblik, som kombinerer dine nuller og ettaller med nuller og 46 00:02:22,360 --> 00:02:24,870 dem andre mennesker før du har oprettet. 47 00:02:24,870 --> 00:02:26,660 >> Så overveje denne super simple program. 48 00:02:26,660 --> 00:02:27,560 Det var fra uge 1. 49 00:02:27,560 --> 00:02:29,610 Det sagde bare, Hello World, på skærmen. 50 00:02:29,610 --> 00:02:30,920 Vi løb dette gennem Clang. 51 00:02:30,920 --> 00:02:33,200 Eller vi kørte det igennem Make der løb Clang. 52 00:02:33,200 --> 00:02:36,170 Og udsendes på det tidspunkt, hvor nogle nuller og ettaller. 53 00:02:36,170 --> 00:02:38,100 Men det viser sig at der er et mellemtrin. 54 00:02:38,100 --> 00:02:40,460 Hvis jeg går herovre - UPS, ikke ønsker at se ham endnu. 55 00:02:40,460 --> 00:02:44,800 Hvis jeg går over her til min apparat og jeg åbner op hello.c, her 56 00:02:44,800 --> 00:02:46,160 er det samme program. 57 00:02:46,160 --> 00:02:48,600 Og hvad jeg har tænkt mig at gøre i mit terminal Vinduet her jeg har tænkt mig at 58 00:02:48,600 --> 00:02:51,430 køre Clang snarere end Make, som automatiserer alle fire 59 00:02:51,430 --> 00:02:52,870 disse skridt for os. 60 00:02:52,870 --> 00:02:58,620 Og jeg har tænkt mig at gøre clang-S og derefter hello.c og derefter indtaste. 61 00:02:58,620 --> 00:03:00,590 >> Og jeg får en blinkende prompt igen, hvilket er godt. 62 00:03:00,590 --> 00:03:05,280 Og nu i et lidt større vindue, Jeg har tænkt mig at åbne op gedit her. 63 00:03:05,280 --> 00:03:09,610 Og jeg har tænkt mig at åbne en fil, der, viser sig, kaldes hello.s dette 64 00:03:09,610 --> 00:03:11,870 indeholder dette assembler Jeg nævnte tidligere. 65 00:03:11,870 --> 00:03:15,060 Og dette er, hvad der kaldes forsamling sprog, forholdsvis lavt niveau 66 00:03:15,060 --> 00:03:18,470 instruktioner, din Intel CPU eller hvad det er, der er inde 67 00:03:18,470 --> 00:03:19,350 forstår. 68 00:03:19,350 --> 00:03:24,480 Og mov er træk. opkaldet er til ringer, et meget lavt niveau funktion. 69 00:03:24,480 --> 00:03:26,380 sub er subtrahere. 70 00:03:26,380 --> 00:03:30,370 >> Så når du har en særlig CPU inde på din computer, der gør, hvad det 71 00:03:30,370 --> 00:03:34,300 særskilte versus andre CPU'er på marked, som er instruktioner, den 72 00:03:34,300 --> 00:03:39,460 forstår og ofte hvor effektivt det er, hvor hurtigt det er på fuldbyrdelsesstatens nogle 73 00:03:39,460 --> 00:03:40,380 af disse instruktioner. 74 00:03:40,380 --> 00:03:45,150 Nu til mere om dette, kan du tage næste Fall CS61 på college. 75 00:03:45,150 --> 00:03:48,170 Men her har vi for eksempel et par identifikatorer, der kan virke bekendt. 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 der er ikke meget af interesse der lige nu, minde om, at teksten 79 00:03:54,190 --> 00:03:59,190 segment, som mandag, hvor er i hukommelse dit program faktisk ender. 80 00:03:59,190 --> 00:04:01,330 Så det er i hvert fald vagt velkendt der. 81 00:04:01,330 --> 00:04:03,730 Her er naturligvis en omtale af vores vigtigste funktion. 82 00:04:03,730 --> 00:04:07,220 Rulle ned, disse refererer til ting såkaldte registre, meget små bidder af 83 00:04:07,220 --> 00:04:09,190 hukommelse inde i din faktiske CPU. 84 00:04:09,190 --> 00:04:12,930 Og hvis jeg ruller ned endnu videre, ser jeg en slags 85 00:04:12,930 --> 00:04:14,240 indirekte omtale af ASCII. 86 00:04:14,240 --> 00:04:17,120 Og der, ja, er denne streng, hej, komma, verden. 87 00:04:17,120 --> 00:04:20,079 >> Så lang historie kort, har dette været sker for dig, automatisk, 88 00:04:20,079 --> 00:04:22,140 under hætten al den tid. 89 00:04:22,140 --> 00:04:26,450 Og hvad der er sket er virkelig gang du har kørt Clang, eller i form af 90 00:04:26,450 --> 00:04:29,150 Gør, du får først, fra kildekoden, den 91 00:04:29,150 --> 00:04:30,700 såkaldte assembler. 92 00:04:30,700 --> 00:04:35,210 Derefter Clang er at konvertere denne forsamling sproget ned til nuller og ettaller. 93 00:04:35,210 --> 00:04:38,340 Og det er det dias, vi startede vores diskussion i uge 0 på - 94 00:04:38,340 --> 00:04:39,840 og derefter Uge 1 på. 95 00:04:39,840 --> 00:04:44,030 Og så endelig, de nuller og ettaller kombineres med nuller og ettaller 96 00:04:44,030 --> 00:04:47,190 fra de biblioteker, vi har taget for givet som Standard I / O eller 97 00:04:47,190 --> 00:04:50,010 String Bibliotek eller endda Den CS50 biblioteket. 98 00:04:50,010 --> 00:04:54,200 >> Så for at skabe dette billede mere visuelt har vi hello.c. 99 00:04:54,200 --> 00:04:57,220 Og det, selvfølgelig, bruger printf fungere til at sige, hej verden. 100 00:04:57,220 --> 00:05:01,810 Opgørelsen skridt tager det ned til pågældende fil vi lige så hello.s, selv 101 00:05:01,810 --> 00:05:04,290 selv om det typisk er slettet automatisk for dig. 102 00:05:04,290 --> 00:05:06,050 Men det er samling kode i midten trin. 103 00:05:06,050 --> 00:05:09,750 Og når vi samler forsamlingen sprog, så at sige, det er når du 104 00:05:09,750 --> 00:05:10,830 få disse nuller og ettaller. 105 00:05:10,830 --> 00:05:13,920 Så vi har zoomet ind effektivt i dag hvad vi har taget for givet, 106 00:05:13,920 --> 00:05:16,430 betyder at gå kildekode at gøre indsigelse kode. 107 00:05:16,430 --> 00:05:18,850 >> Men endelig nu, at samme billede - Lad os skubbe den over til 108 00:05:18,850 --> 00:05:20,020 venstre side. 109 00:05:20,020 --> 00:05:22,880 Og bemærk, at der i toppen er der Jeg nævnte stdio.h. 110 00:05:22,880 --> 00:05:25,030 Det er en fil, som vi har inkluderet i næsten alle 111 00:05:25,030 --> 00:05:26,250 programmer, som vi har skrevet. 112 00:05:26,250 --> 00:05:28,830 Og det er den fil, hvis indhold få kopi klistret, 113 00:05:28,830 --> 00:05:30,350 effektivt oven på din kode. 114 00:05:30,350 --> 00:05:34,170 Men det viser sig, at, på en computer Systemet eller andet sted, er der formentlig en 115 00:05:34,170 --> 00:05:39,150 stdio.c fil, nogen skrev år siden, implementerer alle de 116 00:05:39,150 --> 00:05:41,870 funktioner, der blev erklæret i stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Nu i virkeligheden er det nok ikke på din Mac eller din PC eller endda i 118 00:05:45,465 --> 00:05:47,660 CS50 apparat er en rå C-kode. 119 00:05:47,660 --> 00:05:52,710 Nogen allerede kompileret den og omfattede . O fil til objektkode eller. En 120 00:05:52,710 --> 00:05:56,020 fil, som refererer til en delt bibliotek der er blevet præ-installeret og 121 00:05:56,020 --> 00:05:57,240 prækompilerede for dig. 122 00:05:57,240 --> 00:06:01,950 Men formoder, at der faktisk eksisterer på vores computer stdio.c parallelt 123 00:06:01,950 --> 00:06:02,650 med Clang. 124 00:06:02,650 --> 00:06:04,960 Din kode der bliver kompileret og samlet. 125 00:06:04,960 --> 00:06:09,200 stdio.c 's kode bliver kompileret og samles, således at dette allersidste 126 00:06:09,200 --> 00:06:13,730 trin, hernede har vi en eller anden måde link, så at sige, dine nuller og ettaller 127 00:06:13,730 --> 00:06:18,430 med hans eller hendes nuller og ettaller i én simpelt program, der i sidste ende er 128 00:06:18,430 --> 00:06:20,540 kaldes bare Hello. 129 00:06:20,540 --> 00:06:23,340 >> Så det er alt den magi, der er er sket hidtil. 130 00:06:23,340 --> 00:06:26,430 Og vil fortsætte med at tage dem processer for givet, men indse 131 00:06:26,430 --> 00:06:28,750 Der er en masse saftige detaljer foregår nedenunder der. 132 00:06:28,750 --> 00:06:31,920 Og det er hvad der gør din computer med Intel indeni 133 00:06:31,920 --> 00:06:33,940 særligt tydelig. 134 00:06:33,940 --> 00:06:37,020 >> Så på dette notat, at hvis du gerne vil slutte sig til os til frokost denne fredag, gøre gå 135 00:06:37,020 --> 00:06:41,570 til det sædvanlige cs50.net/rsvp, 13:15 denne fredag. 136 00:06:41,570 --> 00:06:43,400 Og nu et par annonceringer. 137 00:06:43,400 --> 00:06:44,670 Så vi har nogle gode nyheder. 138 00:06:44,670 --> 00:06:45,970 Og vi har nogle dårlige nyheder. 139 00:06:45,970 --> 00:06:47,260 Start med nogle gode nyheder her. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Stønnende] 142 00:06:54,510 --> 00:06:54,710 >> Ok. 143 00:06:54,710 --> 00:06:56,670 Tja, det er teknisk set en ferie, så det er ikke så meget en gave fra os. 144 00:06:56,670 --> 00:06:58,030 Men så dårlige nyheder selvfølgelig. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Stønnende] 147 00:07:01,880 --> 00:07:03,530 >> Jeg brugte en masse tid på disse animationer. 148 00:07:03,530 --> 00:07:04,690 >> [Latter] 149 00:07:04,690 --> 00:07:07,000 >> Der vil være en gennemgang session det kommende mandag. 150 00:07:07,000 --> 00:07:08,340 Det kommer til at være på 5:30. 151 00:07:08,340 --> 00:07:11,210 Vi vil minde dig om alle disse detaljer via e-mail på kursets 152 00:07:11,210 --> 00:07:13,470 hjemmeside på bare et par dage tid. 153 00:07:13,470 --> 00:07:16,610 Det filmes og gøres tilgængelige kort tid derefter. 154 00:07:16,610 --> 00:07:19,200 Så hvis du ikke kan gøre at mandag nat slot, så fortvivl ikke. 155 00:07:19,200 --> 00:07:22,270 Sektioner i den kommende uge også vil fokus på review for quizzen. 156 00:07:22,270 --> 00:07:25,670 Hvis din afdeling er på mandag, som er faktisk universitet ferie, vil vi 157 00:07:25,670 --> 00:07:26,920 stadig mødes i sektionen. 158 00:07:26,920 --> 00:07:28,890 Hvis du kan simpelthen ikke gøre det afsnit, fordi du går 159 00:07:28,890 --> 00:07:29,860 væk, det er fint. 160 00:07:29,860 --> 00:07:33,710 Deltag en søndag eller tirsdag sektion eller tune-in til Jasons sektion, der er 161 00:07:33,710 --> 00:07:35,110 tilgængelige online. 162 00:07:35,110 --> 00:07:37,490 >> Så flere dårlige nyheder. 163 00:07:37,490 --> 00:07:41,960 Så ifølge pensum, vi har foredrag næste fredag. 164 00:07:41,960 --> 00:07:43,690 Men de gode nyheder - 165 00:07:43,690 --> 00:07:44,860 klart, jeg brugte for meget tid på dette. 166 00:07:44,860 --> 00:07:45,280 >> [Latter] 167 00:07:45,280 --> 00:07:47,140 >> Vi vil aflyse næste fredagens foredrag. 168 00:07:47,140 --> 00:07:50,590 Så det vil være en gave for os, så du virkelig kan have en nice pusterum i 169 00:07:50,590 --> 00:07:52,990 mellem denne uge og to uger senere. 170 00:07:52,990 --> 00:07:57,460 Så ingen forelæsninger i næste uge, bare en lille lille quiz, hvor du skal være 171 00:07:57,460 --> 00:07:59,030 bliver mere og mere ophidset. 172 00:07:59,030 --> 00:08:03,870 >> Så lad os nu vende vores opmærksomhed mod noget, der er faktisk mere visuel 173 00:08:03,870 --> 00:08:06,990 og mere spændende og til at sætte scenen for, hvad der kommer til at være i horisonten 174 00:08:06,990 --> 00:08:08,420 på bare et par uger tid. 175 00:08:08,420 --> 00:08:12,160 Efter den første quiz, vil vi vende fokus på vores problem sæt til en anden 176 00:08:12,160 --> 00:08:16,710 domænespecifikke problem, nemlig retsvidenskab eller sikkerhed mere generelt. 177 00:08:16,710 --> 00:08:19,550 >> Faktisk tradition med dette problem sæt er for mig en af ​​de 178 00:08:19,550 --> 00:08:24,850 undervisning kollega eller CA'er at gå på tværs campus tage nogle fotografier af 179 00:08:24,850 --> 00:08:29,450 identificerbare, men ikke indlysende mennesker, steder, eller ting, så hvert år I 180 00:08:29,450 --> 00:08:34,520 en eller anden måde formår at komme til at slette eller ødelægge det digitale mediekort 181 00:08:34,520 --> 00:08:35,720 der er inde i vores kamera. 182 00:08:35,720 --> 00:08:36,860 Men nogen big deal. 183 00:08:36,860 --> 00:08:39,200 Jeg kan gå videre og sætte der ind i min computer. 184 00:08:39,200 --> 00:08:43,010 Jeg kan lave en retsmedicinsk billede af det, så til at tale, ved at kopiere nuller og 185 00:08:43,010 --> 00:08:46,830 dem ud af det hukommelseskort, uanset dens et SD-kort eller compact flash-kort eller 186 00:08:46,830 --> 00:08:48,100 uanset hvad du er fortrolig med. 187 00:08:48,100 --> 00:08:49,300 Og så kan vi uddele det ud. 188 00:08:49,300 --> 00:08:53,190 >> Og så udfordringen forude, blandt andet ting for dig, vil være at skrive 189 00:08:53,190 --> 00:08:58,630 C-kode, der genvinder en hel masse JPEG for mig og afslørede vil være 190 00:08:58,630 --> 00:09:00,190 de mennesker, steder eller ting. 191 00:09:00,190 --> 00:09:03,340 Og vi vil også tale på dette problem indstille og i de kommende dage, om 192 00:09:03,340 --> 00:09:04,440 grafik mere generelt. 193 00:09:04,440 --> 00:09:06,140 Vi har brugt dem, et kursus, for bryde ud. 194 00:09:06,140 --> 00:09:09,080 Men du har slags tages for givet der eksisterer disse høje niveau begreber 195 00:09:09,080 --> 00:09:10,680 af rektangler og ovaler. 196 00:09:10,680 --> 00:09:12,450 Men under hætten der er pixels. 197 00:09:12,450 --> 00:09:14,370 Og du har haft til at starte tænker om dem. 198 00:09:14,370 --> 00:09:18,800 Eller vil du for p-sæt 4 nødt til at tænke om kløften mellem dine mursten, hvordan 199 00:09:18,800 --> 00:09:21,990 hurtigt du bolden bevæger sig hen over skærmbilledet til bryde ud. 200 00:09:21,990 --> 00:09:24,830 Så der er denne forestilling om det prikker på skærmen, der er 201 00:09:24,830 --> 00:09:26,290 kommer i spil allerede. 202 00:09:26,290 --> 00:09:29,430 >> Nu, hvad du ser, er imidlertid, hvad du får på en computerskærm. 203 00:09:29,430 --> 00:09:33,680 Hvis du nogensinde har set nogle gode eller dårlig TV, odds er de temmelig meget 204 00:09:33,680 --> 00:09:36,280 behandle publikum som technophobes der ikke rigtig 205 00:09:36,280 --> 00:09:37,630 ved meget om computing. 206 00:09:37,630 --> 00:09:40,840 Og så det er meget nemt for politiet detektiv til at sige, du kan 207 00:09:40,840 --> 00:09:41,710 rent, at op til mig? 208 00:09:41,710 --> 00:09:42,710 Eller forbedre, right? 209 00:09:42,710 --> 00:09:45,550 Øge er ligesom modeord i de fleste helst forbrydelse relateret show. 210 00:09:45,550 --> 00:09:49,240 Og virkeligheden er, hvis du tager et meget sløret billede af en mistænkt gøre 211 00:09:49,240 --> 00:09:51,620 noget dårligt, kan du ikke bare forbedre det. 212 00:09:51,620 --> 00:09:53,080 Du kan ikke zoome ind uendeligt. 213 00:09:53,080 --> 00:09:56,350 Du kan ikke se i glimt af nogens eye, der har begået, at 214 00:09:56,350 --> 00:09:59,860 særlig forbrydelse, trods forekomsten af ​​dette på TV. 215 00:09:59,860 --> 00:10:04,110 >> Og så med det lad os motivere, at kommende problem sæt med et glimt 216 00:10:04,110 --> 00:10:05,765 nogle shows, som du kan være bekendt. 217 00:10:05,765 --> 00:10:06,500 >> [VIDEO AFSPIL] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Lad os nu få et godt kig på dig. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Hold den. 222 00:10:17,766 --> 00:10:18,658 Kør den tilbage. 223 00:10:18,658 --> 00:10:19,550 >> -Vent lidt. 224 00:10:19,550 --> 00:10:21,580 Gå til højre. 225 00:10:21,580 --> 00:10:21,800 >> -Der. 226 00:10:21,800 --> 00:10:22,690 Frys det. 227 00:10:22,690 --> 00:10:23,692 >> -Fuld skærm. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Frys det. 230 00:10:24,154 --> 00:10:25,140 >> -Stram op på det, vil ya? 231 00:10:25,140 --> 00:10:27,090 >> -Vector ind på den fyr af baghjulet. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom i lige her på dette sted. 233 00:10:29,730 --> 00:10:33,700 >> -Med det rigtige udstyr, filmede kan forstørres og slibes. 234 00:10:33,700 --> 00:10:34,490 >> -Hvad 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 op nogen? 237 00:10:36,793 --> 00:10:38,560 >> -Jeg ved det ikke. 238 00:10:38,560 --> 00:10:39,090 Lad os styrke det. 239 00:10:39,090 --> 00:10:41,690 >> -Øge afsnit A-6. 240 00:10:41,690 --> 00:10:43,510 >> -I forbedret detaljer og - 241 00:10:43,510 --> 00:10:44,456 >> -Jeg tror, ​​der er nok til at forbedre. 242 00:10:44,456 --> 00:10:45,402 Slip det til min skærm. 243 00:10:45,402 --> 00:10:47,300 >> -Øge refleksion i hendes øje. 244 00:10:47,300 --> 00:10:49,330 >> -Lad os køre dette gennem video ekstraudstyr. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, kan du forbedre det? 246 00:10:50,340 --> 00:10:52,320 >> -Vent. 247 00:10:52,320 --> 00:10:54,290 >> -Jeg har arbejdet på denne refleksion. 248 00:10:54,290 --> 00:10:55,560 >> -Nogen refleksion. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Der er en refleksion af mandens ansigt. 251 00:10:57,940 --> 00:10:58,860 >> -The refleksion. 252 00:10:58,860 --> 00:10:59,710 >> -Der er en refleksion. 253 00:10:59,710 --> 00:11:00,900 >> -Zoom ind på spejlet. 254 00:11:00,900 --> 00:11:03,500 >> -Du kan se en refleksion. 255 00:11:03,500 --> 00:11:04,700 >> -Kan du forbedre billedet herfra? 256 00:11:04,700 --> 00:11:05,700 >> -Kan du forbedre ham lige her? 257 00:11:05,700 --> 00:11:06,500 >> -Kan du forbedre det? 258 00:11:06,500 --> 00:11:07,380 >> -Kan du forbedre det? 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 det? 261 00:11:08,940 --> 00:11:10,280 >> -Hold på et sekund, jeg forbedre. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom ind 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 >> -Flyt i. 267 00:11:14,360 --> 00:11:15,100 >> -Vent, stop. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> -Pause det. 270 00:11:16,290 --> 00:11:19,390 >> -Rotere et 75 grader rundt den lodrette venligst. 271 00:11:19,390 --> 00:11:19,886 >> [Latter] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, og tilbage til den del om døren igen. 273 00:11:24,350 --> 00:11:26,330 >> -Fik et billede forstærker der kan bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Måske kan vi bruge Pradeep Sen metode til at se ind i vinduerne. 275 00:11:28,990 --> 00:11:30,680 >> -Denne software er state of the art. 276 00:11:30,680 --> 00:11:31,676 >> -Ikonet værdien er slukket. 277 00:11:31,676 --> 00:11:34,166 >> -Med den rette kombination af algoritmer. 278 00:11:34,166 --> 00:11:38,399 >> -Han har taget belysning algoritmer til det næste niveau, og jeg kan bruge dem til at 279 00:11:38,399 --> 00:11:38,648 forbedre dette fotografi. 280 00:11:38,648 --> 00:11:42,050 >> -Lock til og udvide z-aksen. 281 00:11:42,050 --> 00:11:42,760 >> -Enhance. 282 00:11:42,760 --> 00:11:43,060 >> -Enhance. 283 00:11:43,060 --> 00:11:43,760 >> -Enhance. 284 00:11:43,760 --> 00:11:45,010 >> -Frys og forbedre. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END VIDEOAFSPILNING] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. MALAN: So Problem Set 5 er det, der ligger forude der. 288 00:11:51,470 --> 00:11:55,260 Så vi vil snart få en bedre forståelse af, hvornår og hvorfor du kan 289 00:11:55,260 --> 00:11:57,300 og vores kan ikke forbedre på den måde. 290 00:11:57,300 --> 00:12:00,090 Men først, lad os vende vores opmærksomhed til nogle af de byggesten, vi 291 00:12:00,090 --> 00:12:02,250 skal være i stand til at fortælle den historie. 292 00:12:02,250 --> 00:12:05,580 >> Så minde om, at vi tegnede det billede på Mandag og en lille smule i sidste uge. 293 00:12:05,580 --> 00:12:09,970 Og det beskriver layoutet af ting i computerens hukommelse, når 294 00:12:09,970 --> 00:12:11,000 kører nogle program. 295 00:12:11,000 --> 00:12:14,310 Den tech segment op toppen, tilbagekaldelse, refererer til de faktiske nuller og ettaller 296 00:12:14,310 --> 00:12:16,000 der komponere dit program. 297 00:12:16,000 --> 00:12:19,340 Der er, under det, nogle initialiseret eller startværdi data, der typisk 298 00:12:19,340 --> 00:12:22,910 refererer til ting som konstanter eller strenge eller globale variabler, der har 299 00:12:22,910 --> 00:12:24,200 blevet erklæret i forvejen. 300 00:12:24,200 --> 00:12:26,500 Der er den bunke, men vi vil komme tilbage til om lidt. 301 00:12:26,500 --> 00:12:27,410 >> Og så er der i stakken. 302 00:12:27,410 --> 00:12:30,660 Meget gerne en stak af bakker i cafeteria, det er her hukommelsen bliver 303 00:12:30,660 --> 00:12:33,610 lagdelt og lagdelte når du gør det, der i et program? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Hvad er stakken brug for? 306 00:12:37,730 --> 00:12:39,320 >> Ja? 307 00:12:39,320 --> 00:12:40,000 >> Kald af funktion. 308 00:12:40,000 --> 00:12:42,890 Hver gang du kalde en funktion, er det gives til splint af hukommelse til sin 309 00:12:42,890 --> 00:12:45,020 lokale variable eller dets parametre. 310 00:12:45,020 --> 00:12:48,810 Og billedligt, ser vi, at med hvert successiv funktion kaldes, når A 311 00:12:48,810 --> 00:12:52,520 opkald B opkald C opkald D, de bliver lagdelt på stakken. 312 00:12:52,520 --> 00:12:55,630 Og inden for hver af disse skiver hukommelse er hovedsagelig en unik anvendelsesområde 313 00:12:55,630 --> 00:12:58,590 for denne funktion, hvilket naturligvis er problematisk, hvis du ønsker at aflevere 314 00:12:58,590 --> 00:13:01,850 fra én funktion til en anden A stykke af data, som du ønsker det 315 00:13:01,850 --> 00:13:03,500 at mutere eller ændre. 316 00:13:03,500 --> 00:13:08,060 >> Så hvad var vores løsning til at gøre det muligt En funktion repræsenteret ved en stabel 317 00:13:08,060 --> 00:13:11,390 rammen til at ændre hukommelsen indeni af en anden stakramme? 318 00:13:11,390 --> 00:13:14,590 Hvordan de to talk til hinanden? 319 00:13:14,590 --> 00:13:18,510 Så ved hjælp af pegepinde eller adresser, , som igen blot beskrive, hvor i 320 00:13:18,510 --> 00:13:22,280 hukommelse, ved hjælp af en specifik bid nummer, den særlige 321 00:13:22,280 --> 00:13:23,830 værdi kan findes. 322 00:13:23,830 --> 00:13:26,860 Så huske sidste gang vi også fortsat historien og kiggede på et 323 00:13:26,860 --> 00:13:28,280 temmelig buggy program. 324 00:13:28,280 --> 00:13:32,900 Og dette program er buggy for et par årsager, men den mest bekymrende ene er 325 00:13:32,900 --> 00:13:34,620 fordi den ikke kontrollere, hvad? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ja, det undlader at kontrollere input. 328 00:13:40,450 --> 00:13:41,870 Undskyld? 329 00:13:41,870 --> 00:13:43,880 >> Hvis det er mere end 12 tegn. 330 00:13:43,880 --> 00:13:47,260 Så meget fornuftigt, når du ringer memcopy, der, som navnet antyder, kun 331 00:13:47,260 --> 00:13:50,630 kopier hukommelse fra sit andet argument i sin første argument. 332 00:13:50,630 --> 00:13:54,730 Det tredje argument, meget fornuftigt, er kontrolleres for at sikre, at du ikke 333 00:13:54,730 --> 00:13:59,400 kopiere mere end i dette tilfælde, længden af bar, antal tegn 334 00:13:59,400 --> 00:14:03,810 i den destination, er denne matrix C. Men problemet er, at hvad 335 00:14:03,810 --> 00:14:07,230 hvis C ikke selv er stor nok til at håndtere det? 336 00:14:07,230 --> 00:14:09,900 Du kommer til at kopiere det antal bytes, som du har fået. 337 00:14:09,900 --> 00:14:13,040 Men hvad gør du faktisk har mere bytes, end du har plads til? 338 00:14:13,040 --> 00:14:16,770 >> Nå, dette program er meget tåbeligt bare blindt provenuet til at tage, hvad det er 339 00:14:16,770 --> 00:14:20,650 givet, hej backslash 0 er fantastisk, hvis strengen er kort 340 00:14:20,650 --> 00:14:22,040 nok, ligesom fem tegn. 341 00:14:22,040 --> 00:14:26,470 Men hvis det er faktisk 12 tegn eller 1.200 tegn, så vi sidste gang 342 00:14:26,470 --> 00:14:29,380 at du bare vil helt overskrive hukommelsen at 343 00:14:29,380 --> 00:14:30,470 ikke tilhører dig. 344 00:14:30,470 --> 00:14:34,390 Og værste fald, hvis du overskrive red portion der, vi kaldte 345 00:14:34,390 --> 00:14:35,380 returadresse - 346 00:14:35,380 --> 00:14:38,370 dette er blot, hvor computeren automatisk, for dig, bag 347 00:14:38,370 --> 00:14:43,130 scener, putter væk en 32-bit værdi, Det minder til hvilken adresse bør det 348 00:14:43,130 --> 00:14:47,080 vende tilbage når foo denne anden funktion, sker udførelse. 349 00:14:47,080 --> 00:14:49,320 Det er en brødkrumme af sorterer hvortil den vender tilbage. 350 00:14:49,320 --> 00:14:52,490 Hvis du overskriver det potentielt hvis du er den dårlige fyr, kan kunne 351 00:14:52,490 --> 00:14:54,750 potentielt overtage andens computer. 352 00:14:54,750 --> 00:14:58,020 Og du vil helt sikkert nedbrud det i de fleste tilfælde. 353 00:14:58,020 --> 00:15:01,690 >> Nu er dette problem blev kun forværret da vi begyndte at tale om hukommelsen 354 00:15:01,690 --> 00:15:03,010 ledelse mere generelt. 355 00:15:03,010 --> 00:15:07,150 Og malloc, for hukommelse tildeling, er en funktionen, som vi kan bruge til at tildele 356 00:15:07,150 --> 00:15:11,260 hukommelse, når vi ikke kender i forvejen at vi måske har brug for nogle. 357 00:15:11,260 --> 00:15:13,960 Så, for eksempel, hvis jeg går tilbage til apparatet her. 358 00:15:13,960 --> 00:15:21,010 Og jeg åbner op fra sidste gang hello2.c, genkalde dette program her, som så 359 00:15:21,010 --> 00:15:23,500 lidt noget som dette, kun tre linjer - 360 00:15:23,500 --> 00:15:27,940 oplyse dit navn, så string navn, til venstre, er lig getString. 361 00:15:27,940 --> 00:15:29,690 Og så skal vi printe det ud, brugerens navn. 362 00:15:29,690 --> 00:15:31,170 >> Så det var en super simpelt program. 363 00:15:31,170 --> 00:15:34,870 For at være klar, så lad mig gå videre og gøre goddag-2. 364 00:15:34,870 --> 00:15:36,680 Jeg har tænkt mig at gøre dot slash hej-2. 365 00:15:36,680 --> 00:15:37,750 Oplyse dit 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 Hej David. 369 00:15:39,540 --> 00:15:41,060 Det synes at arbejde OK. 370 00:15:41,060 --> 00:15:43,140 Men hvad der virkelig foregår under hood her? 371 00:15:43,140 --> 00:15:44,670 Først lad os skrælle nogle lag. 372 00:15:44,670 --> 00:15:48,380 String er blot et synonym vi har realiseret for hvad? 373 00:15:48,380 --> 00:15:49,110 Char stjerne. 374 00:15:49,110 --> 00:15:52,740 Så lad os gøre det lidt mere mystisk men mere teknisk korrekt, at dette 375 00:15:52,740 --> 00:15:55,570 er en char stjerne, hvilket betyder, at navn, ja, er en variabel. 376 00:15:55,570 --> 00:15:59,920 Men hvad navn butikker er adressen på en char, som føles lidt mærkeligt 377 00:15:59,920 --> 00:16:01,050 fordi jeg får tilbage en streng. 378 00:16:01,050 --> 00:16:03,580 Jeg får tilbage multiple chars ikke en char. 379 00:16:03,580 --> 00:16:07,400 >> Men selvfølgelig, behøver du kun den første char adresse at huske, hvor de 380 00:16:07,400 --> 00:16:08,870 Hele streng er fordi hvorfor? 381 00:16:08,870 --> 00:16:12,700 Hvordan du regne ud, hvor enden af snoren kende starten? 382 00:16:12,700 --> 00:16:13,630 Den backslash nul. 383 00:16:13,630 --> 00:16:17,260 Så med disse to spor du regne ud før begyndelsen og slutningen af 384 00:16:17,260 --> 00:16:20,280 enhver streng er, så længe de er korrekt dannet med denne null 385 00:16:20,280 --> 00:16:22,110 terminator, at backslash nul. 386 00:16:22,110 --> 00:16:24,520 >> Men det kalder getString. 387 00:16:24,520 --> 00:16:28,020 Og det viser sig, at getString al denne tid har været slags 388 00:16:28,020 --> 00:16:28,820 snyd for os. 389 00:16:28,820 --> 00:16:32,460 Det har gjort dette arbejde, at være sikker, få en streng fra brugeren. 390 00:16:32,460 --> 00:16:34,580 Men hvor er, at hukommelsen blevet kommer fra? 391 00:16:34,580 --> 00:16:38,440 Hvis vi går tilbage til billedet her og anvende definitionen fra blot en 392 00:16:38,440 --> 00:16:42,610 øjeblik siden, at stakken er hvor hukommelsen går, når funktioner kaldes, 393 00:16:42,610 --> 00:16:45,370 af denne logik, når du kalder getString og så vil jeg skrive i 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Indtast, hvor er D-A-V-I-D backslash nul oplagres, baseret på 395 00:16:50,900 --> 00:16:53,480 historie, vi har fortalt os videre? 396 00:16:53,480 --> 00:16:55,190 >> Det synes at være i stakken, right? 397 00:16:55,190 --> 00:16:58,120 Når du ringer får streng, du får en lille bid af hukommelse på stakken. 398 00:16:58,120 --> 00:17:01,630 Så det er indlysende, at D-A-V-I-D backslash nul lagres 399 00:17:01,630 --> 00:17:02,770 der i stakken. 400 00:17:02,770 --> 00:17:07,680 Men vent et øjeblik, getString afkast denne streng, så at sige, hvilket betyder 401 00:17:07,680 --> 00:17:11,700 det er bakke fra cafeteria tages fra stakken. 402 00:17:11,700 --> 00:17:14,560 Og vi sagde sidste gang, at så snart en funktionen returnerer, og du tager det 403 00:17:14,560 --> 00:17:20,109 bakke, så at sige, fra stakken, hvad kan du gå ud om resterne af 404 00:17:20,109 --> 00:17:21,819 at hukommelsen? 405 00:17:21,819 --> 00:17:25,160 Jeg slags redrew dem som spørgsmålstegn fordi de reelt blive 406 00:17:25,160 --> 00:17:26,250 ukendte værdier. 407 00:17:26,250 --> 00:17:29,500 De kan genbruges, når nogle næste funktion kaldes. 408 00:17:29,500 --> 00:17:31,870 >> Med andre ord, hvis vi tilfældigvis at lagre - 409 00:17:31,870 --> 00:17:34,350 Jeg vil tegne et hurtigt billede her i stakken. 410 00:17:34,350 --> 00:17:38,690 Hvis vi tilfældigvis trække bunden af min hukommelse segment, og vi vil sige 411 00:17:38,690 --> 00:17:42,230 at dette er stedet for hukommelse besat af main og måske arg c og 412 00:17:42,230 --> 00:17:46,790 arg v og alt andet i programmet, når getString kaldes, 413 00:17:46,790 --> 00:17:51,120 formentlig getString får en luns af hukommelse her. 414 00:17:51,120 --> 00:17:53,940 Og derefter D-A-V-I-D måde ender i denne funktion. 415 00:17:53,940 --> 00:17:55,320 Og jeg har tænkt mig at forsimpler. 416 00:17:55,320 --> 00:18:00,050 Men lad os antage, at dens D-A-V-I-D backslash nul. 417 00:18:00,050 --> 00:18:03,500 Så så mange bytes anvendes i rammen for getString. 418 00:18:03,500 --> 00:18:08,270 >> Men så snart getString afkast, vi sagde sidste gang, at denne hukommelse i løbet af 419 00:18:08,270 --> 00:18:11,340 Her bliver alt - woops! - 420 00:18:11,340 --> 00:18:14,270 alt bliver effektivt slettet. 421 00:18:14,270 --> 00:18:17,220 Og vi kan tænke på dette nu som spørgsmål varemærker, fordi der kender 422 00:18:17,220 --> 00:18:18,720 hvad der kommer til at blive i denne hukommelse. 423 00:18:18,720 --> 00:18:22,130 Ja, jeg er meget ofte kalder funktioner andre end getString. 424 00:18:22,130 --> 00:18:24,750 Og så snart jeg kalder nogle andre funktion end getString, måske ikke i 425 00:18:24,750 --> 00:18:28,860 dette program, vi kiggede lige på men nogle andre, sikkert nogle andre 426 00:18:28,860 --> 00:18:34,180 Funktionen kan ende med at blive givet denne næste stedet i stakken. 427 00:18:34,180 --> 00:18:39,410 >> Så det kan ikke være, at getString butikker D-A-V-I-D på stakken, fordi jeg ville 428 00:18:39,410 --> 00:18:41,040 straks mister adgangen til det. 429 00:18:41,040 --> 00:18:43,720 Men vi ved, at de getString returnerer kun hvad? 430 00:18:43,720 --> 00:18:47,220 Det er ikke at vende tilbage til mig seks tegn. 431 00:18:47,220 --> 00:18:51,090 Hvad det virkelig tilbage gjorde vi konkludere sidste gang? 432 00:18:51,090 --> 00:18:52,480 Adressen på den første. 433 00:18:52,480 --> 00:18:56,650 Så en eller anden måde, da du ringede getString, det er at afsætte en luns af hukommelse til 434 00:18:56,650 --> 00:18:59,620 strengen at brugerne type og derefter returnere adresse på det. 435 00:18:59,620 --> 00:19:02,930 Og det viser sig, at når du ønsker at funktion til at allokere hukommelse i denne 436 00:19:02,930 --> 00:19:08,390 måde og vende tilbage til den person, der kaldte denne funktion, adressen på 437 00:19:08,390 --> 00:19:11,870 at bid af hukommelse, du absolut kan ikke sætte det i stakken på 438 00:19:11,870 --> 00:19:14,750 bund, fordi funktionelt er det bare vil ikke blive din meget 439 00:19:14,750 --> 00:19:17,800 hurtigt, så du kan sikkert gætte, hvor vi sandsynligvis kommer til at kaste det 440 00:19:17,800 --> 00:19:20,130 stedet, den såkaldte bunke. 441 00:19:20,130 --> 00:19:25,290 >> Så mellem bunden af ​​din hukommelse er layout og toppen af ​​din hukommelse er 442 00:19:25,290 --> 00:19:26,820 layout er en hel bunke af segmenter. 443 00:19:26,820 --> 00:19:29,270 Ene er stakken, og højre ovenfor er den bunke. 444 00:19:29,270 --> 00:19:33,680 Og bunke er bare en anden luns af hukommelse, der er ikke brugt til funktioner 445 00:19:33,680 --> 00:19:34,770 når de er kaldt. 446 00:19:34,770 --> 00:19:38,100 Det bruges til på længere sigt hukommelse, når du vil have en funktion til at få fat 447 00:19:38,100 --> 00:19:42,700 hukommelse og være i stand til at hænge på til det uden at miste kontrol over det. 448 00:19:42,700 --> 00:19:45,550 >> Nu kunne man måske 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 Da dit program allokeret hukommelse på stakken, eller som du kalder mere og 451 00:19:51,350 --> 00:19:55,540 flere funktioner, eller som du tildeler hukommelse på den bunke med malloc ud som 452 00:19:55,540 --> 00:20:00,690 getString gør, hvad der tydeligvis synes at være uundgåelig problem? 453 00:20:00,690 --> 00:20:00,860 >> Right. 454 00:20:00,860 --> 00:20:03,150 Ligesom det faktum, at disse pile peger mod hinanden 455 00:20:03,150 --> 00:20:04,380 lover ikke godt. 456 00:20:04,380 --> 00:20:08,630 Og faktisk kunne vi meget hurtigt ned et program i en række forskellige måder. 457 00:20:08,630 --> 00:20:12,050 Faktisk tror jeg, vi kunne have gjort dette uheld gang. 458 00:20:12,050 --> 00:20:14,020 Eller hvis ikke, så lad os gøre det bevidst nu. 459 00:20:14,020 --> 00:20:21,330 Lad mig gå videre og skrive super hurtigt et program kaldet dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Og nu vil jeg gå her og behøver skarpe omfatter stdio.h. 461 00:20:26,730 --> 00:20:32,620 Lad os erklære funktionen foo tager ingen argumenter, som er 462 00:20:32,620 --> 00:20:34,040 betegnet som godt ved ugyldig. 463 00:20:34,040 --> 00:20:37,830 >> Og det eneste foo kommer til at gøre, er opkald foo, hvilket formentlig ikke er det 464 00:20:37,830 --> 00:20:39,100 smarteste idé, men så må det være. 465 00:20:39,100 --> 00:20:40,490 Ent main ugyldig. 466 00:20:40,490 --> 00:20:45,270 Nu er det eneste hoved går at gøre, er at ringe foo så godt. 467 00:20:45,270 --> 00:20:51,050 Og bare for sjov, jeg kommer til at gå forude her og sige printf "Hello fra 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 gøre nogen fejl, Gør dontdothis dot skråstreg. 471 00:21:00,160 --> 00:21:01,960 Og lad os gøre det i en større vindue - 472 00:21:01,960 --> 00:21:03,210 dot skråstreg, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Kom. 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 Tilsyneladende, kan du gøre dette. 478 00:21:13,100 --> 00:21:15,190 Fandens. 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 Standby. 482 00:21:17,370 --> 00:21:18,270 Har vi - 483 00:21:18,270 --> 00:21:20,110 Vi brugte det med Make. 484 00:21:20,110 --> 00:21:22,050 >> [Suk] 485 00:21:22,050 --> 00:21:25,110 >> Jeg ved, men jeg tror, ​​vi lige har slettet det. 486 00:21:25,110 --> 00:21:28,410 Uh, ja. 487 00:21:28,410 --> 00:21:30,660 Fandens. 488 00:21:30,660 --> 00:21:32,640 Løs dette Rob. 489 00:21:32,640 --> 00:21:34,678 Hvad? 490 00:21:34,678 --> 00:21:35,928 Det er meget simpelt. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ja, vi vendte optimering slukket. 493 00:21:47,360 --> 00:21:48,970 OK, står bye. 494 00:21:48,970 --> 00:21:49,950 Nu føler jeg mig 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å lad os recompile dette - 498 00:21:53,430 --> 00:21:55,880 Gør dig dontdothis. 499 00:21:55,880 --> 00:22:00,090 Du har måske at omdøbe det til dothis.c på bare et øjeblik. 500 00:22:00,090 --> 00:22:00,710 Der går vi. 501 00:22:00,710 --> 00:22:01,240 Tak. 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 ved at udskrive ud af noget var faktisk lige 504 00:22:05,480 --> 00:22:08,150 bremse den proces, hvor vi ville have nået dette punkt. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Pyha! 507 00:22:08,870 --> 00:22:11,180 >> Så hvad der rent faktisk foregår? 508 00:22:11,180 --> 00:22:14,440 Årsagen til at der, lige som en sidebemærkning, er gør noget i form af input og 509 00:22:14,440 --> 00:22:17,270 output tendens til at være langsommere, fordi du nødt til at skrive tegn til 510 00:22:17,270 --> 00:22:18,600 skærmen, Den har for at rulle. 511 00:22:18,600 --> 00:22:21,720 Så lang historie kort, havde jeg faktisk skete så utålmodig, ville vi have 512 00:22:21,720 --> 00:22:23,260 set dette slutresultatet så godt. 513 00:22:23,260 --> 00:22:26,220 Nu, hvor jeg fik tur af print-ups, vi ser det med det samme. 514 00:22:26,220 --> 00:22:28,410 Så hvorfor er dette sker. 515 00:22:28,410 --> 00:22:31,300 Nå, den enkle forklaring, naturligvis, er, at foo burde nok ikke 516 00:22:31,300 --> 00:22:32,500 ringer selv. 517 00:22:32,500 --> 00:22:34,470 >> Nu i generelle vendinger, dette er rekursion. 518 00:22:34,470 --> 00:22:36,970 Og vi troede, et par uger siden rekursive er god. 519 00:22:36,970 --> 00:22:40,330 Rekursion er denne magiske måde udtrykke dig super kortfattet. 520 00:22:40,330 --> 00:22:41,400 Og det virker bare. 521 00:22:41,400 --> 00:22:45,060 Men der er et centralt element i alle de rekursive programmer, vi har talt 522 00:22:45,060 --> 00:22:48,260 om og kiggede på hidtil, hvilket var, at de havde hvad? 523 00:22:48,260 --> 00:22:52,610 En base case, som var nogle hårde kodet tilfælde sagt i nogle situationer 524 00:22:52,610 --> 00:22:56,210 ikke kalder foo, hvilket er klart ikke tilfældet her. 525 00:22:56,210 --> 00:22:58,920 >> Så hvad der virkelig sker i form af billedet? 526 00:22:58,920 --> 00:23:01,790 Nå, når main kalder foo, det får et stykke af hukommelse. 527 00:23:01,790 --> 00:23:04,150 Når foo kalder foo, får det et udsnit af hukommelse. 528 00:23:04,150 --> 00:23:06,430 Når foo kalder foo, det bliver en skive. 529 00:23:06,430 --> 00:23:07,080 Det får et stykke. 530 00:23:07,080 --> 00:23:08,120 Det får et stykke. 531 00:23:08,120 --> 00:23:09,460 Fordi foo aldrig vender tilbage. 532 00:23:09,460 --> 00:23:12,160 Vi aldrig sletning en af ​​dem frames fra stakken. 533 00:23:12,160 --> 00:23:15,930 Så vi blæser gennem den bunke, ikke at nævne, hvem ved hvad ellers, og 534 00:23:15,930 --> 00:23:19,600 vi overskride grænserne for vores såkaldte segment af hukommelse. 535 00:23:19,600 --> 00:23:21,790 Fejl gå segmentering falsk. 536 00:23:21,790 --> 00:23:24,110 >> Så den løsning, der er klart ikke gøre dette. 537 00:23:24,110 --> 00:23:28,830 Men jo større implikation er, at ja, der absolut er en vis grænse, 538 00:23:28,830 --> 00:23:32,470 selvom det ikke er veldefineret, til, hvordan mange funktioner, du kan ringe i en 539 00:23:32,470 --> 00:23:34,970 programmet, hvor mange gange en funktion kan kalde sig selv. 540 00:23:34,970 --> 00:23:38,430 Så selvom vi prædikede rekursion da dette potentielt magiske ting en 541 00:23:38,430 --> 00:23:41,870 par uger siden for sigma funktion, og når vi får data 542 00:23:41,870 --> 00:23:45,270 strukturer og CS50, vil du se andre applikationer til den, er det ikke 543 00:23:45,270 --> 00:23:46,500 nødvendigvis det bedste. 544 00:23:46,500 --> 00:23:50,070 For hvis en funktion kalder sig selv, kalder sig, selv om der er en base 545 00:23:50,070 --> 00:23:54,860 tilfælde, hvis du ikke rammer, at basisscenariet for 1.000 opkald eller 10.000 opkald ved 546 00:23:54,860 --> 00:23:58,800 den tid du måske har kørt ud af rummet på dit såkaldte stak og hit 547 00:23:58,800 --> 00:24:00,400 nogle andre segmenter af hukommelse. 548 00:24:00,400 --> 00:24:03,950 Så det er også et design trade-off mellem elegance og mellem 549 00:24:03,950 --> 00:24:06,920 robusthed din særlige gennemførelse. 550 00:24:06,920 --> 00:24:10,780 >> Så der er en anden ulempe eller anden Gotcha til, hvad vi har 551 00:24:10,780 --> 00:24:11,720 gjort hidtil. 552 00:24:11,720 --> 00:24:12,980 Når jeg kaldte getString - 553 00:24:12,980 --> 00:24:15,120 lad mig gå tilbage til goddag-2. 554 00:24:15,120 --> 00:24:18,170 Bemærk, at jeg ringer getString, der vender tilbage en adresse. 555 00:24:18,170 --> 00:24:20,730 Og vi hævder i dag, at adressen er fra den bunke. 556 00:24:20,730 --> 00:24:24,480 Og nu er jeg udskrive string på den adresse. 557 00:24:24,480 --> 00:24:27,000 Men vi har aldrig kaldt modsatte af getString. 558 00:24:27,000 --> 00:24:30,850 Vi har aldrig haft til at calll en funktion som ungetstring, hvor du afleverer tilbage 559 00:24:30,850 --> 00:24:31,610 denne hukommelse. 560 00:24:31,610 --> 00:24:33,250 Men helt ærligt vi sandsynligvis burde have været. 561 00:24:33,250 --> 00:24:37,390 For hvis vi holde beder computeren for hukommelse, måde ved en person som 562 00:24:37,390 --> 00:24:40,830 getString men aldrig give det tilbage, helt sikkert det er også forpligtet til at føre til 563 00:24:40,830 --> 00:24:42,970 problemer, hvor vi løber tør for hukommelse. 564 00:24:42,970 --> 00:24:46,140 >> Og i virkeligheden, kan vi se efter disse problemer med det nye værktøj, hvis forbrug 565 00:24:46,140 --> 00:24:47,640 er lidt kryptisk at skrive. 566 00:24:47,640 --> 00:24:50,960 Men lad mig gå videre og splash det op på skærmen på bare et øjeblik. 567 00:24:50,960 --> 00:24:56,940 Jeg har tænkt mig at gå videre og køre Valgrind med parameter hvis første kommando 568 00:24:56,940 --> 00:25:00,260 linje argument er navnet af dette program hej-2. 569 00:25:00,260 --> 00:25:02,650 Og desværre er det output er afskyeligt 570 00:25:02,650 --> 00:25:04,290 kompleks uden god grund. 571 00:25:04,290 --> 00:25:06,280 Så vi ser alt det rod. 572 00:25:06,280 --> 00:25:07,530 David er oplyse mit navn. 573 00:25:07,530 --> 00:25:09,760 Så det er programmet faktisk kører. 574 00:25:09,760 --> 00:25:11,180 Og nu får vi denne udgang. 575 00:25:11,180 --> 00:25:13,400 >> Så Valgrind ligner 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 en hukommelse checker. 578 00:25:16,270 --> 00:25:20,140 Det er et program, der vil køre din programmere og fortælle dig, hvis du spurgte en 579 00:25:20,140 --> 00:25:23,860 computer for hukommelsen og aldrig gav den tilbage, og derved betyder, at du har 580 00:25:23,860 --> 00:25:24,570 en hukommelsesfejl. 581 00:25:24,570 --> 00:25:26,240 Og memory leaks tendens til at være dårlig. 582 00:25:26,240 --> 00:25:29,120 Og du er brugere af computere har formentlig følte det, 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 nogensinde brugt din computer for mens og ikke genstartet i flere 585 00:25:33,730 --> 00:25:36,820 dage, eller du har bare fået en masse programmer, der kører, og skid 586 00:25:36,820 --> 00:25:42,360 bremser i stå, eller i det mindste det er super irriterende at bruge, fordi 587 00:25:42,360 --> 00:25:44,350 alt bare fået super langsom. 588 00:25:44,350 --> 00:25:46,260 >> Nu, kan være en række årsager. 589 00:25:46,260 --> 00:25:49,600 Det kunne være en uendelig løkke, en fejl i andens kode, eller, mere enkelt, det 590 00:25:49,600 --> 00:25:53,250 kan betyde, at du bruger mere hukommelse, eller forsøger at, end din 591 00:25:53,250 --> 00:25:54,920 computer faktisk har. 592 00:25:54,920 --> 00:25:57,770 Og måske er der en fejl i nogle program der holder beder om hukommelsen. 593 00:25:57,770 --> 00:26:02,480 Browsere årevis var berygtede for dette, beder om mere og mere hukommelse 594 00:26:02,480 --> 00:26:03,870 men aldrig aflevere det tilbage. 595 00:26:03,870 --> 00:26:07,220 Sikkert, hvis du kun har en begrænset mængde hukommelse, kan du ikke bede 596 00:26:07,220 --> 00:26:09,990 uendeligt mange gange for nogle af denne hukommelse. 597 00:26:09,990 --> 00:26:13,070 >> Og så hvad du ser her, selvom igen Valgrind udgang er 598 00:26:13,070 --> 00:26:17,490 unødigt indviklet at kaste et blik på første, det er den interessante del. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 i brug på exit. 601 00:26:20,060 --> 00:26:22,810 Så her er, hvor meget hukommelse var i brug i bunke på 602 00:26:22,810 --> 00:26:24,300 tid mit program forlades - 603 00:26:24,300 --> 00:26:27,280 tilsyneladende seks bytes i en blok. 604 00:26:27,280 --> 00:26:28,710 Så jeg har tænkt mig at vinke mine hænder på, hvad en blok er. 605 00:26:28,710 --> 00:26:31,270 Tænk på det er bare en luns, en mere teknisk ord for bid. 606 00:26:31,270 --> 00:26:33,140 Men seks bytes - 607 00:26:33,140 --> 00:26:36,870 hvad er de seks byte, var stadig i brug? 608 00:26:36,870 --> 00:26:37,390 >> Præcis. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D omvendt skråstreg nul, fem bogstaver navn plus null terminator. 610 00:26:41,520 --> 00:26:46,350 Så dette program Valgrind bemærket, at jeg bedt om seks bytes, tilsyneladende ved 611 00:26:46,350 --> 00:26:48,950 måde getString, men aldrig gav dem tilbage. 612 00:26:48,950 --> 00:26:52,030 Og i virkeligheden, kan dette ikke være så indlysende, hvis mit program ikke er 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 give en anden kommando line argument Valgrind til 615 00:26:56,920 --> 00:26:58,290 gøre det mere detaljeret. 616 00:26:58,290 --> 00:26:59,760 Det er lidt irriterende at huske. 617 00:26:59,760 --> 00:27:01,580 Men hvis jeg gør - 618 00:27:01,580 --> 00:27:01,930 lad os se. 619 00:27:01,930 --> 00:27:03,540 Leak - 620 00:27:03,540 --> 00:27:05,030 Blev det lække - 621 00:27:05,030 --> 00:27:07,580 selv jeg kan ikke huske hvad det er off hånd. 622 00:27:07,580 --> 00:27:08,550 >> - Lækage-check lig fuld. 623 00:27:08,550 --> 00:27:10,180 Jep, tak. 624 00:27:10,180 --> 00:27:12,520 - Lækage-check lig fuld. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Samme program kører. 627 00:27:14,940 --> 00:27:16,180 Skrive i David igen. 628 00:27:16,180 --> 00:27:17,660 Nu kan jeg se en lidt mere detaljeret. 629 00:27:17,660 --> 00:27:20,890 Men under bunke resumé, som er identisk med fire - ah, 630 00:27:20,890 --> 00:27:22,120 det er lidt rart. 631 00:27:22,120 --> 00:27:25,460 Nu Valgrind er faktisk på udkig lidt hårdere i min kode. 632 00:27:25,460 --> 00:27:29,580 Og det er at sige, at, tilsyneladende, malloc ved linie - 633 00:27:29,580 --> 00:27:30,580 vi zoome ud. 634 00:27:30,580 --> 00:27:31,980 På linje - 635 00:27:31,980 --> 00:27:32,930 Vi kan ikke se hvad linje det er. 636 00:27:32,930 --> 00:27:35,110 Men malloc er den første synderen. 637 00:27:35,110 --> 00:27:38,630 Der er en blog i malloc. 638 00:27:38,630 --> 00:27:39,810 >> Okay? 639 00:27:39,810 --> 00:27:40,450 OK, nej. 640 00:27:40,450 --> 00:27:40,940 Right? 641 00:27:40,940 --> 00:27:42,520 Jeg ringede getString. 642 00:27:42,520 --> 00:27:44,460 getString tilsyneladende kalder malloc. 643 00:27:44,460 --> 00:27:47,800 Så hvad linje kode er tilsyneladende skyld for at have 644 00:27:47,800 --> 00:27:49,050 tildelt denne hukommelse? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Lad os antage, at hvem skrev malloc har eksisteret længe nok til, at det er 647 00:27:55,540 --> 00:27:56,390 ikke deres skyld. 648 00:27:56,390 --> 00:27:57,520 Så det er nok mit. 649 00:27:57,520 --> 00:28:02,000 getString i cs50.c - så det er en filen et sted på computeren - 650 00:28:02,000 --> 00:28:05,210 i linie 286 synes at være den skyldige. 651 00:28:05,210 --> 00:28:08,140 Lad os nu antage, at CS50 har været rundt for anstændig mængde tid, så 652 00:28:08,140 --> 00:28:09,720 vi også er ufejlbarlig. 653 00:28:09,720 --> 00:28:14,080 Og så det er formentlig ikke i getString at fejlen ligger, men snarere i 654 00:28:14,080 --> 00:28:17,810 hej-2.c linie 18. 655 00:28:17,810 --> 00:28:20,670 >> Så lad os tage et kig på hvad denne linje 18 var. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 En eller anden måde denne linje er ikke nødvendigvis buggy, per se, men det er grunden 658 00:28:27,130 --> 00:28:28,630 bag denne hukommelsesfejl. 659 00:28:28,630 --> 00:28:32,140 Så super enkelt, hvad ville intuitivt være løsningen her? 660 00:28:32,140 --> 00:28:34,710 Hvis vi beder om hukommelse, blev aldrig giver det tilbage, og der synes at være en 661 00:28:34,710 --> 00:28:37,940 problem, fordi over tid min computer kan løbe tør for hukommelse, kan bremse 662 00:28:37,940 --> 00:28:42,110 ned, måske dårlige ting sker, ja, hvad er den simple intuitive løsning? 663 00:28:42,110 --> 00:28:43,140 Bare give det tilbage. 664 00:28:43,140 --> 00:28:44,770 >> Hvordan kan du frigøre at hukommelsen? 665 00:28:44,770 --> 00:28:49,970 Nå, heldigvis er det ganske simpelt bare at sige frit navn. 666 00:28:49,970 --> 00:28:51,260 Og vi har aldrig gjort dette før. 667 00:28:51,260 --> 00:28:55,890 Men du kan hovedsagelig tænke på fri som det modsatte af malloc. 668 00:28:55,890 --> 00:28:58,030 fri er det modsatte af tildele hukommelse. 669 00:28:58,030 --> 00:28:59,540 Så lad mig kompilere dette. 670 00:28:59,540 --> 00:29:02,050 Gør hej-2. 671 00:29:02,050 --> 00:29:04,620 Lad mig køre det igen. hej-2 David. 672 00:29:04,620 --> 00:29:07,290 Så det lader til at virke i nøjagtig samme måde. 673 00:29:07,290 --> 00:29:11,180 Men hvis jeg gå tilbage til Valgrind og re-run den samme kommando på min nyligt 674 00:29:11,180 --> 00:29:14,720 kompileret program, maskinskrivning i mit navn som før - 675 00:29:14,720 --> 00:29:15,370 Nice. 676 00:29:15,370 --> 00:29:16,760 Heap resumé - 677 00:29:16,760 --> 00:29:17,740 i brug på exit - 678 00:29:17,740 --> 00:29:19,370 nul bytes i nul blokke. 679 00:29:19,370 --> 00:29:21,840 Og det er super nice, alle bunke blokke blev løsladt. 680 00:29:21,840 --> 00:29:23,480 Ingen utætheder er mulig. 681 00:29:23,480 --> 00:29:27,200 >> Så kommer op, ikke med Problem Set 4, men med Problem Set 5, de retsvidenskab 682 00:29:27,200 --> 00:29:30,740 og fremefter, hvilket også vil blive en mål for rigtigheden af ​​din 683 00:29:30,740 --> 00:29:33,630 program, uanset om du har eller ikke har memory leaks. 684 00:29:33,630 --> 00:29:36,900 Men heldigvis, kan du ikke blot ræsonnere gennem dem intuitivt, som 685 00:29:36,900 --> 00:29:40,430 er velsagtens nemt for små programmer men sværere for større programmer, 686 00:29:40,430 --> 00:29:43,860 Valgrind, for de større programmer, kan hjælpe dig med at identificere 687 00:29:43,860 --> 00:29:45,360 det særlige problem. 688 00:29:45,360 --> 00:29:47,500 >> Men der er et andet problem der måtte opstå. 689 00:29:47,500 --> 00:29:51,245 Lad mig åbne op denne fil her, hvilket er, igen, en noget simpelt eksempel. 690 00:29:51,245 --> 00:29:53,760 Men lad os fokusere på, hvad dette program gør. 691 00:29:53,760 --> 00:29:55,190 Dette kaldes memory.c. 692 00:29:55,190 --> 00:29:58,380 Vi vil bogføre dette senere i dag i zip dagens kildekode. 693 00:29:58,380 --> 00:30:01,610 Og mærke til, at jeg har en funktion kaldet f der ikke tager nogen argumenter og 694 00:30:01,610 --> 00:30:02,800 returnerer ingenting. 695 00:30:02,800 --> 00:30:07,240 På linje 20, jeg tilsyneladende om en pointer til en int og kalder det x. 696 00:30:07,240 --> 00:30:09,570 Jeg tildele er afkastet værdien af ​​malloc. 697 00:30:09,570 --> 00:30:14,590 Og bare for at være klar, hvor mange bytes am Jeg nok komme tilbage fra malloc 698 00:30:14,590 --> 00:30:17,080 i denne situation? 699 00:30:17,080 --> 00:30:18,040 >> Sandsynligvis 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 Tja, hvis du husker at en int er ofte 4 byte, i det mindste er i 702 00:30:22,410 --> 00:30:25,110 apparat, 10 gange 4 er naturligvis 40. 703 00:30:25,110 --> 00:30:28,920 Så malloc vender tilbage en adresse på en bid af hukommelse og lagring at 704 00:30:28,920 --> 00:30:30,800 tage i sidste ende i x. 705 00:30:30,800 --> 00:30:32,570 Så for at være klar, hvad så sker der? 706 00:30:32,570 --> 00:30:34,990 Nå, lad mig skifte tilbage til vores billede her. 707 00:30:34,990 --> 00:30:38,150 Lad mig ikke bare trække bunden af ​​mit computerens hukommelse, lad mig gå videre og 708 00:30:38,150 --> 00:30:42,990 trække hele rektangel, repræsenterer alle mine RAM. 709 00:30:42,990 --> 00:30:44,790 >> Vi vil sige, at stakken er på bunden. 710 00:30:44,790 --> 00:30:47,010 Og der er en tekst segment i de startværdi data. 711 00:30:47,010 --> 00:30:49,880 Men jeg bare at abstrahere dem andet væk som prik, prik prik. 712 00:30:49,880 --> 00:30:53,470 Jeg skal bare til at henvise til denne som bunke på toppen. 713 00:30:53,470 --> 00:30:57,070 Og så i bunden af ​​dette billede, at repræsentere main, vil jeg 714 00:30:57,070 --> 00:30:59,880 at give det en skiver hukommelse på stakken. 715 00:30:59,880 --> 00:31:03,150 For f, jeg vil give det en skive hukommelse på stakken. 716 00:31:03,150 --> 00:31:05,140 Nu fik jeg konsulterer min kildekode igen. 717 00:31:05,140 --> 00:31:07,170 Hvad er de lokale variable til main? 718 00:31:07,170 --> 00:31:10,710 Tilsyneladende ingenting, så skive er effektivt tomt 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, har jeg en lokal variabel, som kaldes x. 721 00:31:15,730 --> 00:31:20,410 Så jeg har tænkt mig at gå videre og give f en luns af hukommelse, kalder det x. 722 00:31:20,410 --> 00:31:24,680 >> Og nu malloc af 10 gange 4, Så malloc 40, hvor er det 723 00:31:24,680 --> 00:31:25,430 hukommelse kommer fra? 724 00:31:25,430 --> 00:31:27,530 Vi har ikke tegnet et billede lide det før. 725 00:31:27,530 --> 00:31:31,140 Men lad os antage, at det er effektivt kommer herfra, så man, 726 00:31:31,140 --> 00:31:33,170 to, tre, fire, fem. 727 00:31:33,170 --> 00:31:34,680 Og nu har jeg brug 40 af disse. 728 00:31:34,680 --> 00:31:37,540 Så jeg vil bare gøre dot, dot, dot at foreslå at der er endnu mere hukommelse 729 00:31:37,540 --> 00:31:39,350 kommer tilbage fra den bunke. 730 00:31:39,350 --> 00:31:40,710 Nu hvad er adressen? 731 00:31:40,710 --> 00:31:42,620 Lad os vælge vores vilkårlige behandle som altid - 732 00:31:42,620 --> 00:31:46,310 Ox123, selvom det sandsynligvis kommer at være noget helt andet. 733 00:31:46,310 --> 00:31:50,420 Det er adressen på den første byte i hukommelse, som jeg beder malloc for. 734 00:31:50,420 --> 00:31:53,630 >> Så kort sagt, når linje 20 udfører, hvad er bogstaveligt 735 00:31:53,630 --> 00:31:57,170 gemt inde 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 betyder blot, her er en hexadecimale tal. 740 00:32:03,200 --> 00:32:06,490 Men hvad er nøglen er, at hvad jeg har butik i x, hvilket er en lokal variabel. 741 00:32:06,490 --> 00:32:10,260 Men dens datatype, igen, er en adresse på en int. 742 00:32:10,260 --> 00:32:12,710 Nå, jeg vil gemme Ox123. 743 00:32:12,710 --> 00:32:16,610 Men igen, hvis det er lidt for kompliceret unødigt, hvis jeg ruller 744 00:32:16,610 --> 00:32:21,490 tilbage, vi kan abstrakt det væk helt rimelighed og bare sige, at x er en 745 00:32:21,490 --> 00:32:23,910 pointer til denne bid af hukommelse. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Nu er spørgsmålet ved hånden er følgende - 748 00:32:26,230 --> 00:32:29,910 line 21, viser det sig, 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 >> Undskyld? 752 00:32:36,930 --> 00:32:38,640 Det har ikke - 753 00:32:38,640 --> 00:32:40,390 sige, at når mere. 754 00:32:40,390 --> 00:32:41,240 Tja, er det ikke gratis. 755 00:32:41,240 --> 00:32:42,350 Så det er den anden, men. 756 00:32:42,350 --> 00:32:45,000 Så der er en anden, men specifikt ved linie 21.. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Præcis. 759 00:32:50,040 --> 00:32:54,980 Denne enkle linje kode er blot en buffer overflow, en buffer overskridelsen. 760 00:32:54,980 --> 00:32:57,050 En buffer betyder bare en luns af hukommelse. 761 00:32:57,050 --> 00:33:01,520 Men den luns af hukommelse er på størrelse 10, 10 heltal, hvilket betyder, at hvis vi 762 00:33:01,520 --> 00:33:05,350 indekset i det ved hjælp af syntaktiske sukker af matrix notation, square 763 00:33:05,350 --> 00:33:09,220 parentes, har du adgang til x beslag 0 x beslag 1 x, 764 00:33:09,220 --> 00:33:10,390 beslag dot, dot, dot. 765 00:33:10,390 --> 00:33:13,270 x beslag 9 er den største. 766 00:33:13,270 --> 00:33:17,680 Så hvis jeg gør x beslag 10, hvor Jeg er faktisk at gå i hukommelsen? 767 00:33:17,680 --> 00:33:19,120 >> Tja, hvis jeg har 10 int - 768 00:33:19,120 --> 00:33:21,070 lad os faktisk trække alle af disse 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 andre fem ints. 771 00:33:24,660 --> 00:33:29,580 Så x beslag 0 er her. x beslag 1 er her. x beslag 9 er her. x beslag 772 00:33:29,580 --> 00:33:37,960 10 er her, hvilket betyder, at jeg fortæller, i linie 21, til computeren sætte 773 00:33:37,960 --> 00:33:39,400 nummer, hvor? 774 00:33:39,400 --> 00:33:42,010 Tallet 0 hvor? 775 00:33:42,010 --> 00:33:43,380 Tja, det er 0, ja. 776 00:33:43,380 --> 00:33:45,460 Men bare det faktum, at dens 0 er lidt af en tilfældighed. 777 00:33:45,460 --> 00:33:47,140 Det kunne være antallet 50, for alle vi pleje. 778 00:33:47,140 --> 00:33:50,480 Men vi forsøger at sætte det på x beslag 10, hvilket er hvor dette 779 00:33:50,480 --> 00:33:53,700 spørgsmålstegn er trukket, hvilket er ikke en god ting. 780 00:33:53,700 --> 00:33:57,070 Dette program kan meget vel ned som et resultat. 781 00:33:57,070 --> 00:33:59,400 >> Lad os nu gå videre og se, om dette er, ja, hvad der sker. 782 00:33:59,400 --> 00:34:02,600 Gør hukommelsen, da filen kaldes memory.c. 783 00:34:02,600 --> 00:34:05,950 Lad os gå videre og køre programhukommelse. 784 00:34:05,950 --> 00:34:08,239 Så vi fik heldig, faktisk, det ser ud. 785 00:34:08,239 --> 00:34:09,340 Vi fik heldig. 786 00:34:09,340 --> 00:34:11,060 Men lad os se, om vi nu køre Valgrind. 787 00:34:11,060 --> 00:34:14,170 Ved første øjekast kan mit program synes at være helt korrekt. 788 00:34:14,170 --> 00:34:18,010 Men lad mig løbe Valgrind med - Lækage-check lig fuld på hukommelsen. 789 00:34:18,010 --> 00:34:20,110 >> Og nu når jeg køre dette - 790 00:34:20,110 --> 00:34:21,030 interessant. 791 00:34:21,030 --> 00:34:26,800 Ugyldig skrive størrelse 4 ved line 21 memory.c. 792 00:34:26,800 --> 00:34:29,284 Linje 21 i memory.c er, hvilken en? 793 00:34:29,284 --> 00:34:30,340 Åh, interessant. 794 00:34:30,340 --> 00:34:31,080 Men vent. 795 00:34:31,080 --> 00:34:32,389 Str. 4, hvad er det at henvise til? 796 00:34:32,389 --> 00:34:34,969 Jeg kun gjorde man skrive, men det er i str. 4. 797 00:34:34,969 --> 00:34:36,889 Hvorfor er det 4.? 798 00:34:36,889 --> 00:34:39,280 Det er fordi det er en int, der er, igen, fire bytes. 799 00:34:39,280 --> 00:34:42,510 Så Valgrind fundet en fejl, som jeg, blik på min kode, gjorde det ikke. 800 00:34:42,510 --> 00:34:45,040 Og måske din TF ville eller ikke ville. 801 00:34:45,040 --> 00:34:48,469 Hvad Men Valgrind sikkert fundet, at Vi har lavet en fejl der, selv 802 00:34:48,469 --> 00:34:52,719 selvom vi fik heldig, og computeren besluttet, eh, jeg ikke kommer til at gå ned 803 00:34:52,719 --> 00:34:57,470 bare fordi du rørt en byte, en int værd af hukommelse, som du ikke har 804 00:34:57,470 --> 00:34:58,550 faktisk selv. 805 00:34:58,550 --> 00:35:00,380 >> Nå, hvad der ellers 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 vanvittig leder adresse i hexadecimal. 808 00:35:03,190 --> 00:35:06,890 Det betyder bare et sted i den bunke er nul bytes efter en blok af str. 40 809 00:35:06,890 --> 00:35:07,620 er knyttet til. 810 00:35:07,620 --> 00:35:10,610 Lad mig zoome ud her og se, om dette er en lidt mere nyttigt. 811 00:35:10,610 --> 00:35:11,410 Interessant. 812 00:35:11,410 --> 00:35:15,600 40 bytes er absolut tabt i tab rekord 1 af 1. 813 00:35:15,600 --> 00:35:17,840 Igen, flere ord end er nyttigt her. 814 00:35:17,840 --> 00:35:21,350 Men baseret på de fremhævede linjer hvor skal jeg nok fokusere min 815 00:35:21,350 --> 00:35:24,070 opmærksomhed for en anden fejl? 816 00:35:24,070 --> 00:35:26,570 Ligner en linie 20 i memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Så hvis vi går tilbage til linje 20, der er den en, som du har identificeret 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 det vendt dens virkninger. 820 00:35:35,160 --> 00:35:38,790 Så hvordan kan jeg rette det mindste en af ​​disse fejltagelser? 821 00:35:38,790 --> 00:35:42,240 Hvad kunne jeg gøre, når linje 21? 822 00:35:42,240 --> 00:35:47,110 Jeg kunne gøre fri for x, er så at give tilbage, at hukommelsen. 823 00:35:47,110 --> 00:35:49,230 Og hvordan løser jeg denne fejl? 824 00:35:49,230 --> 00:35:52,120 Jeg skal helt sikkert gå ikke længere end 0. 825 00:35:52,120 --> 00:35:53,670 Så lad mig prøve og re-run dette. 826 00:35:53,670 --> 00:35:56,080 Beklager, helt sikkert gå ikke længere end 9.. 827 00:35:56,080 --> 00:35:57,510 Foretag hukommelse. 828 00:35:57,510 --> 00:36:00,650 Lad mig køre Valgrind i et større vindue. 829 00:36:00,650 --> 00:36:01,580 Og se nu. 830 00:36:01,580 --> 00:36:02,250 Nice. 831 00:36:02,250 --> 00:36:03,270 Alle bunke blokke blev løsladt. 832 00:36:03,270 --> 00:36:04,270 Ingen utætheder er mulig. 833 00:36:04,270 --> 00:36:07,520 Og op over her, der er ingen omtale mere af den ugyldige højre. 834 00:36:07,520 --> 00:36:09,820 >> Bare for at få grådige, og lad os se, om en anden demonstration 835 00:36:09,820 --> 00:36:11,050 ikke går efter hensigten - 836 00:36:11,050 --> 00:36:12,560 Jeg fik heldig for et øjeblik siden. 837 00:36:12,560 --> 00:36:15,530 Og det faktum, at dette er 0 er måske unødigt vildledende. 838 00:36:15,530 --> 00:36:20,650 Lad os bare gøre 50, en noget vilkårlig nummer, gør hukommelse dot slash-hukommelse - 839 00:36:20,650 --> 00:36:21,410 stadig få heldige. 840 00:36:21,410 --> 00:36:22,510 Intet er ned. 841 00:36:22,510 --> 00:36:26,150 Antag jeg bare gøre noget virkelig dumt, og jeg gør 100. 842 00:36:26,150 --> 00:36:30,360 Lad mig genindspilning hukommelse, dot slash-hukommelse - 843 00:36:30,360 --> 00:36:31,075 fik heldig igen. 844 00:36:31,075 --> 00:36:32,800 Hvordan omkring 1.000? 845 00:36:32,800 --> 00:36:35,370 ints ud, groft, hvor jeg skal være? 846 00:36:35,370 --> 00:36:37,410 Gør hukommelse - 847 00:36:37,410 --> 00:36:38,570 damn it. 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 Lad os ikke rode rundt længere. 851 00:36:43,920 --> 00:36:45,120 Rerun hukommelse. 852 00:36:45,120 --> 00:36:45,840 Der går vi. 853 00:36:45,840 --> 00:36:46,410 Ok. 854 00:36:46,410 --> 00:36:52,500 Så tilsyneladende du index 100.000 ints over, hvor du skulle have været i 855 00:36:52,500 --> 00:36:54,410 hukommelse, dårlige ting ske. 856 00:36:54,410 --> 00:36:56,430 Så dette er naturligvis ikke en hård, fast regel. 857 00:36:56,430 --> 00:36:58,190 Jeg var slags hjælp retssag and error at komme der. 858 00:36:58,190 --> 00:37:02,230 Men det er fordi, lang historie kort, computerens hukommelse er også opdelt 859 00:37:02,230 --> 00:37:03,580 ind i disse ting kaldet segmenter. 860 00:37:03,580 --> 00:37:07,260 Og nogle gange, at computeren faktisk har givet dig lidt mere hukommelse 861 00:37:07,260 --> 00:37:08,400 end du beder om. 862 00:37:08,400 --> 00:37:12,170 Men for effektivitet, er det bare nemmere at få mere hukommelse, men kun fortælle dig 863 00:37:12,170 --> 00:37:13,780 at du får en del af det. 864 00:37:13,780 --> 00:37:16,370 >> Og hvis du får heldig nogle gange, Derfor kan du være i stand til at røre 865 00:37:16,370 --> 00:37:17,795 hukommelse, der ikke tilhører dig. 866 00:37:17,795 --> 00:37:21,860 Du har ingen garanti for, at hvilken værdi du placerede der vil bo der, fordi 867 00:37:21,860 --> 00:37:25,080 computeren stadig synes det er ikke dit, men det er ikke nødvendigvis vil 868 00:37:25,080 --> 00:37:29,910 at ramme et andet segment af hukommelse i computer og fremkalde en fejl som 869 00:37:29,910 --> 00:37:31,710 denne ene her. 870 00:37:31,710 --> 00:37:32,060 Ok. 871 00:37:32,060 --> 00:37:37,240 Eventuelle spørgsmål derefter på hukommelsen? 872 00:37:37,240 --> 00:37:37,590 >> Ok. 873 00:37:37,590 --> 00:37:40,610 Lad os tage et kig her, så på noget, vi har taget for 874 00:37:40,610 --> 00:37:48,361 givet i temmelig lang tid, hvilket er i denne fil, der hedder 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 Disse er blot en hel masse bemærkninger op toppen. 877 00:37:51,130 --> 00:37:53,900 Og du måske har set på dette, hvis du prikkede rundt på apparatet. 878 00:37:53,900 --> 00:37:57,000 Men det viser sig, at al den tid, når vi plejede at bruge streng som 879 00:37:57,000 --> 00:38:01,130 synonym, de midler, som vi erklærede der synonym var med dette 880 00:38:01,130 --> 00:38:03,990 søgeord typedef, for type definition. 881 00:38:03,990 --> 00:38:07,500 Og vi hovedsageligt siger, gør snor et synonym for char stjerne. 882 00:38:07,500 --> 00:38:11,190 At de midler, hvormed stakken skabt disse støttehjul kendt som 883 00:38:11,190 --> 00:38:12,040 strengen. 884 00:38:12,040 --> 00:38:14,830 >> Nu her er bare en prototype for getchar. 885 00:38:14,830 --> 00:38:17,350 Vi kunne have set det før, men det er faktisk, hvad den gør. getchar 886 00:38:17,350 --> 00:38:19,070 tager ingen argumenter, returnerer en char. 887 00:38:19,070 --> 00:38:21,340 getdouble tager ingen argumenter, returnerer en dobbelt. 888 00:38:21,340 --> 00:38:24,440 getfloat tager ingen argumenter, returnerer en float, og så videre. 889 00:38:24,440 --> 00:38:27,270 getint er her. getlonglong er her. 890 00:38:27,270 --> 00:38:28,820 Og getString er her. 891 00:38:28,820 --> 00:38:29,420 Og det er det. 892 00:38:29,420 --> 00:38:33,080 Denne lilla linje er en anden forprocessor direktiv, fordi den 893 00:38:33,080 --> 00:38:35,550 hashtag i begyndelsen af ​​det. 894 00:38:35,550 --> 00:38:35,870 >> Ok. 895 00:38:35,870 --> 00:38:38,380 Så lad mig gå ind cs50.c. 896 00:38:38,380 --> 00:38:40,400 Og vi vil ikke tale for længe på dette. 897 00:38:40,400 --> 00:38:43,280 Men for at give dig et indblik i, hvad der er stået på alt dette 898 00:38:43,280 --> 00:38:46,434 tid, lad mig gå til - 899 00:38:46,434 --> 00:38:48,250 lad os gøre getchar. 900 00:38:48,250 --> 00:38:51,050 Så getchar er for det meste bemærkninger. 901 00:38:51,050 --> 00:38:52,060 Men det ser sådan ud. 902 00:38:52,060 --> 00:38:54,800 Så dette er den aktuelle funktion getchar at vi har været 903 00:38:54,800 --> 00:38:56,055 tager for givet eksisterer. 904 00:38:56,055 --> 00:38:59,370 Og selv om vi ikke har brug denne her der ofte, om nogensinde, det er mindst 905 00:38:59,370 --> 00:39:00,470 forholdsvis enkel. 906 00:39:00,470 --> 00:39:02,580 Så det er værd at tage en hurtigt kig på her. 907 00:39:02,580 --> 00:39:06,540 >> Så getchar har en uendelig løkke, bevidst så tilsyneladende. 908 00:39:06,540 --> 00:39:10,050 Det kalder derefter - og det er lidt af en flot genbrug af kode, vi selv skrev. 909 00:39:10,050 --> 00:39:11,220 Det kalder getString. 910 00:39:11,220 --> 00:39:12,460 For hvad betyder det betyde at få en char? 911 00:39:12,460 --> 00:39:14,730 Nå, kan du lige så godt prøve at få et hel linie af tekst fra brugeren og 912 00:39:14,730 --> 00:39:16,940 så bare se på en af disse tegn. 913 00:39:16,940 --> 00:39:19,170 På linje 60, er her en lille lidt af et sanity check. 914 00:39:19,170 --> 00:39:21,610 Hvis getString returnerede null, lad os ikke fortsætte. 915 00:39:21,610 --> 00:39:22,820 Noget gik galt. 916 00:39:22,820 --> 00:39:28,120 >> Nu er det lidt irriterende, men konventionel i C. char max sandsynligvis 917 00:39:28,120 --> 00:39:29,960 repræsenterer, hvad der lige baseret på dens navn? 918 00:39:29,960 --> 00:39:31,670 Det er en konstant. 919 00:39:31,670 --> 00:39:36,040 Det er ligesom den numeriske værdi af største char du kan repræsentere med 920 00:39:36,040 --> 00:39:40,370 én bid, hvilket sandsynligvis er det 255, hvilket er det største antal, du 921 00:39:40,370 --> 00:39:42,720 repræsentere otte bits, startende fra nul. 922 00:39:42,720 --> 00:39:47,460 Så jeg har bruger dette, i denne funktion, når skrive denne kode, kun fordi 923 00:39:47,460 --> 00:39:51,753 hvis noget går galt i getchar men sit formål i livet er at returnere en 924 00:39:51,753 --> 00:39:54,830 char, skal du en eller anden måde være i stand til at signalere til brugeren at 925 00:39:54,830 --> 00:39:55,840 noget gik 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 sig, at null er en pointer. 928 00:39:58,480 --> 00:40:01,030 Og igen, getchar har at returnere en char. 929 00:40:01,030 --> 00:40:04,760 >> Så konventionen, hvis noget går forkert, er dig, programmør eller i 930 00:40:04,760 --> 00:40:08,160 dette tilfælde mig med biblioteket, havde jeg en bare beslutte vilkårligt, hvis 931 00:40:08,160 --> 00:40:12,230 noget går galt, vil jeg returnere antallet 255, som er virkelig 932 00:40:12,230 --> 00:40:17,240 betyder, at vi ikke kan, kan brugeren ikke skrive tegnet repræsenteret ved 933 00:40:17,240 --> 00:40:21,410 nummer 255, fordi vi havde en stjæle det som en såkaldt sentinel værdi til 934 00:40:21,410 --> 00:40:23,410 repræsentere et problem. 935 00:40:23,410 --> 00:40:27,010 Nu viser det sig, at tegnet 255 er ikke noget, du kan skrive på 936 00:40:27,010 --> 00:40:28,380 dit tastatur, så det er ikke nogen big deal. 937 00:40:28,380 --> 00:40:30,910 Brugeren ikke mærke til, at Jeg har stjålet denne karakter. 938 00:40:30,910 --> 00:40:34,620 Men hvis du nogensinde ser i mennesket sider på et computersystem nogle reference til en 939 00:40:34,620 --> 00:40:38,560 alle caps konstant som dette, der siger, i tilfælde af fejl denne konstante magt 940 00:40:38,560 --> 00:40:42,720 returneres, det er alle nogle mennesker gjorde år siden blev vilkårligt besluttet at 941 00:40:42,720 --> 00:40:45,680 returnere denne særlige værdi, og kalder det en konstant i tilfælde 942 00:40:45,680 --> 00:40:46,840 noget går galt. 943 00:40:46,840 --> 00:40:48,580 >> Nu magiske sker hernede. 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å på linje 68, er der faktisk en linje kode, der er minder om 946 00:40:57,080 --> 00:41:01,140 vores ven printf, da det har procent Cs i anførselstegn. 947 00:41:01,140 --> 00:41:06,490 Men bemærk, hvad der sker her. sscanf betyder string scan - 948 00:41:06,490 --> 00:41:11,690 betyder scanne et formateret streng, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Hvad betyder det? 950 00:41:12,590 --> 00:41:16,310 Det betyder, at du overgår til sscanf en streng. 951 00:41:16,310 --> 00:41:18,420 Og line er, hvad brugeren typer i. 952 00:41:18,420 --> 00:41:23,520 Du passerer at sscanf et format streng som dette som fortæller scanf hvad er 953 00:41:23,520 --> 00:41:25,870 du håber brugeren har skrevet i. 954 00:41:25,870 --> 00:41:29,730 Du kan derefter pass-i adresserne på to bidder af hukommelsen, i dette tilfælde, 955 00:41:29,730 --> 00:41:31,150 fordi jeg har to pladsholdere. 956 00:41:31,150 --> 00:41:34,610 Så jeg har tænkt mig at give det den adresse C1 og adressen på C2. 957 00:41:34,610 --> 00:41:37,700 >> Og huske, at du giver en funktion adresse for nogle variable, hvad er 958 00:41:37,700 --> 00:41:38,950 Implikationen? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Hvad kan denne funktion gøre som følge for at give det adressen på en 961 00:41:45,050 --> 00:41:48,170 variabel, i modsætning til variablen selv? 962 00:41:48,170 --> 00:41:49,450 Det kan ændre det, right? 963 00:41:49,450 --> 00:41:53,250 Hvis du havde nogen et kort til en fysisk adresse, kan de gå der og gøre 964 00:41:53,250 --> 00:41:54,750 hvad de vil på denne adresse. 965 00:41:54,750 --> 00:41:55,800 Samme idé her. 966 00:41:55,800 --> 00:41:59,950 Hvis vi overgår til sscanf, adressen på to bidder af hukommelsen, selv disse bittesmå 967 00:41:59,950 --> 00:42:03,585 små bidder af hukommelsen, C1 og C2, men vi fortæller den adressen på dem, 968 00:42:03,585 --> 00:42:05,170 sscanf kan ændre det. 969 00:42:05,170 --> 00:42:08,530 >> Så sscanf formål i livet, hvis vi læser manden siden, er at læse hvad 970 00:42:08,530 --> 00:42:13,420 brugeren har indtastet, håb for at brugeren har skrevet i et tegn, og måske 971 00:42:13,420 --> 00:42:16,470 et andet tegn, og hvad brugeren indtastet, det første tegn går 972 00:42:16,470 --> 00:42:19,310 her, det andet tegn går her. 973 00:42:19,310 --> 00:42:22,470 Nu, som en sidebemærkning, det, og du ville kun kender det fra den dokumentation, 974 00:42:22,470 --> 00:42:25,570 det faktum, at jeg sætter en tom plads der betyder blot, at jeg er ligeglad, hvis 975 00:42:25,570 --> 00:42:28,440 brugeren rammer Space bar et par gange, før han eller hun tager en 976 00:42:28,440 --> 00:42:30,400 karakter, vil jeg ignorere enhver hvide rum. 977 00:42:30,400 --> 00:42:32,510 Så det, jeg kender fra dokumentationen. 978 00:42:32,510 --> 00:42:36,570 >> Det faktum, at der er en anden% c efterfulgt af hvide rum er faktisk 979 00:42:36,570 --> 00:42:37,410 bevidst. 980 00:42:37,410 --> 00:42:41,190 Jeg ønsker at være i stand til at opdage, hvis brugeren skruet op eller ikke samarbejdede. 981 00:42:41,190 --> 00:42:45,630 Så jeg håber, at brugeren kun har skrevet i et tegn, jeg derfor er håbende 982 00:42:45,630 --> 00:42:50,640 der sscanf er kun kommer til at returnere værdien 1, fordi igen, hvis jeg læste 983 00:42:50,640 --> 00:42:55,400 dokumentationen, sscanf formål i livet er at vende tilbage til antallet af 984 00:42:55,400 --> 00:42:59,170 variabler, der var fyldt med brugerinput. 985 00:42:59,170 --> 00:43:02,270 >> Jeg passerede i to variabler adresser, C1 og C2. 986 00:43:02,270 --> 00:43:06,420 Jeg håber dog, at kun én af dem bliver dræbt, fordi hvis sscanf 987 00:43:06,420 --> 00:43:11,130 returnerer 2, hvad er formentlig Implikationen logisk? 988 00:43:11,130 --> 00:43:14,600 At brugeren ikke bare give mig en karakter som jeg fortalte ham eller hende. 989 00:43:14,600 --> 00:43:17,860 De formentlig skrevet på mindst to tegn. 990 00:43:17,860 --> 00:43:22,430 Så hvis jeg i stedet havde ikke den anden % C, jeg havde bare en, hvilket 991 00:43:22,430 --> 00:43:25,370 ærligt ville være mere intuitiv tilgang, jeg tror en første øjekast, 992 00:43:25,370 --> 00:43:30,220 du ikke vil være i stand til at opdage hvis brugeren har været at give dig mere 993 00:43:30,220 --> 00:43:31,780 input, end du rent faktisk ønskede. 994 00:43:31,780 --> 00:43:34,100 Så dette er en implicit formular af fejlkontrol. 995 00:43:34,100 --> 00:43:35,640 >> Men bemærk, hvad jeg gør her. 996 00:43:35,640 --> 00:43:39,970 Når jeg er sikker på, at brugeren har givet mig en tegn, jeg befri den linje, laver 997 00:43:39,970 --> 00:43:44,450 det modsatte af getString, som igen bruger malloc, og så vender jeg tilbage 998 00:43:44,450 --> 00:43:51,030 C1, tegnet som jeg håbede bruger forudsat og kun forudsat. 999 00:43:51,030 --> 00:43:54,680 Så en hurtig skimtes alene, men spørgsmål om getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Vi kommer tilbage til nogle af de andre. 1002 00:43:59,590 --> 00:44:03,770 >> Nå, lad mig gå videre og gøre det - Antag nu, bare for at motivere vores 1003 00:44:03,770 --> 00:44:08,910 drøftelse i en uge plus tid, det er en fil kaldet structs.h. 1004 00:44:08,910 --> 00:44:11,440 Og igen, det er bare en smagsprøve af noget, der ligger forude. 1005 00:44:11,440 --> 00:44:13,090 Men bemærk, at en masse af denne er kommentarer. 1006 00:44:13,090 --> 00:44:17,440 Så lad mig fremhæve kun interessante del for nu. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 er der den samme søgeord igen. 1009 00:44:19,700 --> 00:44:23,100 typedef vi bruger til at erklære string som en særlig datatype. 1010 00:44:23,100 --> 00:44:27,490 Du kan bruge typedef til at skabe helt nye datatyper, der ikke fandtes, da 1011 00:44:27,490 --> 00:44:28,570 C blev opfundet. 1012 00:44:28,570 --> 00:44:32,520 For eksempel kommer int med C. char kommer med C. double kommer med C. Men 1013 00:44:32,520 --> 00:44:34,000 der er ingen forestilling om en studerende. 1014 00:44:34,000 --> 00:44:37,230 Og alligevel ville være temmelig nyttigt at være i stand til at skrive et program, der gemmer 1015 00:44:37,230 --> 00:44:40,440 i en variabel, en elevs ID-nummer deres navn og deres hus. 1016 00:44:40,440 --> 00:44:42,890 Med andre ord, dele tre af data, ligesom en int og en 1017 00:44:42,890 --> 00:44:44,420 streng og en anden streng. 1018 00:44:44,420 --> 00:44:48,220 >> Med typedef, hvad er temmelig kraftig om dette og nøgleordet sturct for 1019 00:44:48,220 --> 00:44:53,660 struktur, får du som programmør i 2013 kan faktisk definere din egen på 1020 00:44:53,660 --> 00:44:57,530 datatyper, som ikke eksisterede år siden, men det passer til dit formål. 1021 00:44:57,530 --> 00:45:01,910 Og så her, i linjerne 13 til 19, vi om en ny datatype, ligesom 1022 00:45:01,910 --> 00:45:04,320 en int, men at kalde det studerende. 1023 00:45:04,320 --> 00:45:09,310 Og inde i denne variabel vil 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 tænke på, hvad der er virkelig er sket her, selvom det er en 1026 00:45:13,040 --> 00:45:17,160 lidt af en forenkling for i dag, en studerende hovedsagelig er at gå 1027 00:45:17,160 --> 00:45:19,450 til at ligne dette. 1028 00:45:19,450 --> 00:45:22,580 Dens vil være en luns af hukommelse med et ID, et navn 1029 00:45:22,580 --> 00:45:25,580 felt, og et hus felt. 1030 00:45:25,580 --> 00:45:30,670 Og vi vil være i stand til at bruge disse bidder af hukommelse og få adgang til dem som følger. 1031 00:45:30,670 --> 00:45:38,870 >> Hvis jeg går ind i struct0.c, her er der en forholdsvis lang, men efter en 1032 00:45:38,870 --> 00:45:42,630 mønster af kode, bruger denne nye trick. 1033 00:45:42,630 --> 00:45:45,790 Så det første, lad mig henlede Deres opmærksomhed til de interessante dele op toppen. 1034 00:45:45,790 --> 00:45:49,670 Sharp definerer eleverne 3, erklærer en konstante kaldet studerende og erhververe 1035 00:45:49,670 --> 00:45:53,450 det vilkårligt nummer 3, bare så jeg har tre studerende, der bruger 1036 00:45:53,450 --> 00:45:54,830 dette program for nu. 1037 00:45:54,830 --> 00:45:55,960 Her kommer Main. 1038 00:45:55,960 --> 00:45:58,860 Og varsel, hvordan jeg erklærer en bred vifte af studerende? 1039 00:45:58,860 --> 00:46:00,480 Nå, jeg bare bruge den samme syntaks. 1040 00:46:00,480 --> 00:46:02,110 Ordet studerende er selvfølgelig nye. 1041 00:46:02,110 --> 00:46:04,790 Men studerende, klasse, beslag studerende. 1042 00:46:04,790 --> 00:46:06,720 >> Så desværre er der en masse genbrug af termer her. 1043 00:46:06,720 --> 00:46:07,660 Dette er blot et tal. 1044 00:46:07,660 --> 00:46:09,040 Så det er ligesom at sige tre. 1045 00:46:09,040 --> 00:46:11,430 Class er lige, hvad jeg vil at kalde variablen. 1046 00:46:11,430 --> 00:46:12,840 Jeg kunne kalde det studerende. 1047 00:46:12,840 --> 00:46:15,880 Men klasse, dette er ikke en klasse i en objektorienteret Java slags måde. 1048 00:46:15,880 --> 00:46:17,220 Det er bare en klasse af studerende. 1049 00:46:17,220 --> 00:46:20,590 Og datatypen for hvert element i denne matrix er studerende. 1050 00:46:20,590 --> 00:46:23,040 Så dette er en lidt anderledes og fra at sige noget 1051 00:46:23,040 --> 00:46:25,250 som dette, er det bare - 1052 00:46:25,250 --> 00:46:29,500 Jeg siger give mig tre elever og kalder denne matrix klasse. 1053 00:46:29,500 --> 00:46:29,800 >> Ok. 1054 00:46:29,800 --> 00:46:30,680 Nu her er en fire løkke. 1055 00:46:30,680 --> 00:46:33,480 Denne fyr er velkendte - gentage fra nul på op 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 at bede mig, mennesket, for at give det en elev 1058 00:46:37,710 --> 00:46:39,200 ID, hvilket er en int. 1059 00:46:39,200 --> 00:46:44,650 Og her er den syntaks, som du kan opbevare noget i id-feltet på 1060 00:46:44,650 --> 00:46:48,630 placering class beslag I. So denne syntaks er ikke nyt. 1061 00:46:48,630 --> 00:46:51,450 Det betyder bare at give mig den ottende elev i klassen. 1062 00:46:51,450 --> 00:46:52,940 Men dette symbol er ny. 1063 00:46:52,940 --> 00:46:56,320 Indtil nu har vi ikke brugt dot, mindst i kode som dette. 1064 00:46:56,320 --> 00:47:01,490 Dette betyder at gå til struct kendt som en studerende og sætte noget der. 1065 00:47:01,490 --> 00:47:05,670 Ligeledes i denne næste linje 31, gå fremad og sætte hvad brugeren skriver 1066 00:47:05,670 --> 00:47:10,530 efter et navn her, og hvad de gør for en hus, det samme, gå videre og 1067 00:47:10,530 --> 00:47:13,230 sætte det i. hus. 1068 00:47:13,230 --> 00:47:15,955 >> Så hvad har dette program i sidste ende gøre? 1069 00:47:15,955 --> 00:47:17,220 Du kan se en lille teaser der. 1070 00:47:17,220 --> 00:47:24,780 Lad mig gå videre og gør structs 0 dot skråstreg struct 0, studerendes ID 1, 1071 00:47:24,780 --> 00:47:28,250 siger David Mather, studiekort 2.. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, studiekort 3.. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 og det eneste dette program gjorde, som er bare helt vilkårligt, er 1075 00:47:38,380 --> 00:47:40,980 Jeg ønskede at gøre noget med disse data, nu hvor jeg har lært os, hvordan man 1076 00:47:40,980 --> 00:47:43,450 bruge structs er jeg netop havde denne ekstra løkke her. 1077 00:47:43,450 --> 00:47:45,260 Jeg gentage over den vifte af studerende. 1078 00:47:45,260 --> 00:47:49,170 Jeg brugte vores, måske nu velkendte ven, string sammenligne, stircomp til 1079 00:47:49,170 --> 00:47:53,780 check er 8. studerendes hus svarende til Mather? 1080 00:47:53,780 --> 00:47:56,760 Og hvis ja, udskrive bare noget vilkårligt gerne, ja, det er. 1081 00:47:56,760 --> 00:47:59,430 Men igen, bare at give mig muligheder, at bruge og genbruge og 1082 00:47:59,430 --> 00:48:02,270 genbruge denne nye dot notation. 1083 00:48:02,270 --> 00:48:03,250 >> Så Hvem bekymrer sig, right? 1084 00:48:03,250 --> 00:48:06,270 Kommer op med en studerende program er noget vilkårlige, men det viser sig 1085 00:48:06,270 --> 00:48:09,800 at vi kan gøre nyttige ting med dette, for eksempel som følger. 1086 00:48:09,800 --> 00:48:14,600 Dette er en meget mere kompliceret struct i C. Det har et dusin eller flere felter, 1087 00:48:14,600 --> 00:48:15,880 noget kryptisk hedder. 1088 00:48:15,880 --> 00:48:20,110 Men hvis du nogensinde har hørt om et grafisk filformat kaldet bitmap, BMP, det 1089 00:48:20,110 --> 00:48:22,830 viser sig, at bitmap filformat temmelig meget ligner det dette. 1090 00:48:22,830 --> 00:48:24,200 Det er en dum lille Smiley ansigt. 1091 00:48:24,200 --> 00:48:27,840 Det er et lille billede, som jeg har zoomet ind på temmelig stor, så jeg kunne se hver 1092 00:48:27,840 --> 00:48:30,410 af de enkelte prikker eller pixels. 1093 00:48:30,410 --> 00:48:33,800 Nu viser det sig, at vi kan udgøre en sort prik med, siger, at antallet 0. 1094 00:48:33,800 --> 00:48:35,520 Og en hvid prik med nummer 1. 1095 00:48:35,520 --> 00:48:39,140 >> Så med andre ord, at hvis du ønsker tegne en Smilende ansigt og redde dette billede i et 1096 00:48:39,140 --> 00:48:42,680 computer, er det tilstrækkeligt at opbevare nuller og dem, der ser sådan ud, hvor, 1097 00:48:42,680 --> 00:48:45,250 igen, dem er hvide og nuller er sort. 1098 00:48:45,250 --> 00:48:48,290 Og sammen, hvis du effektivt har a binde af ettaller og nuller, har du en 1099 00:48:48,290 --> 00:48:51,030 gitter af pixels, og hvis man lægger dem ud, har du en sød 1100 00:48:51,030 --> 00:48:52,560 lille Smiley ansigt. 1101 00:48:52,560 --> 00:48:58,150 Nu bitmap filformat, BMP, er effektivt, at under hætten, 1102 00:48:58,150 --> 00:49:00,970 men med flere pixels sot, at du kan faktisk repræsentere farver. 1103 00:49:00,970 --> 00:49:05,170 >> Men når du har mere sofistikerede filformater som BMP og JPEG og GIF 1104 00:49:05,170 --> 00:49:09,360 som du kan være bekendt, der filer på disken typisk ikke blot 1105 00:49:09,360 --> 00:49:13,760 har nuller og ettaller for pixel, men de har nogle metadata samt - 1106 00:49:13,760 --> 00:49:16,960 meta i den forstand, at er ikke rigtig data, men det er nyttigt at have. 1107 00:49:16,960 --> 00:49:21,370 Så disse felter her er antyde, og vi vil se dette mere detaljeret i P-set 1108 00:49:21,370 --> 00:49:25,810 5, at før nuller og ettaller, der repræsentere pixel i et billede, 1109 00:49:25,810 --> 00:49:29,110 der er en masse af metadata som størrelsen af ​​billedet og 1110 00:49:29,110 --> 00:49:30,250 bredden af ​​billedet. 1111 00:49:30,250 --> 00:49:32,910 Og mærke jeg plukning off nogle vilkårlige ting her - 1112 00:49:32,910 --> 00:49:34,260 bredde og højde. 1113 00:49:34,260 --> 00:49:36,160 Bit tæller, og nogle andre ting. 1114 00:49:36,160 --> 00:49:37,840 Så der er nogle metadata i en fil. 1115 00:49:37,840 --> 00:49:41,470 >> Men ved at forstå, hvordan filer er lagt ud på denne måde, kan du faktisk 1116 00:49:41,470 --> 00:49:45,890 derefter manipulere billeder, gendanne billeder fra disk, ændre størrelse på billeder. 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 havde brug for et fotografi. 1119 00:49:48,480 --> 00:49:52,840 Så jeg gik tilbage til RJ her, som du så på skærmen temmelig lang tid siden. 1120 00:49:52,840 --> 00:49:57,160 Og hvis jeg åbner Keynote her, det er hvad sker der hvis du forsøger at zoome ind og 1121 00:49:57,160 --> 00:49:59,380 øge RJ. 1122 00:49:59,380 --> 00:50:01,480 Han er ikke få nogen bedre rigtig. 1123 00:50:01,480 --> 00:50:06,240 Nu Keynote er en slags sløring det en lille smule, bare for at tilsløre 1124 00:50:06,240 --> 00:50:11,040 kendsgerning, at RJ ikke får særlig forbedret, når du zoome ind 1125 00:50:11,040 --> 00:50:13,310 Og hvis gøre det på denne måde, se firkanter? 1126 00:50:13,310 --> 00:50:15,490 Ja, du kan helt sikkert se firkanter på en projektor. 1127 00:50:15,490 --> 00:50:17,690 >> Det er hvad du får, når du forbedre. 1128 00:50:17,690 --> 00:50:22,570 Men at forstå, hvordan vores RJ eller Smiley ansigt er gennemført, vil lade os 1129 00:50:22,570 --> 00:50:24,950 rent faktisk at skrive kode, der manipulerer disse ting. 1130 00:50:24,950 --> 00:50:29,970 Og jeg troede, jeg ville ende på denne note, med 55 sekunder ved en styrke, der er, 1131 00:50:29,970 --> 00:50:31,230 Jeg tør sige temmelig misvisende. 1132 00:50:31,230 --> 00:50:32,990 >> [VIDEO AFSPIL] 1133 00:50:32,990 --> 00:50:34,790 >> -Han lyver. 1134 00:50:34,790 --> 00:50:38,310 Om hvad, ved jeg ikke. 1135 00:50:38,310 --> 00:50:41,200 >> -Så hvad ved vi? 1136 00:50:41,200 --> 00:50:45,280 >> -Det ved 09:15 Ray Santoya var på ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Så spørgsmålet er, hvad han gør på 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Optagelse de ni millimeter til noget. 1139 00:50:50,750 --> 00:50:52,615 Måske han så snigskytte. 1140 00:50:52,615 --> 00:50:54,760 >> -Eller arbejdede med ham. 1141 00:50:54,760 --> 00:50:56,120 >> -Vent. 1142 00:50:56,120 --> 00:50:57,450 Gå ét. 1143 00:50:57,450 --> 00:50:58,700 >> -Hvad kan du se? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Bring hans ansigt op, fuld skærm. 1146 00:51:09,490 --> 00:51:09,790 >> -Hans briller. 1147 00:51:09,790 --> 00:51:11,040 >> -Der er en refleksion. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Det er Neuvitas baseball hold. 1150 00:51:23,520 --> 00:51:24,530 Det er deres logo. 1151 00:51:24,530 --> 00:51:27,040 >> -Og han taler til hvem er iført den jakke. 1152 00:51:27,040 --> 00:51:27,530 >> [END VIDEOAFSPILNING] 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 dig i næste uge. 1155 00:51:30,720 --> 00:51:32,330 >> MAND: På det næste CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Fårekyllinger kvidrende] 1157 00:51:39,240 --> 00:51:41,270 >> [MUSIC Playing]