1 00:00:00,000 --> 00:00:10,970 >> [Musik Spela] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. MALAN: Okej. 3 00:00:12,536 --> 00:00:13,392 >> [SKRATT] 4 00:00:13,392 --> 00:00:14,240 >> Välkommen tillbaka. 5 00:00:14,240 --> 00:00:14,990 Detta är CS50. 6 00:00:14,990 --> 00:00:16,890 Och detta i slutet av vecka fem. 7 00:00:16,890 --> 00:00:20,020 Och fram tills nu, har vi ganska mycket tagit för givet att det 8 00:00:20,020 --> 00:00:23,480 finns denna kompilator, klang, som du har varit åberopande genom detta 9 00:00:23,480 --> 00:00:27,100 andra verktyg som kallas Gör som på något sätt magiskt omvandlar din källkod 10 00:00:27,100 --> 00:00:31,350 i objektkod, nollor och ettor att datorns CPU, central 11 00:00:31,350 --> 00:00:33,410 behandlingsenhet, faktiskt förstår. 12 00:00:33,410 --> 00:00:36,770 Men det visar sig att det finns ett antal som är händer under huven på 13 00:00:36,770 --> 00:00:38,690 mellan ingång och utgång. 14 00:00:38,690 --> 00:00:41,800 >> Och jag skulle vilja föreslå att vi kött att i lite mer detalj i 15 00:00:41,800 --> 00:00:45,130 dessa fyra steg, något som kallas förbehandling, något 16 00:00:45,130 --> 00:00:48,300 kallas kompilering, som vi har sett, något som kallas montering, och 17 00:00:48,300 --> 00:00:49,420 något som kallas länkning. 18 00:00:49,420 --> 00:00:53,270 Så fram tills nu, i några av våra program, vi har haft kraftig ingår. 19 00:00:53,270 --> 00:00:56,650 På senare tid har vi haft några vassa definierar för konstanter. 20 00:00:56,650 --> 00:01:00,660 Så visar det sig att de saker som inleds med den hash symbol eller 21 00:01:00,660 --> 00:01:04,150 pundet symbolen är pre-processor direktiven. 22 00:01:04,150 --> 00:01:07,960 Det är bara ett finare sätt att säga att det är en kodrad som faktiskt 23 00:01:07,960 --> 00:01:12,280 omvandlas till något annat innan Datorn försöker även att konvertera din 24 00:01:12,280 --> 00:01:13,800 program till ettor och nollor. 25 00:01:13,800 --> 00:01:19,000 >> Exempelvis ingår skarp standard I / O. H, ganska mycket bara innebär att gå 26 00:01:19,000 --> 00:01:24,010 framåt, greppa innehållet i filerna stdio.h och klistra in dem där. 27 00:01:24,010 --> 00:01:25,880 Så inga ettor och nollor vid den punkten ännu. 28 00:01:25,880 --> 00:01:27,470 Det är egentligen bara ett byte. 29 00:01:27,470 --> 00:01:30,790 Och det är gjort under den så kallade förbehandling skede, när du 30 00:01:30,790 --> 00:01:34,230 faktiskt köra klang eller specifikt Gör i de flesta fall. 31 00:01:34,230 --> 00:01:36,950 Så allt detta har hänt först automatiskt hittills. 32 00:01:36,950 --> 00:01:38,800 >> Sedan kommer sammanställningen steget. 33 00:01:38,800 --> 00:01:40,920 Men vi har oversimplified kompilering. 34 00:01:40,920 --> 00:01:45,060 Sammanställa ett program verkligen innebär att ta det från något som C, den 35 00:01:45,060 --> 00:01:48,430 källkod som vi har skrivit, ned till något som kallas församling. 36 00:01:48,430 --> 00:01:52,900 Assembler är en lägre nivå språk som, tack och lov, kommer vi inte 37 00:01:52,900 --> 00:01:55,480 har föranleda mycket till skriva denna termin. 38 00:01:55,480 --> 00:01:59,100 Men det är på den lägsta nivån i meningen att du bokstavligen börja skriva 39 00:01:59,100 --> 00:02:04,270 addera och subtrahera och multiplicera och lasta från minnet och sparar i minnet, den 40 00:02:04,270 --> 00:02:08,259 mycket grundläggande instruktioner som en dator, under huven, 41 00:02:08,259 --> 00:02:09,639 faktiskt förstår. 42 00:02:09,639 --> 00:02:14,930 >> Slutligen tar monterar det språket till nollor och ettor som vi har varit 43 00:02:14,930 --> 00:02:16,190 beskriver hittills. 44 00:02:16,190 --> 00:02:19,270 Och verkligen Slutligen finns det så kallade länka fas, som vi kommer 45 00:02:19,270 --> 00:02:22,360 se på bara ett ögonblick, som kombinerar era nollor och ettor med nollor och 46 00:02:22,360 --> 00:02:24,870 ettor andra människor före du har skapat. 47 00:02:24,870 --> 00:02:26,660 >> Så överväga detta super enkla program. 48 00:02:26,660 --> 00:02:27,560 Det var från vecka 1. 49 00:02:27,560 --> 00:02:29,610 Det sa bara, Hello World, på skärmen. 50 00:02:29,610 --> 00:02:30,920 Vi körde detta genom klang. 51 00:02:30,920 --> 00:02:33,200 Eller vi körde igenom Gör som körde klang. 52 00:02:33,200 --> 00:02:36,170 Och utmatas vid den tidpunkt där några nollor och ettor. 53 00:02:36,170 --> 00:02:38,100 Men det visar sig att det finns ett mellanliggande steg. 54 00:02:38,100 --> 00:02:40,460 Om jag går hit - oops, inte vill se honom ännu. 55 00:02:40,460 --> 00:02:44,800 Om jag går hit till min apparat och jag öppnar upp hej.c, här 56 00:02:44,800 --> 00:02:46,160 är det samma program. 57 00:02:46,160 --> 00:02:48,600 Och vad jag ska göra i min terminal Fönstret här är jag ska 58 00:02:48,600 --> 00:02:51,430 kör klang snarare än att göra, vilket automatiserar alla fyra 59 00:02:51,430 --> 00:02:52,870 dessa steg för oss. 60 00:02:52,870 --> 00:02:58,620 Och jag ska göra klang-S och sedan hej.c och ange sedan. 61 00:02:58,620 --> 00:03:00,590 >> Och jag får en blinkande prompt igen, vilket är bra. 62 00:03:00,590 --> 00:03:05,280 Och nu i en något större fönster, Jag kommer att öppna upp gedit i här. 63 00:03:05,280 --> 00:03:09,610 Och jag ska öppna en fil som, visar sig, kallas hello.s detta 64 00:03:09,610 --> 00:03:11,870 innehåller det assembler Jag hänvisade till tidigare. 65 00:03:11,870 --> 00:03:15,060 Och detta är vad som kallas församling språk, tämligen låg nivå 66 00:03:15,060 --> 00:03:18,470 instruktioner som din Intel CPU eller vad det är som finns inuti 67 00:03:18,470 --> 00:03:19,350 förstår. 68 00:03:19,350 --> 00:03:24,480 Och mov är för drag. samtal är för ringer, en mycket låg nivå funktion. 69 00:03:24,480 --> 00:03:26,380 sub är för subtrahera. 70 00:03:26,380 --> 00:03:30,370 >> Så när du har en viss processor inuti av datorn, gör vad den 71 00:03:30,370 --> 00:03:34,300 distinkta, kontra andra processorer på marknad, är vilka anvisningar det 72 00:03:34,300 --> 00:03:39,460 förstår och ofta hur effektivt det är, hur snabbt det är på att genomföra några 73 00:03:39,460 --> 00:03:40,380 av dessa instruktioner. 74 00:03:40,380 --> 00:03:45,150 Nu mer om detta, kan du ta nästa höst CS61 vid högskolan. 75 00:03:45,150 --> 00:03:48,170 Men här har vi, till exempel, ett fåtal identifierare som kanske ser bekant. 76 00:03:48,170 --> 00:03:50,150 hello.c är namnet på programmet. 77 00:03:50,150 --> 00:03:51,070 >> . Text - 78 00:03:51,070 --> 00:03:54,190 det finns inte mycket av intresse där just nu, minns att texten 79 00:03:54,190 --> 00:03:59,190 segment, och med måndagen, är där i minne ditt program slutar faktiskt upp. 80 00:03:59,190 --> 00:04:01,330 Så det är åtminstone vagt bekanta där. 81 00:04:01,330 --> 00:04:03,730 Här, naturligtvis, är ett omnämnande vår huvuduppgift. 82 00:04:03,730 --> 00:04:07,220 Rulla ner, dessa hänvisar till saker kallade register, mycket små bitar av 83 00:04:07,220 --> 00:04:09,190 minne i din faktiska CPU. 84 00:04:09,190 --> 00:04:12,930 Och om jag rulla ner ännu vidare, ser jag någon sorts 85 00:04:12,930 --> 00:04:14,240 indirekt omnämnande av ASCII. 86 00:04:14,240 --> 00:04:17,120 Och det, faktiskt, är att strängen, hej, kommatecken, värld. 87 00:04:17,120 --> 00:04:20,079 >> Så lång historia kort, har detta varit händer för dig, automatiskt, 88 00:04:20,079 --> 00:04:22,140 under huven all denna tid. 89 00:04:22,140 --> 00:04:26,450 Och vad har hänt egentligen är en gång du har kört klang, eller genom 90 00:04:26,450 --> 00:04:29,150 Gör, du får första, från källkoden, den 91 00:04:29,150 --> 00:04:30,700 så kallade assembler. 92 00:04:30,700 --> 00:04:35,210 Sedan klang är att omvandla denna församling språket ner till ettor och nollor. 93 00:04:35,210 --> 00:04:38,340 Och detta är den bild som vi började vår diskussion i vecka 0 på - 94 00:04:38,340 --> 00:04:39,840 och sedan Vecka 1 på. 95 00:04:39,840 --> 00:04:44,030 Och sedan slutligen, dessa nollor och ettor kombineras med nollor och ettor 96 00:04:44,030 --> 00:04:47,190 från dessa bibliotek som vi har tagit för givet som Standard I / O eller 97 00:04:47,190 --> 00:04:50,010 String bibliotek eller ens den CS50 biblioteket. 98 00:04:50,010 --> 00:04:54,200 >> Så att måla denna bild mer visuellt, har vi hej.c. 99 00:04:54,200 --> 00:04:57,220 Och det, naturligtvis, använder printf fungera att säga, hej världen. 100 00:04:57,220 --> 00:05:01,810 Sammanställningen steget tar ner det till den filen såg vi bara hello.s, även 101 00:05:01,810 --> 00:05:04,290 men som normalt har raderats automatiskt för dig. 102 00:05:04,290 --> 00:05:06,050 Men det är den assemblerkod i mitten steget. 103 00:05:06,050 --> 00:05:09,750 Och sedan när vi monterar aggregatet språk, så att säga, det är då du 104 00:05:09,750 --> 00:05:10,830 få dessa nollor och ettor. 105 00:05:10,830 --> 00:05:13,920 Så vi har zoomat in på ett effektivt sätt i dag på vad vi har tagit för givet, 106 00:05:13,920 --> 00:05:16,430 innebär att gå källkod att invända kod. 107 00:05:16,430 --> 00:05:18,850 >> Men slutligen, nu när samma bild - Låt oss skjuta det över till 108 00:05:18,850 --> 00:05:20,020 den vänstra sidan. 109 00:05:20,020 --> 00:05:22,880 Och notera att i toppen finns Jag nämnde stdio.h. 110 00:05:22,880 --> 00:05:25,030 Det är en fil som vi har inkluderat i nästan alla av 111 00:05:25,030 --> 00:05:26,250 program som vi har skrivit. 112 00:05:26,250 --> 00:05:28,830 Och det är den fil vars innehåll får kopiera klistras, 113 00:05:28,830 --> 00:05:30,350 effektivt ovanpå din kod. 114 00:05:30,350 --> 00:05:34,170 Men det visar sig att, på en dator systemet någonstans, det finns förmodligen en 115 00:05:34,170 --> 00:05:39,150 stdio.c fil som någon skrev år sedan som implementerar alla 116 00:05:39,150 --> 00:05:41,870 funktioner som förklarades i stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Nu i verkligheten är det nog inte på din Mac eller din PC eller ens i 118 00:05:45,465 --> 00:05:47,660 CS50 apparaten är en rå C-kod. 119 00:05:47,660 --> 00:05:52,710 Någon sammanställt redan det och inkluderade . O fil för objektkod eller. En 120 00:05:52,710 --> 00:05:56,020 fil, som hänvisar till ett delat bibliotek som blivit förinstallerat och 121 00:05:56,020 --> 00:05:57,240 förkompilerade för dig. 122 00:05:57,240 --> 00:06:01,950 Men antar att det faktiskt existerar på vår dator stdio.c parallellt 123 00:06:01,950 --> 00:06:02,650 med Clang. 124 00:06:02,650 --> 00:06:04,960 Din kod är under utarbetande och monteras. 125 00:06:04,960 --> 00:06:09,200 stdio.c 's kod ska sammanställas och monteras, så att denna mycket sista 126 00:06:09,200 --> 00:06:13,730 steg, här nere, måste vi på något sätt länk, så att säga, dina nollor och ettor 127 00:06:13,730 --> 00:06:18,430 med sina ettor och nollor i en enkelt program som i slutändan är 128 00:06:18,430 --> 00:06:20,540 kallas bara Hej. 129 00:06:20,540 --> 00:06:23,340 >> Så det är all den magi som är har hänt hittills. 130 00:06:23,340 --> 00:06:26,430 Och kommer att fortsätta att ta dessa processer för givet, men inser 131 00:06:26,430 --> 00:06:28,750 det finns en hel del smaskiga detaljer händer under det. 132 00:06:28,750 --> 00:06:31,920 Och detta är vad som gör din dator med Intel Inside 133 00:06:31,920 --> 00:06:33,940 särskilt tydlig. 134 00:06:33,940 --> 00:06:37,020 >> Så på detta meddelande, om du vill ansluta oss till lunch på fredag, går 135 00:06:37,020 --> 00:06:41,570 till det vanliga stället cs50.net/rsvp, 13:15 på fredag. 136 00:06:41,570 --> 00:06:43,400 Och nu några tillkännagivanden. 137 00:06:43,400 --> 00:06:44,670 Så vi har några goda nyheter. 138 00:06:44,670 --> 00:06:45,970 Och vi har några dåliga nyheter. 139 00:06:45,970 --> 00:06:47,260 Börja med några goda nyheter här. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [STÖNANDE] 142 00:06:54,510 --> 00:06:54,710 >> Okej. 143 00:06:54,710 --> 00:06:56,670 Tja, det är tekniskt en helgdag, så det är inte så mycket en gåva från oss. 144 00:06:56,670 --> 00:06:58,030 Men då den dåliga nyheten förstås. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [STÖNANDE] 147 00:07:01,880 --> 00:07:03,530 >> Jag tillbringade mycket tid på dessa animationer. 148 00:07:03,530 --> 00:07:04,690 >> [SKRATT] 149 00:07:04,690 --> 00:07:07,000 >> Det kommer att finnas en översyn session denna kommande måndag. 150 00:07:07,000 --> 00:07:08,340 Det kommer att vara klockan 5:30. 151 00:07:08,340 --> 00:07:11,210 Vi kommer att påminna dig om alla dessa detaljer via e-post på kursens 152 00:07:11,210 --> 00:07:13,470 hemsida på bara ett par dagar tid. 153 00:07:13,470 --> 00:07:16,610 Det kommer att filmas och göras tillgängliga kort därefter. 154 00:07:16,610 --> 00:07:19,200 Så om du inte kan göra det måndag natt kortplats, oroa dig inte. 155 00:07:19,200 --> 00:07:22,270 Sektioner den kommande veckan kommer också fokusera på översyn för frågesport. 156 00:07:22,270 --> 00:07:25,670 Om din avsnitt är på måndag, vilket är indeed universitet semester, kommer vi 157 00:07:25,670 --> 00:07:26,920 fortfarande träffas i avsnittet. 158 00:07:26,920 --> 00:07:28,890 Om du helt enkelt inte kan göra det avsnitt eftersom du kommer 159 00:07:28,890 --> 00:07:29,860 bort, det är bra. 160 00:07:29,860 --> 00:07:33,710 Delta i en söndag eller tisdag avsnitt eller tune in till Jasons avsnitt, vilket är 161 00:07:33,710 --> 00:07:35,110 tillgängliga online. 162 00:07:35,110 --> 00:07:37,490 >> Så, mer dåliga nyheter. 163 00:07:37,490 --> 00:07:41,960 Så enligt kursplanen, Vi har föreläsning nästa fredag. 164 00:07:41,960 --> 00:07:43,690 Men de goda nyheterna - 165 00:07:43,690 --> 00:07:44,860 klart, jag tillbringade för mycket tid på detta. 166 00:07:44,860 --> 00:07:45,280 >> [SKRATT] 167 00:07:45,280 --> 00:07:47,140 >> Vi ska avbryta nästa fredagens föreläsningar. 168 00:07:47,140 --> 00:07:50,590 Så det kommer att bli en present till oss, så att du kan verkligen ha en trevlig paus i 169 00:07:50,590 --> 00:07:52,990 mellan denna vecka och två veckor framåt. 170 00:07:52,990 --> 00:07:57,460 Så ingen föreläsningar nästa vecka, bara en liten lite frågesport, som du bör vara 171 00:07:57,460 --> 00:07:59,030 blir allt mer upphetsad. 172 00:07:59,030 --> 00:08:03,870 >> Så låt oss nu vända vår uppmärksamhet mot något som faktiskt är mer visuell 173 00:08:03,870 --> 00:08:06,990 och mer spännande och att ställa scenen för vad som kommer att vara på horisonten 174 00:08:06,990 --> 00:08:08,420 på bara ett par veckor. 175 00:08:08,420 --> 00:08:12,160 Efter den första frågesporten, vi vrider fokusera på vårt problem set till en annan 176 00:08:12,160 --> 00:08:16,710 domän specifikt problem, som kriminalteknik och säkerhet mer allmänt. 177 00:08:16,710 --> 00:08:19,550 >> Faktum är att tradition med detta problem set är för mig en av de 178 00:08:19,550 --> 00:08:24,850 undervisning karl eller certifikatutfärdare för att gå över campus ta några fotografier av 179 00:08:24,850 --> 00:08:29,450 identifierbara men icke uppenbara människor, platser eller saker, då varje år jag 180 00:08:29,450 --> 00:08:34,520 på något sätt lyckas råkar radera eller korrupta digitala mediekort 181 00:08:34,520 --> 00:08:35,720 som är inne i vår kamera. 182 00:08:35,720 --> 00:08:36,860 Men ingen big deal. 183 00:08:36,860 --> 00:08:39,200 Jag kan gå vidare och plugga som i min dator. 184 00:08:39,200 --> 00:08:43,010 Jag kan göra en rättsmedicinsk bild av den, så att tala, genom att kopiera nollor och 185 00:08:43,010 --> 00:08:46,830 ettor off av denna minneskort, vare dess ett SD-kort eller compact flash-kort eller 186 00:08:46,830 --> 00:08:48,100 vad du är bekant med. 187 00:08:48,100 --> 00:08:49,300 Och då kan vi dela ut det. 188 00:08:49,300 --> 00:08:53,190 >> Och så utmaningen framöver, bland annat saker för dig, kommer att vara att skriva 189 00:08:53,190 --> 00:08:58,630 C-kod som återvinner en hel massa JPEG för mig och avslöjade blir 190 00:08:58,630 --> 00:09:00,190 dessa människor, platser eller saker. 191 00:09:00,190 --> 00:09:03,340 Och vi kommer också att prata, i detta problem ställa och i dagarna framöver, om 192 00:09:03,340 --> 00:09:04,440 grafik mer allmänt. 193 00:09:04,440 --> 00:09:06,140 Vi har använt dem, en kurs, för att bryta ut. 194 00:09:06,140 --> 00:09:09,080 Men du har slags tagit för givet det finns dessa höga nivå föreställningar 195 00:09:09,080 --> 00:09:10,680 av rektanglar och ovaler. 196 00:09:10,680 --> 00:09:12,450 Men under huven det finns pixlar. 197 00:09:12,450 --> 00:09:14,370 Och du har fått börja tänker på dem. 198 00:09:14,370 --> 00:09:18,800 Eller du kommer för p-set 4 måste tänka om gapet mellan dina tegelstenar, hur 199 00:09:18,800 --> 00:09:21,990 snabbt du bollen rör sig över skärmen för att bryta ut. 200 00:09:21,990 --> 00:09:24,830 Så det är denna föreställning om prickar på skärmen som är 201 00:09:24,830 --> 00:09:26,290 spelar in redan. 202 00:09:26,290 --> 00:09:29,430 >> Nu vad du ser, är dock vad du får på en datorskärm. 203 00:09:29,430 --> 00:09:33,680 Om du någonsin tittat på några bra eller dålig TV, oddsen är att de ganska mycket 204 00:09:33,680 --> 00:09:36,280 behandla publiken som technophobes som inte riktigt 205 00:09:36,280 --> 00:09:37,630 vet mycket om datorer. 206 00:09:37,630 --> 00:09:40,840 Och så är det väldigt lätt för polisen detektiv att säga, kan du 207 00:09:40,840 --> 00:09:41,710 städa upp det för mig? 208 00:09:41,710 --> 00:09:42,710 Eller förbättra, eller hur? 209 00:09:42,710 --> 00:09:45,550 Förbättra är som modeord i mest något brott relaterade show. 210 00:09:45,550 --> 00:09:49,240 Och verkligheten är om du tar en mycket suddig bild av en misstänkt gör 211 00:09:49,240 --> 00:09:51,620 något dåligt, kan du inte bara öka den. 212 00:09:51,620 --> 00:09:53,080 Du kan inte zooma in steglöst. 213 00:09:53,080 --> 00:09:56,350 Du kan inte se i glimt av någons öga som begick det 214 00:09:56,350 --> 00:09:59,860 särskilt brott, trots att Prevalensen av denna på TV. 215 00:09:59,860 --> 00:10:04,110 >> Och så med att vi motivera att kommande problem som med en glimt 216 00:10:04,110 --> 00:10:05,765 vissa visar med vilken du kan vara bekant. 217 00:10:05,765 --> 00:10:06,500 >> [VIDEO SPELA] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Nu, låt oss få en bra titt på dig. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Vänta. 222 00:10:17,766 --> 00:10:18,658 Kör det tillbaka. 223 00:10:18,658 --> 00:10:19,550 >> -Vänta lite. 224 00:10:19,550 --> 00:10:21,580 Gå höger. 225 00:10:21,580 --> 00:10:21,800 >> -Där. 226 00:10:21,800 --> 00:10:22,690 Frys det. 227 00:10:22,690 --> 00:10:23,692 >> -Full 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 >> -Dra upp på det, kommer ya? 231 00:10:25,140 --> 00:10:27,090 >> -Vektor i den där killen av att den bakre hjulet. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom in just här på denna plats. 233 00:10:29,730 --> 00:10:33,700 >> -Med rätt utrustning, det avbildade kan förstoras och skärpas. 234 00:10:33,700 --> 00:10:34,490 >> -Vad är det? 235 00:10:34,490 --> 00:10:35,870 >> -Det är en förbättring program. 236 00:10:35,870 --> 00:10:36,793 >> -Kan du klara det upp någon? 237 00:10:36,793 --> 00:10:38,560 >> -Jag vet inte. 238 00:10:38,560 --> 00:10:39,090 Låt oss stärka den. 239 00:10:39,090 --> 00:10:41,690 >> -Förbättra sektion A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Jag förbättrade detaljer och - 241 00:10:43,510 --> 00:10:44,456 >> -Jag tror att det räcker att öka. 242 00:10:44,456 --> 00:10:45,402 Släpp det till min skärm. 243 00:10:45,402 --> 00:10:47,300 >> -Förbättra reflektion i hennes ögon. 244 00:10:47,300 --> 00:10:49,330 >> -Låt oss köra detta genom videoförstärkning. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, kan du förbättra detta? 246 00:10:50,340 --> 00:10:52,320 >> -Vänta. 247 00:10:52,320 --> 00:10:54,290 >> -Jag har arbetat med denna reflektion. 248 00:10:54,290 --> 00:10:55,560 >> -Någon eftertanke. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Det är en reflektion av mannens ansikte. 251 00:10:57,940 --> 00:10:58,860 >> -Den reflektion. 252 00:10:58,860 --> 00:10:59,710 >> -Det är en reflektion. 253 00:10:59,710 --> 00:11:00,900 >> -Zoom in på spegeln. 254 00:11:00,900 --> 00:11:03,500 >> -Du kan se en reflektion. 255 00:11:03,500 --> 00:11:04,700 >> -Kan du förbättra bilden härifrån? 256 00:11:04,700 --> 00:11:05,700 >> -Kan du förbättra honom just här? 257 00:11:05,700 --> 00:11:06,500 >> -Kan du förbättra den? 258 00:11:06,500 --> 00:11:07,380 >> -Kan du förbättra den? 259 00:11:07,380 --> 00:11:08,190 >> -Kan vi förbättra detta? 260 00:11:08,190 --> 00:11:08,940 >> -Kan du förbättra den? 261 00:11:08,940 --> 00:11:10,280 >> -Vänta lite, jag ska förbättra. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom in på dörren. 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 >> [SKRATT] 266 00:11:13,197 --> 00:11:14,360 >> -Flytta in 267 00:11:14,360 --> 00:11:15,100 >> -Vänta, sluta. 268 00:11:15,100 --> 00:11:15,740 >> -Sluta. 269 00:11:15,740 --> 00:11:16,290 >> -Paus. 270 00:11:16,290 --> 00:11:19,390 >> -Rotera en 75 grader runt den vertikala behaga. 271 00:11:19,390 --> 00:11:19,886 >> [SKRATT] 272 00:11:19,886 --> 00:11:24,350 >> -Sluta, och tillbaka till den del om dörren igen. 273 00:11:24,350 --> 00:11:26,330 >> -Fick en bild förstärkare som kan bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Vi kanske kan använda Pradeep Sen metod för att se in i windows. 275 00:11:28,990 --> 00:11:30,680 >> -Denna programvara är state of the art. 276 00:11:30,680 --> 00:11:31,676 >> -Ikonen värdet är avstängd. 277 00:11:31,676 --> 00:11:34,166 >> -Med rätt kombination av algoritmer. 278 00:11:34,166 --> 00:11:38,399 >> -Han har tagit belysning algoritmer för att nästa nivå och jag kan använda dem till 279 00:11:38,399 --> 00:11:38,648 förstärka detta fotografi. 280 00:11:38,648 --> 00:11:42,050 >> -Lock på och förstora den z-axeln. 281 00:11:42,050 --> 00:11:42,760 >> -Förbättra. 282 00:11:42,760 --> 00:11:43,060 >> -Förbättra. 283 00:11:43,060 --> 00:11:43,760 >> -Förbättra. 284 00:11:43,760 --> 00:11:45,010 >> -Freeze och förbättra. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END VIDEOAVSPELNING] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. MALAN: Så Problem Set 5 är vad som väntar där. 288 00:11:51,470 --> 00:11:55,260 Så vi kommer snart att få en bättre förståelse om när och varför du kan 289 00:11:55,260 --> 00:11:57,300 och vår inte kan öka på det sättet. 290 00:11:57,300 --> 00:12:00,090 Men först, låt oss återvända vår uppmärksamhet till några av de byggstenar vi ska 291 00:12:00,090 --> 00:12:02,250 måste kunna berätta den historien. 292 00:12:02,250 --> 00:12:05,580 >> Så minns att vi drog denna bild på Måndag och lite förra veckan. 293 00:12:05,580 --> 00:12:09,970 Och detta beskriver layouten av saker i datorns minne när 294 00:12:09,970 --> 00:12:11,000 kör vissa program. 295 00:12:11,000 --> 00:12:14,310 Den tech segment där uppe, återkallelse, hänvisar till de faktiska nollor och ettor 296 00:12:14,310 --> 00:12:16,000 att komponera ditt program. 297 00:12:16,000 --> 00:12:19,340 Det finns, under det, en del initierade eller oinitierade uppgifter, som typiskt 298 00:12:19,340 --> 00:12:22,910 refererar till saker som konstanter eller strängar eller globala variabler som har 299 00:12:22,910 --> 00:12:24,200 försatts i förväg. 300 00:12:24,200 --> 00:12:26,500 Det finns i högen, men vi ska komma tillbaka till det på en bit. 301 00:12:26,500 --> 00:12:27,410 >> Och sedan finns det stacken. 302 00:12:27,410 --> 00:12:30,660 Ungefär som en stapel av brickor i cafeteria, det är här minnet blir 303 00:12:30,660 --> 00:12:33,610 skiktad och skiktas när du gör vad i ett program? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Vad är det stack användning för? 306 00:12:37,730 --> 00:12:39,320 >> Yeah? 307 00:12:39,320 --> 00:12:40,000 >> Ring av funktion. 308 00:12:40,000 --> 00:12:42,890 Varje gång du ringer en funktion, det är ges till flisa av minne för dess 309 00:12:42,890 --> 00:12:45,020 lokala variabler eller dess parametrar. 310 00:12:45,020 --> 00:12:48,810 Och bildmässigt, ser vi att med varje successiv funktion kallas, när A 311 00:12:48,810 --> 00:12:52,520 Parlamentet B kallar C samtal D, de få skiktas på stapeln. 312 00:12:52,520 --> 00:12:55,630 Och inom varje av dessa skivor minnet är i huvudsak en unik räckvidd 313 00:12:55,630 --> 00:12:58,590 för denna funktion, vilken, naturligtvis, är problematiskt om du vill lämna 314 00:12:58,590 --> 00:13:01,850 från en funktion till en annan En bit av data som du vill ha det 315 00:13:01,850 --> 00:13:03,500 att mutera eller ändra. 316 00:13:03,500 --> 00:13:08,060 >> Så vad var vår lösning för att möjliggöra En funktion som representeras av en stapel 317 00:13:08,060 --> 00:13:11,390 rama ändra det minne inuti av en annan stack ram? 318 00:13:11,390 --> 00:13:14,590 Hur gör de två prata med varandra? 319 00:13:14,590 --> 00:13:18,510 Så med hjälp av pekare eller adresser, vilket, återigen, bara beskriva var i 320 00:13:18,510 --> 00:13:22,280 minne, i form av en specifik bita nummer, den speciella 321 00:13:22,280 --> 00:13:23,830 värde kan hittas. 322 00:13:23,830 --> 00:13:26,860 Så minns förra gången också vi fortsatte berättelsen och tittade på en 323 00:13:26,860 --> 00:13:28,280 ganska buggig program. 324 00:13:28,280 --> 00:13:32,900 Och detta program är buggyn för ett fåtal skäl, men det mest oroande en är 325 00:13:32,900 --> 00:13:34,620 eftersom den inte kontrollera vad? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ja, misslyckas det att kolla in. 328 00:13:40,450 --> 00:13:41,870 Förlåt? 329 00:13:41,870 --> 00:13:43,880 >> Om det är mer än 12 tecken. 330 00:13:43,880 --> 00:13:47,260 Så mycket smart, när du ringer memcopy, vilket, som namnet antyder, precis 331 00:13:47,260 --> 00:13:50,630 kopior minne från sitt andra argument in i sitt första argument. 332 00:13:50,630 --> 00:13:54,730 Det tredje argumentet, mycket smart, är kontrolleras för att säkerställa att du inte 333 00:13:54,730 --> 00:13:59,400 kopiera mer än, i det här fallet, längden av bar, antal tecken, 334 00:13:59,400 --> 00:14:03,810 in i destinationsvektorn, är vilken denna array C. Men problemet är att det 335 00:14:03,810 --> 00:14:07,230 om C själv är inte stor nog att hantera det? 336 00:14:07,230 --> 00:14:09,900 Du kommer att kopiera det antal byte som du har fått. 337 00:14:09,900 --> 00:14:13,040 Men vad har du egentligen mer byte än du har utrymme för? 338 00:14:13,040 --> 00:14:16,770 >> Nåväl, det här programmet är mycket dumt bara blint fortsätter att ta vad det är 339 00:14:16,770 --> 00:14:20,650 givet, är hej backslash 0 bra om strängen är kort 340 00:14:20,650 --> 00:14:22,040 nog, liksom fem tecken. 341 00:14:22,040 --> 00:14:26,470 Men om det är faktiskt 12 tecken eller 1.200 tecken, såg vi förra gången 342 00:14:26,470 --> 00:14:29,380 att du bara kommer att helt överskrivning minne som 343 00:14:29,380 --> 00:14:30,470 tillhör inte dig. 344 00:14:30,470 --> 00:14:34,390 Och värsta fall, om du skriver att röda delen där som vi kallade 345 00:14:34,390 --> 00:14:35,380 returadress - 346 00:14:35,380 --> 00:14:38,370 detta är precis där datorn automatiskt, för dig, bakom 347 00:14:38,370 --> 00:14:43,130 scener, stoppas undan ett 32-bitars värde som påminner den till vilken adress det ska 348 00:14:43,130 --> 00:14:47,080 tillbaka när foo, denna andra funktion, görs verkställande. 349 00:14:47,080 --> 00:14:49,320 Det är ett bröd smula slags till vilken den återvänder. 350 00:14:49,320 --> 00:14:52,490 Om du skriver det, potentiellt, om du är den onde, kan kunde 351 00:14:52,490 --> 00:14:54,750 potentiellt ta över någons dator. 352 00:14:54,750 --> 00:14:58,020 Och du kommer säkerligen krascha det i de flesta fall. 353 00:14:58,020 --> 00:15:01,690 >> Nu är detta problem var bara förvärrat när vi började prata om minnet 354 00:15:01,690 --> 00:15:03,010 förvaltningen mer generellt. 355 00:15:03,010 --> 00:15:07,150 Och malloc, för minnesallokering, är en funktion som vi kan använda för att fördela 356 00:15:07,150 --> 00:15:11,260 minnet när vi inte vet i förväg att vi kanske behöver. 357 00:15:11,260 --> 00:15:13,960 Så, till exempel, om jag går tillbaka till apparaten här. 358 00:15:13,960 --> 00:15:21,010 Och jag öppnar upp från förra gången hello2.c, minns detta program här, som såg 359 00:15:21,010 --> 00:15:23,500 lite ungefär så här, bara tre rader - 360 00:15:23,500 --> 00:15:27,940 uppge ditt namn, sedan string namn, till vänster, lika getString. 361 00:15:27,940 --> 00:15:29,690 Och då kan vi skriva ut det, användarens namn. 362 00:15:29,690 --> 00:15:31,170 >> Så detta var ett super enkelt program. 363 00:15:31,170 --> 00:15:34,870 För att vara tydlig, låt mig gå vidare och göra hello-2. 364 00:15:34,870 --> 00:15:36,680 Jag kommer att göra dot slash hello-2. 365 00:15:36,680 --> 00:15:37,750 Uppge ditt namn - 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 verkar fungera OK. 370 00:15:41,060 --> 00:15:43,140 Men vad som verkligen händer under huven här? 371 00:15:43,140 --> 00:15:44,670 Först ska vi skära ner några lager. 372 00:15:44,670 --> 00:15:48,380 String är bara en synonym vi har insåg för vad? 373 00:15:48,380 --> 00:15:49,110 Char stjärna. 374 00:15:49,110 --> 00:15:52,740 Så låt oss göra det lite mer svårbegripliga men mer tekniskt korrekt att detta 375 00:15:52,740 --> 00:15:55,570 är en röding stjärna, vilket innebär att namn, ja, är en variabel. 376 00:15:55,570 --> 00:15:59,920 Men vad namn butiker är adressen en röding, vilket känns lite konstigt 377 00:15:59,920 --> 00:16:01,050 eftersom jag får tillbaka en sträng. 378 00:16:01,050 --> 00:16:03,580 Jag får tillbaka flera tecken inte en röding. 379 00:16:03,580 --> 00:16:07,400 >> Men naturligtvis behöver du bara den första röding adress att komma ihåg när 380 00:16:07,400 --> 00:16:08,870 Hela strängen är därför varför? 381 00:16:08,870 --> 00:16:12,700 Hur tror du ut där i slutet av strängen är att veta i början? 382 00:16:12,700 --> 00:16:13,630 Det omvända snedstrecket noll. 383 00:16:13,630 --> 00:16:17,260 Så med dessa två ledtrådar du räkna ut före början och slutet av 384 00:16:17,260 --> 00:16:20,280 varje sträng är, så länge de är korrekt utformad med den null 385 00:16:20,280 --> 00:16:22,110 terminator, som omvänt snedstreck noll. 386 00:16:22,110 --> 00:16:24,520 >> Men detta kräver getString. 387 00:16:24,520 --> 00:16:28,020 Och det visar sig att getString hela denna tid har varit lite 388 00:16:28,020 --> 00:16:28,820 fusk för oss. 389 00:16:28,820 --> 00:16:32,460 Det har gjort detta arbete, för att vara säker, få en sträng från användaren. 390 00:16:32,460 --> 00:16:34,580 Men var är det minne kommit från? 391 00:16:34,580 --> 00:16:38,440 Om vi ​​går tillbaka till bilden här och tillämpa definitionen från bara en 392 00:16:38,440 --> 00:16:42,610 stund sedan, att stapeln är där minne går när funktioner kallas, 393 00:16:42,610 --> 00:16:45,370 med den logiken, när du ringer getString, och då jag skriver in 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Enter, där är D-A-V-I-D omvänt snedstreck noll lagras, baserat på den 395 00:16:50,900 --> 00:16:53,480 Historien har vi berättat för oss långt? 396 00:16:53,480 --> 00:16:55,190 >> Det verkar vara i stapeln, rätt? 397 00:16:55,190 --> 00:16:58,120 När du ringer får sträng får du en liten del av minnet på traven. 398 00:16:58,120 --> 00:17:01,630 Så det är självklart att D-A-V-I-D omvänt snedstreck noll lagras 399 00:17:01,630 --> 00:17:02,770 det i stapeln. 400 00:17:02,770 --> 00:17:07,680 Men vänta lite, getString avkastning den strängen, så att säga, vilket betyder 401 00:17:07,680 --> 00:17:11,700 Det är magasinet från cafeterian tas bort från stapeln. 402 00:17:11,700 --> 00:17:14,560 Och vi sade förra gången att så fort en returnerar funktionen, och du tar det 403 00:17:14,560 --> 00:17:20,109 bricka, så att säga, av stapeln, vad kan du anta om resterna av 404 00:17:20,109 --> 00:17:21,819 att minnet? 405 00:17:21,819 --> 00:17:25,160 Jag sorts ritade dem som frågetecken eftersom de blir effektivt 406 00:17:25,160 --> 00:17:26,250 okända värden. 407 00:17:26,250 --> 00:17:29,500 De kan återanvändas när vissa nästa funktion kallas. 408 00:17:29,500 --> 00:17:31,870 >> Med andra ord, om vi råkar att lagra - 409 00:17:31,870 --> 00:17:34,350 Jag drar en snabb bild här i bunten. 410 00:17:34,350 --> 00:17:38,690 Om vi ​​råkar dra ned av mitt minne segmentet, och vi ska säga 411 00:17:38,690 --> 00:17:42,230 att detta är platsen för minnet ockuperat av huvud och kanske arg c och 412 00:17:42,230 --> 00:17:46,790 arg v och allt annat i programmet, när getString kallas, 413 00:17:46,790 --> 00:17:51,120 förmodligen getString blir en bit av minnet här. 414 00:17:51,120 --> 00:17:53,940 Och sedan D-A-V-I-D somehow hamnar i denna funktion. 415 00:17:53,940 --> 00:17:55,320 Och jag ska förenklingarna. 416 00:17:55,320 --> 00:18:00,050 Men låt oss anta att dess D-A-V-I-D omvänt snedstreck noll. 417 00:18:00,050 --> 00:18:03,500 Så här många bytes som används i ramen för getString. 418 00:18:03,500 --> 00:18:08,270 >> Men så fort getString avkastning, vi sade förra gången att detta minne över 419 00:18:08,270 --> 00:18:11,340 här hela blir - Woops! - 420 00:18:11,340 --> 00:18:14,270 allt blir effektivt raderas. 421 00:18:14,270 --> 00:18:17,220 Och vi kan tänka på det nu som frågan varumärken för vem vet 422 00:18:17,220 --> 00:18:18,720 vad som kommer att bli av det minnet. 423 00:18:18,720 --> 00:18:22,130 Sannerligen, jag ofta kallar funktioner andra än getString. 424 00:18:22,130 --> 00:18:24,750 Och så fort jag kallar någon annan funktion än getString, kanske inte i 425 00:18:24,750 --> 00:18:28,860 detta särskilda program vi bara såg på men någon annan, säkert någon annan 426 00:18:28,860 --> 00:18:34,180 Funktionen kan hamna givet denna nästa plats i stapeln. 427 00:18:34,180 --> 00:18:39,410 >> Så det kan inte vara så att getString butiker D-A-V-I-D på stacken eftersom jag skulle 428 00:18:39,410 --> 00:18:41,040 omedelbart förlora tillgången till den. 429 00:18:41,040 --> 00:18:43,720 Men vi vet att de getString bara tillbaka vad? 430 00:18:43,720 --> 00:18:47,220 Det är inte återvänder till mig sex tecken. 431 00:18:47,220 --> 00:18:51,090 Vad är det återvänder verkligen gjorde vi sluta förra gången? 432 00:18:51,090 --> 00:18:52,480 Adressen för den första. 433 00:18:52,480 --> 00:18:56,650 Så på något sätt, när du ringde getString, det fördela en del av minnet för 434 00:18:56,650 --> 00:18:59,620 strängen som användarna skriver och sedan återvänder adress av det. 435 00:18:59,620 --> 00:19:02,930 Och det visar sig att när du vill fungera för att allokera minne i detta 436 00:19:02,930 --> 00:19:08,390 sätt och återgå till den som ringt den funktionen, adressen till 437 00:19:08,390 --> 00:19:11,870 att bit av minnet, absolut du kan inte sätta det i stapeln vid 438 00:19:11,870 --> 00:19:14,750 botten, eftersom funktionellt är det bara ska inte bli ert mycket 439 00:19:14,750 --> 00:19:17,800 snabbt, så du kan nog gissa var Vi kommer förmodligen att slänga det 440 00:19:17,800 --> 00:19:20,130 istället, den så kallade högen. 441 00:19:20,130 --> 00:19:25,290 >> Så mellan botten av ditt minne är layout och toppen av ditt minne är 442 00:19:25,290 --> 00:19:26,820 layout är en hel massa segment. 443 00:19:26,820 --> 00:19:29,270 En är stacken, och höger ovan är det i högen. 444 00:19:29,270 --> 00:19:33,680 Och högen är bara en annan del av minne som inte används för funktioner 445 00:19:33,680 --> 00:19:34,770 när de kallas. 446 00:19:34,770 --> 00:19:38,100 Den används för längre sikt minne, när du vill ha en funktion för att få tag i 447 00:19:38,100 --> 00:19:42,700 minne och kunna hänga på det utan att förlora kontrollen över det. 448 00:19:42,700 --> 00:19:45,550 >> Nu kan du kanske omedelbart se att detta inte är 449 00:19:45,550 --> 00:19:48,060 nödvändigtvis en perfekt design. 450 00:19:48,060 --> 00:19:51,350 När ditt program tilldelas minne på stacken, eller som du kallar mer och 451 00:19:51,350 --> 00:19:55,540 fler funktioner, eller som du tilldelar minne på högen med malloc ut som 452 00:19:55,540 --> 00:20:00,690 getString gör, vad tydligt verkar vara oundvikligt problem? 453 00:20:00,690 --> 00:20:00,860 >> Rätt. 454 00:20:00,860 --> 00:20:03,150 Liksom det faktum att dessa pilar pekar mot varandra 455 00:20:03,150 --> 00:20:04,380 bådar inte gott. 456 00:20:04,380 --> 00:20:08,630 Och faktiskt, skulle vi mycket snabbt krascha ett program i en rad olika sätt. 457 00:20:08,630 --> 00:20:12,050 I själva verket tror jag att vi kan ha gjort detta misstag en gång. 458 00:20:12,050 --> 00:20:14,020 Eller om inte, låt oss göra det medvetet nu. 459 00:20:14,020 --> 00:20:21,330 Låt mig gå vidare och skriva super snabbt ett program som heter dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Och nu ska jag gå in här och gör skarp inkluderar stdio.h. 461 00:20:26,730 --> 00:20:32,620 Låt oss förklara funktionen foo tar inga argument, är som 462 00:20:32,620 --> 00:20:34,040 betecknas som väl av ogiltiga. 463 00:20:34,040 --> 00:20:37,830 >> Och det enda foo kommer att göra är samtal foo, vilket förmodligen inte är den 464 00:20:37,830 --> 00:20:39,100 smartaste idé, men så var det. 465 00:20:39,100 --> 00:20:40,490 Ent main tomrum. 466 00:20:40,490 --> 00:20:45,270 Nu är det enda huvud går göra är att ringa foo också. 467 00:20:45,270 --> 00:20:51,050 Och bara för sparkar, jag kommer att gå framåt här och säga printf "Hej från 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å om jag inte gör några misstag, Gör dontdothis dot snedstreck. 471 00:21:00,160 --> 00:21:01,960 Och låt oss göra det i ett större fönster - 472 00:21:01,960 --> 00:21:03,210 dot snedstreck, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Kom igen. 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 Tydligen kan du göra det här. 478 00:21:13,100 --> 00:21:15,190 Fan också. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Vänta. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Gjorde vi - 483 00:21:18,270 --> 00:21:20,110 Vi använde det med Make. 484 00:21:20,110 --> 00:21:22,050 >> [Suckar] 485 00:21:22,050 --> 00:21:25,110 >> Jag vet, men jag tror att vi bara bort det. 486 00:21:25,110 --> 00:21:28,410 Öh, ja. 487 00:21:28,410 --> 00:21:30,660 Fan också. 488 00:21:30,660 --> 00:21:32,640 Lös det här Rob. 489 00:21:32,640 --> 00:21:34,678 Vad? 490 00:21:34,678 --> 00:21:35,928 Det är väldigt enkelt. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ja, vände vi optimering av. 493 00:21:47,360 --> 00:21:48,970 OK, stand bye. 494 00:21:48,970 --> 00:21:49,950 Nu känner jag mig bättre. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Okej. 497 00:21:51,780 --> 00:21:53,430 >> Så låt oss kompilera här - 498 00:21:53,430 --> 00:21:55,880 Gör du dontdothis. 499 00:21:55,880 --> 00:22:00,090 Du kanske måste byta namn här till dothis.c på bara ett ögonblick. 500 00:22:00,090 --> 00:22:00,710 Där vi går. 501 00:22:00,710 --> 00:22:01,240 Tack. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Så det faktum att jag skriver något var faktiskt bara 504 00:22:05,480 --> 00:22:08,150 bromsa den process genom vilken vi skulle ha nått den punkten. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Phew! 507 00:22:08,870 --> 00:22:11,180 >> Så vad som verkligen händer? 508 00:22:11,180 --> 00:22:14,440 Anledningen till det, precis som en åt sidan, är göra något i form av insatser och 509 00:22:14,440 --> 00:22:17,270 produktionen tenderar att vara långsammare eftersom du måste skriva tecknen till 510 00:22:17,270 --> 00:22:18,600 skärm, har den att rulla. 511 00:22:18,600 --> 00:22:21,720 Så lång historia kort, jag hade faktiskt hände så otålig, skulle vi ha 512 00:22:21,720 --> 00:22:23,260 sett denna slutresultatet också. 513 00:22:23,260 --> 00:22:26,220 Nu när jag fick rida på tryck-ups, Vi ser det genast. 514 00:22:26,220 --> 00:22:28,410 Så varför händer detta. 515 00:22:28,410 --> 00:22:31,300 Tja, den enkla förklaringen, naturligtvis, är att foo troligen inte 516 00:22:31,300 --> 00:22:32,500 att kalla sig. 517 00:22:32,500 --> 00:22:34,470 >> Nu i allmänna termer, detta är rekursion. 518 00:22:34,470 --> 00:22:36,970 Och vi trodde att ett par veckor sedan rekursivt är bra. 519 00:22:36,970 --> 00:22:40,330 Rekursion är denna magiska sätt uttrycka dig super kortfattat. 520 00:22:40,330 --> 00:22:41,400 Och det fungerar bara. 521 00:22:41,400 --> 00:22:45,060 Men det är en viktig del av alla de rekursiva program som vi har pratat 522 00:22:45,060 --> 00:22:48,260 om och såg på hittills, vilket var att de hade vad? 523 00:22:48,260 --> 00:22:52,610 Ett basfall, vilket var lite hårt kodad fall som sägs i vissa situationer 524 00:22:52,610 --> 00:22:56,210 inte kalla foo, vilket är klart inte fallet här. 525 00:22:56,210 --> 00:22:58,920 >> Så vad som verkligen händer i termer av denna bild? 526 00:22:58,920 --> 00:23:01,790 Tja, då main anropar foo, det får en bit av minnet. 527 00:23:01,790 --> 00:23:04,150 När foo anropar foo, blir det en bit av minnet. 528 00:23:04,150 --> 00:23:06,430 När foo anropar foo, blir det en bit. 529 00:23:06,430 --> 00:23:07,080 Det blir en skiva. 530 00:23:07,080 --> 00:23:08,120 Det blir en skiva. 531 00:23:08,120 --> 00:23:09,460 Eftersom foo aldrig återvänder. 532 00:23:09,460 --> 00:23:12,160 Vi kommer aldrig radera en av dem ramar från stacken. 533 00:23:12,160 --> 00:23:15,930 Så vi blåser igenom högen, inte att nämna vem vet vad, och 534 00:23:15,930 --> 00:23:19,600 vi att överskrida vår så kallade segment av minnet. 535 00:23:19,600 --> 00:23:21,790 Fel gå segmentering falskt. 536 00:23:21,790 --> 00:23:24,110 >> Så lösningen finns det uppenbarligen gör inte detta. 537 00:23:24,110 --> 00:23:28,830 Men den större innebörden är att, ja, det absolut finns en viss gräns, 538 00:23:28,830 --> 00:23:32,470 även om den inte är väl definierade, om hur många funktioner som du kan ringa i en 539 00:23:32,470 --> 00:23:34,970 program, hur många gånger en funktion kan kalla sig. 540 00:23:34,970 --> 00:23:38,430 Så även om vi predikade rekursion eftersom detta potentiellt magisk sak en 541 00:23:38,430 --> 00:23:41,870 par veckor sedan för sigma funktion, och när vi får de uppgifter 542 00:23:41,870 --> 00:23:45,270 strukturer och CS50, kommer du att se andra applikationer för det, det är inte 543 00:23:45,270 --> 00:23:46,500 nödvändigtvis det bästa. 544 00:23:46,500 --> 00:23:50,070 För om en funktion kallar sig, kallar sig, även om det finns en bas 545 00:23:50,070 --> 00:23:54,860 fall, om du inte träffar det basfall för 1.000 samtal eller 10.000 samtal, genom 546 00:23:54,860 --> 00:23:58,800 Då kanske du har slut på utrymme på din sk stack och hit 547 00:23:58,800 --> 00:24:00,400 vissa andra delar av minnet. 548 00:24:00,400 --> 00:24:03,950 Så det är också en design trade-off mellan elegans och mellan 549 00:24:03,950 --> 00:24:06,920 robusthet din genomförande. 550 00:24:06,920 --> 00:24:10,780 >> Så det finns en annan nackdel eller annan Gotcha vad vi har 551 00:24:10,780 --> 00:24:11,720 gjort hittills. 552 00:24:11,720 --> 00:24:12,980 När jag ringde getString - 553 00:24:12,980 --> 00:24:15,120 Låt mig gå tillbaka till hello-2. 554 00:24:15,120 --> 00:24:18,170 Lägg märke till att jag ringer getString, som återvänder en adress. 555 00:24:18,170 --> 00:24:20,730 Och vi hävdar idag att adress är från högen. 556 00:24:20,730 --> 00:24:24,480 Och nu är jag skriva ut sträng på den adressen. 557 00:24:24,480 --> 00:24:27,000 Men vi har aldrig kallat motsatsen till getString. 558 00:24:27,000 --> 00:24:30,850 Vi har aldrig haft att calll en funktion som ungetstring, där du lämnar tillbaka 559 00:24:30,850 --> 00:24:31,610 detta minne. 560 00:24:31,610 --> 00:24:33,250 Men ärligt talat vi förmodligen borde ha varit. 561 00:24:33,250 --> 00:24:37,390 För om vi frågar datorn för minnet, i form av någon som 562 00:24:37,390 --> 00:24:40,830 getString men aldrig ge det tillbaka, säkerligen även det är säkert leda till 563 00:24:40,830 --> 00:24:42,970 problem där vi får slut på minne. 564 00:24:42,970 --> 00:24:46,140 >> Och i själva verket kan vi leta efter dessa problem med nya verktyg vars användning 565 00:24:46,140 --> 00:24:47,640 är lite kryptiskt att skriva. 566 00:24:47,640 --> 00:24:50,960 Men låt mig gå vidare och stänka upp på skärmen på bara ett ögonblick. 567 00:24:50,960 --> 00:24:56,940 Jag ska gå vidare och köra Valgrind med parametern vars första kommandot 568 00:24:56,940 --> 00:25:00,260 line argument är namnet av det programmet hello-2. 569 00:25:00,260 --> 00:25:02,650 Och tyvärr är det utgången är atrociously 570 00:25:02,650 --> 00:25:04,290 komplex utan goda skäl. 571 00:25:04,290 --> 00:25:06,280 Så vi ser alla att röra. 572 00:25:06,280 --> 00:25:07,530 David är uppge mitt namn. 573 00:25:07,530 --> 00:25:09,760 Så det är det programmet faktiskt kör. 574 00:25:09,760 --> 00:25:11,180 Och nu får vi denna utgång. 575 00:25:11,180 --> 00:25:13,400 >> Så Valgrind liknar i anden till GDB. 576 00:25:13,400 --> 00:25:14,950 Det är inte en debugger i sig. 577 00:25:14,950 --> 00:25:16,270 Men det är ett minne checker. 578 00:25:16,270 --> 00:25:20,140 Det är ett program som kommer att köra programmera och berätta för dig om du frågade en 579 00:25:20,140 --> 00:25:23,860 dator för minne och aldrig räckte det tillbaka, vilket innebär att du har 580 00:25:23,860 --> 00:25:24,570 en minnesläcka. 581 00:25:24,570 --> 00:25:26,240 Och minnesläckor tenderar att vara dåligt. 582 00:25:26,240 --> 00:25:29,120 Och du är användare av datorer har förmodligen kände detta, oavsett 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 någonsin använt din dator för samtidigt och inte startas om flera 585 00:25:33,730 --> 00:25:36,820 dagar, eller om du har precis fått en hel del program som körs, och den förbannade saken 586 00:25:36,820 --> 00:25:42,360 saktar till ett tvärstopp, eller åtminstone det är super irriterande att använda, eftersom 587 00:25:42,360 --> 00:25:44,350 allt blev bara super slow. 588 00:25:44,350 --> 00:25:46,260 >> Nu som kan vara någon av flera skäl. 589 00:25:46,260 --> 00:25:49,600 Det kan vara en oändlig loop, en bugg i någons kod, eller, mer helt enkelt, det 590 00:25:49,600 --> 00:25:53,250 kan betyda att du använder mer minne, eller försöker, än din 591 00:25:53,250 --> 00:25:54,920 Datorn har faktiskt. 592 00:25:54,920 --> 00:25:57,770 Och kanske finns det en bugg i vissa program att hålla ber om minnet. 593 00:25:57,770 --> 00:26:02,480 Webbläsare för åren var ökänd för detta, ber om mer och mer minne 594 00:26:02,480 --> 00:26:03,870 men aldrig lämnar tillbaka. 595 00:26:03,870 --> 00:26:07,220 Visst, om du bara har en ändlig mängd minne, kan du inte begära 596 00:26:07,220 --> 00:26:09,990 oändligt många gånger för några av detta minne. 597 00:26:09,990 --> 00:26:13,070 >> Och så det du ser här, även om igen Valgrind produktion är 598 00:26:13,070 --> 00:26:17,490 onödigt komplicerat att titta på först, detta är den intressanta delen. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 i bruk vid avfart. 601 00:26:20,060 --> 00:26:22,810 Så här är hur mycket minne var i bruk i högen på 602 00:26:22,810 --> 00:26:24,300 tid mitt program lämnat - 603 00:26:24,300 --> 00:26:27,280 tydligen sex byte i ett block. 604 00:26:27,280 --> 00:26:28,710 Så jag kommer att vifta mina händer på vad ett block är. 605 00:26:28,710 --> 00:26:31,270 Tänk på det är bara en bit, en mer tekniska ordet för bit. 606 00:26:31,270 --> 00:26:33,140 Men sex bytes - 607 00:26:33,140 --> 00:26:36,870 vad är de sex byte som var fortfarande i bruk? 608 00:26:36,870 --> 00:26:37,390 >> Exakt. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D backslash noll, fem brev namn plus null terminator. 610 00:26:41,520 --> 00:26:46,350 Så det här programmet Valgrind märkte att jag bad om sex byte, tydligen, med 611 00:26:46,350 --> 00:26:48,950 sätt att getString, men aldrig gav dem tillbaka. 612 00:26:48,950 --> 00:26:52,030 Och i själva verket kan detta inte vara så uppenbart om mitt program är inte tre 613 00:26:52,030 --> 00:26:53,590 linjer, men det är 300 linjer. 614 00:26:53,590 --> 00:26:56,920 Så vi kan faktiskt ge en annan kommando line argument att Valgrind till 615 00:26:56,920 --> 00:26:58,290 göra den mer utförlig. 616 00:26:58,290 --> 00:26:59,760 Det är lite irriterande att minnas. 617 00:26:59,760 --> 00:27:01,580 Men om jag gör - 618 00:27:01,580 --> 00:27:01,930 låt oss se. 619 00:27:01,930 --> 00:27:03,540 Läcka - 620 00:27:03,540 --> 00:27:05,030 Var det läcka - 621 00:27:05,030 --> 00:27:07,580 även jag minns inte vad det är utanför sidan. 622 00:27:07,580 --> 00:27:08,550 >> - Läckage-kontroll är lika fullt. 623 00:27:08,550 --> 00:27:10,180 Japp, tack. 624 00:27:10,180 --> 00:27:12,520 - Läckage-kontroll är lika fullt. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Samma program körs. 627 00:27:14,940 --> 00:27:16,180 Skriv in David igen. 628 00:27:16,180 --> 00:27:17,660 Nu ser jag lite mer detalj. 629 00:27:17,660 --> 00:27:20,890 Men under högen sammanfattning, som är identisk med fyra - ah, 630 00:27:20,890 --> 00:27:22,120 Detta är ganska trevligt. 631 00:27:22,120 --> 00:27:25,460 Nu Valgrind är faktiskt ute lite hårdare i min kod. 632 00:27:25,460 --> 00:27:29,580 Och det är att säga att, tydligen, malloc på rad - 633 00:27:29,580 --> 00:27:30,580 vi zooma ut. 634 00:27:30,580 --> 00:27:31,980 På linjen - 635 00:27:31,980 --> 00:27:32,930 Vi kan inte se vilken linje det är. 636 00:27:32,930 --> 00:27:35,110 Men malloc är den första gärningsmannen. 637 00:27:35,110 --> 00:27:38,630 Det finns en blogg i malloc. 638 00:27:38,630 --> 00:27:39,810 >> Okej? 639 00:27:39,810 --> 00:27:40,450 OK, ingen. 640 00:27:40,450 --> 00:27:40,940 Rätt? 641 00:27:40,940 --> 00:27:42,520 Jag ringde getString. 642 00:27:42,520 --> 00:27:44,460 getString kallar tydligen malloc. 643 00:27:44,460 --> 00:27:47,800 Så vad kodrad är tydligen vid fel för att ha 644 00:27:47,800 --> 00:27:49,050 tilldelas detta minne? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Låt oss anta att den som skrev malloc har funnits så länge att det är 647 00:27:55,540 --> 00:27:56,390 inte deras fel. 648 00:27:56,390 --> 00:27:57,520 Så det är nog mitt. 649 00:27:57,520 --> 00:28:02,000 getString i cs50.c - så det är en fil någonstans på datorn - 650 00:28:02,000 --> 00:28:05,210 i linje 286 verkar vara den skyldige. 651 00:28:05,210 --> 00:28:08,140 Låt oss nu anta att CS50 har runt för anständig tid, så 652 00:28:08,140 --> 00:28:09,720 vi är för ofelbar. 653 00:28:09,720 --> 00:28:14,080 Och så det är nog inte i getString att felet ligger, utan i 654 00:28:14,080 --> 00:28:17,810 hello-2.C linje 18. 655 00:28:17,810 --> 00:28:20,670 >> Så låt oss ta en titt på vad den linjen 18 var. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 På något sätt denna linje är inte nödvändigtvis buggy, per se, men det är anledningen 658 00:28:27,130 --> 00:28:28,630 bakom denna minnesläcka. 659 00:28:28,630 --> 00:28:32,140 Så super enkelt, vad skulle intuitivt vara lösningen här? 660 00:28:32,140 --> 00:28:34,710 Om vi ​​ber om minnet, var aldrig ge tillbaka, och det verkar vara en 661 00:28:34,710 --> 00:28:37,940 problem eftersom tiden min dator kan få slut på minne, kan bromsa 662 00:28:37,940 --> 00:28:42,110 ner, kan dåliga saker hända, ja, vad är den enkla intuitiva lösningen? 663 00:28:42,110 --> 00:28:43,140 Bara ge det tillbaka. 664 00:28:43,140 --> 00:28:44,770 >> Hur frigöra dig att minnet? 665 00:28:44,770 --> 00:28:49,970 Jo, tack och lov är det ganska enkelt att bara säga fri namn. 666 00:28:49,970 --> 00:28:51,260 Och vi har aldrig gjort det här förut. 667 00:28:51,260 --> 00:28:55,890 Men du kan i princip tänka fri som motsatsen till malloc. 668 00:28:55,890 --> 00:28:58,030 gratis är motsatsen till allokering av minne. 669 00:28:58,030 --> 00:28:59,540 Så låt mig nu kompilera detta. 670 00:28:59,540 --> 00:29:02,050 Gör hello-2. 671 00:29:02,050 --> 00:29:04,620 Låt mig köra den igen. hello-2 David. 672 00:29:04,620 --> 00:29:07,290 Så det verkar fungera i exakt samma sätt. 673 00:29:07,290 --> 00:29:11,180 Men om jag går tillbaka till Valgrind och kör samma kommando på min nyligen 674 00:29:11,180 --> 00:29:14,720 kompilerat program, maskinskrivning i mitt namn som tidigare - 675 00:29:14,720 --> 00:29:15,370 trevligt. 676 00:29:15,370 --> 00:29:16,760 Heap Sammanfattning - 677 00:29:16,760 --> 00:29:17,740 i bruk vid avfart - 678 00:29:17,740 --> 00:29:19,370 noll byte i noll block. 679 00:29:19,370 --> 00:29:21,840 Och det är super trevligt, alla heap block frigavs. 680 00:29:21,840 --> 00:29:23,480 Inget läckage är möjliga. 681 00:29:23,480 --> 00:29:27,200 >> Så kommer upp, inte med Problem Set 4, men med problem 5 set, kriminalteknik 682 00:29:27,200 --> 00:29:30,740 och framåt, även detta kommer att bli en mått på riktigheten av din 683 00:29:30,740 --> 00:29:33,630 program, oavsett om du har eller inte har minnesläckor. 684 00:29:33,630 --> 00:29:36,900 Men tack och lov, kan du inte bara resonera genom dem intuitivt, vilket 685 00:29:36,900 --> 00:29:40,430 är, utan tvekan, lätt för små program men svårare för större program, 686 00:29:40,430 --> 00:29:43,860 Valgrind, för de större programmen, kan hjälpa dig att identifiera 687 00:29:43,860 --> 00:29:45,360 det aktuella problemet. 688 00:29:45,360 --> 00:29:47,500 >> Men det finns ett annat problem som kan uppstå. 689 00:29:47,500 --> 00:29:51,245 Låt mig öppna denna fil här, vilket är, igen, en något enkelt exempel. 690 00:29:51,245 --> 00:29:53,760 Men låt oss fokusera på vad detta program gör. 691 00:29:53,760 --> 00:29:55,190 Detta kallas memory.c. 692 00:29:55,190 --> 00:29:58,380 Vi kommer att lägga ut senare i dag i zip av dagens källkod. 693 00:29:58,380 --> 00:30:01,610 Och märker att jag har en funktion som kallas f som tar inga argument och 694 00:30:01,610 --> 00:30:02,800 returnerar ingenting. 695 00:30:02,800 --> 00:30:07,240 I linje 20, jag förklara tydligen en pekare till en int och kalla det x. 696 00:30:07,240 --> 00:30:09,570 Jag tilldelar är avkastningen värdet av malloc. 697 00:30:09,570 --> 00:30:14,590 Och bara för att vara tydlig, hur många bytes am Jag får förmodligen tillbaka från malloc 698 00:30:14,590 --> 00:30:17,080 i den här situationen? 699 00:30:17,080 --> 00:30:18,040 >> Förmodligen 40. 700 00:30:18,040 --> 00:30:18,840 Var får du det ifrån? 701 00:30:18,840 --> 00:30:22,410 Tja, om du minns att en int är ofta 4 byte, det är åtminstone i 702 00:30:22,410 --> 00:30:25,110 Apparaten är 10 gånger 4 uppenbarligen 40. 703 00:30:25,110 --> 00:30:28,920 Så malloc återvänder en adress en bit av minne och lagring som 704 00:30:28,920 --> 00:30:30,800 itu slutligen i x. 705 00:30:30,800 --> 00:30:32,570 Så för att vara tydlig, det då händer? 706 00:30:32,570 --> 00:30:34,990 Nåväl, låt mig byta tillbaka till vår bild här. 707 00:30:34,990 --> 00:30:38,150 Låt mig inte bara dra ner på mitt datorns minne, låt mig gå vidare och 708 00:30:38,150 --> 00:30:42,990 rita hela rektangel som representerar hela mitt RAM. 709 00:30:42,990 --> 00:30:44,790 >> Vi säger att stapeln är på botten. 710 00:30:44,790 --> 00:30:47,010 Och det finns en text segment i de oinitierade uppgifter. 711 00:30:47,010 --> 00:30:49,880 Men jag ska bara abstrakta dem annat bort som dot, dot dot. 712 00:30:49,880 --> 00:30:53,470 Jag kommer bara att hänvisa till detta som högen på toppen. 713 00:30:53,470 --> 00:30:57,070 Och sedan längst ner på denna bild, att representera huvud, jag ska 714 00:30:57,070 --> 00:30:59,880 att ge det ett segment minne på stacken. 715 00:30:59,880 --> 00:31:03,150 För f, jag ska ge det en bit av minne på stacken. 716 00:31:03,150 --> 00:31:05,140 Nu fick jag höra min källkoden igen. 717 00:31:05,140 --> 00:31:07,170 Vilka är de lokala variablerna för huvud? 718 00:31:07,170 --> 00:31:10,710 Uppenbarligen ingenting, så att skivan är effektivt tom eller inte ens så stor 719 00:31:10,710 --> 00:31:11,600 som jag har ritat det. 720 00:31:11,600 --> 00:31:15,730 Men i f, har jag en lokal variabel, som kallas x. 721 00:31:15,730 --> 00:31:20,410 Så jag kommer att gå vidare och ge f en bit av minnet, kalla det x. 722 00:31:20,410 --> 00:31:24,680 >> Och nu malloc av 10 gånger 4, Så 40 malloc, där det är 723 00:31:24,680 --> 00:31:25,430 minne kommer från? 724 00:31:25,430 --> 00:31:27,530 Vi har inte ritat en bild liknande förut. 725 00:31:27,530 --> 00:31:31,140 Men låt oss anta att det är ett effektivt sätt kommer från här, så en, 726 00:31:31,140 --> 00:31:33,170 två, tre, fyra, fem. 727 00:31:33,170 --> 00:31:34,680 Och nu behöver jag 40 av dessa. 728 00:31:34,680 --> 00:31:37,540 Så jag ska bara göra prick, prick, prick att föreslå att det finns ännu mer minne 729 00:31:37,540 --> 00:31:39,350 kommer tillbaka från högen. 730 00:31:39,350 --> 00:31:40,710 Nu vad är adressen? 731 00:31:40,710 --> 00:31:42,620 Låt oss välja vår godtyckliga behandla som alltid - 732 00:31:42,620 --> 00:31:46,310 Ox123, även om det förmodligen kommer att vara något helt annat. 733 00:31:46,310 --> 00:31:50,420 Det är adressen till första byten i minne som jag ber minnesallokera för. 734 00:31:50,420 --> 00:31:53,630 >> Så kort sagt, när ledningen 20 exekverar, vad är bokstavligen 735 00:31:53,630 --> 00:31:57,170 förvaras inuti av x här? 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 Och oxen är ointressant. 739 00:32:01,550 --> 00:32:03,200 Det betyder bara att här är en hexadecimalt tal. 740 00:32:03,200 --> 00:32:06,490 Men vad som är avgörande är att det jag har butik i x, som är en lokal variabel. 741 00:32:06,490 --> 00:32:10,260 Men dess datatyp, igen, är en adress till en int. 742 00:32:10,260 --> 00:32:12,710 Tja, jag ska lagra Ox123. 743 00:32:12,710 --> 00:32:16,610 Men återigen, om det är lite för kompliceras i onödan, om jag bläddra 744 00:32:16,610 --> 00:32:21,490 tillbaka, kan vi abstrakta detta bort helt rimligt och bara säga att x är en 745 00:32:21,490 --> 00:32:23,910 pekare till bit av minnet. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Nu frågan till hands är följande - 748 00:32:26,230 --> 00:32:29,910 linje 21, visar det sig, är buggig. 749 00:32:29,910 --> 00:32:31,160 Varför? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Förlåt? 752 00:32:36,930 --> 00:32:38,640 Det har inte - 753 00:32:38,640 --> 00:32:40,390 säga att en gång till. 754 00:32:40,390 --> 00:32:41,240 Jo, det gör det inte gratis. 755 00:32:41,240 --> 00:32:42,350 Så det är den andra utan. 756 00:32:42,350 --> 00:32:45,000 Så det finns en annan, men särskilt vid ledningen 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Exakt. 759 00:32:50,040 --> 00:32:54,980 Denna enkla kodrad är bara en buffer overflow, en buffertöverskridning. 760 00:32:54,980 --> 00:32:57,050 En buffert betyder bara en bit av minnet. 761 00:32:57,050 --> 00:33:01,520 Men den del av minnet är av storlek 10, 10 heltal, vilket innebär att om vi 762 00:33:01,520 --> 00:33:05,350 index till det med hjälp av syntaktiska socker av array notation, torget 763 00:33:05,350 --> 00:33:09,220 konsoler, har du tillgång till x konsol 0 x konsol 1 x, 764 00:33:09,220 --> 00:33:10,390 fäste prick, prick, prick. 765 00:33:10,390 --> 00:33:13,270 x konsol 9 är den största. 766 00:33:13,270 --> 00:33:17,680 Så om jag gör x fäste 10, där Jag faktiskt går i minnet? 767 00:33:17,680 --> 00:33:19,120 >> Tja, om jag har 10 int - 768 00:33:19,120 --> 00:33:21,070 Låt oss rita faktiskt alla av dessa ut här. 769 00:33:21,070 --> 00:33:22,700 Så det var det första fem. 770 00:33:22,700 --> 00:33:24,660 Här är de övriga fem ints. 771 00:33:24,660 --> 00:33:29,580 Så x konsol 0 är här. x bracket 1 är här. x konsol 9 är här. x konsol 772 00:33:29,580 --> 00:33:37,960 10 är här, vilket betyder att jag säger, i linje 21, till datorn sätta 773 00:33:37,960 --> 00:33:39,400 nummer där? 774 00:33:39,400 --> 00:33:42,010 Antalet 0 där? 775 00:33:42,010 --> 00:33:43,380 Tja, det är 0, ja. 776 00:33:43,380 --> 00:33:45,460 Men bara det faktum att dess 0 är lite av en slump. 777 00:33:45,460 --> 00:33:47,140 Det kan vara det antal 50, för alla vi bryr oss. 778 00:33:47,140 --> 00:33:50,480 Men vi försöker att uttrycka det på x konsol 10, som är där detta 779 00:33:50,480 --> 00:33:53,700 frågetecken ritas, vilket är inte en bra sak. 780 00:33:53,700 --> 00:33:57,070 Detta program kan mycket väl krascha som följd. 781 00:33:57,070 --> 00:33:59,400 >> Nu, låt oss gå vidare och se om detta är verkligen vad som händer. 782 00:33:59,400 --> 00:34:02,600 Gör minne, eftersom filen kallas memory.c. 783 00:34:02,600 --> 00:34:05,950 Låt oss gå vidare och köra programminnet. 784 00:34:05,950 --> 00:34:08,239 Så fick vi tur, faktiskt, verkar det. 785 00:34:08,239 --> 00:34:09,340 Vi hade tur. 786 00:34:09,340 --> 00:34:11,060 Men låt oss se om vi nu kör Valgrind. 787 00:34:11,060 --> 00:34:14,170 Vid första anblicken, mitt program kanske verkar vara helt rätt. 788 00:34:14,170 --> 00:34:18,010 Men låt mig springa Valgrind med - Läckage-kontroll är lika fullt på minnet. 789 00:34:18,010 --> 00:34:20,110 >> Och nu när jag kör här - 790 00:34:20,110 --> 00:34:21,030 intressant. 791 00:34:21,030 --> 00:34:26,800 Ogiltig skriva av storlek 4 på line 21 av memory.c. 792 00:34:26,800 --> 00:34:29,284 Linje 21 i memory.c är vilken? 793 00:34:29,284 --> 00:34:30,340 Åh, intressant. 794 00:34:30,340 --> 00:34:31,080 Men vänta. 795 00:34:31,080 --> 00:34:32,389 Storlek 4, vad är det att hänvisa till? 796 00:34:32,389 --> 00:34:34,969 Jag bara gjorde en skriva, men det är av storlek 4. 797 00:34:34,969 --> 00:34:36,889 Varför är det 4? 798 00:34:36,889 --> 00:34:39,280 Det är för att det är en int, vilket är återigen fyra bytes. 799 00:34:39,280 --> 00:34:42,510 Så Valgrind hittat en bugg som jag, blick på min kod, inte. 800 00:34:42,510 --> 00:34:45,040 Och kanske din TF skulle eller skulle inte. 801 00:34:45,040 --> 00:34:48,469 Vad Men Valgrind säkert funnit att Vi har gjort ett misstag där, även 802 00:34:48,469 --> 00:34:52,719 om vi har tur, och datorn beslutat, eh, jag kommer inte att krascha 803 00:34:52,719 --> 00:34:57,470 bara för att du rörde en byte, en int värde av minne som du inte 804 00:34:57,470 --> 00:34:58,550 faktiskt äger. 805 00:34:58,550 --> 00:35:00,380 >> Tja, vad annat är buggigt här. 806 00:35:00,380 --> 00:35:01,180 Adress - 807 00:35:01,180 --> 00:35:03,190 detta är en galen tittar adress i hexadecimal. 808 00:35:03,190 --> 00:35:06,890 Det betyder bara någonstans i högen är noll byte efter ett block av storlek 40 809 00:35:06,890 --> 00:35:07,620 allokeras. 810 00:35:07,620 --> 00:35:10,610 Låt mig zooma ut här och se om Detta är en lite mer hjälp. 811 00:35:10,610 --> 00:35:11,410 Intressant. 812 00:35:11,410 --> 00:35:15,600 40 bytes är definitivt förlorade i förlust rekord 1 av 1. 813 00:35:15,600 --> 00:35:17,840 Återigen, är mer ord än nytta här. 814 00:35:17,840 --> 00:35:21,350 Men baserat på de markerade linjerna, där ska jag fokusera förmodligen min 815 00:35:21,350 --> 00:35:24,070 uppmärksamhet för en bugg? 816 00:35:24,070 --> 00:35:26,570 Ser ut som en linje 20 i memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Så om vi går tillbaka till rad 20, det är det en som du identifierade tidigare. 818 00:35:30,990 --> 00:35:33,030 Och det är inte nödvändigtvis buggy. 819 00:35:33,030 --> 00:35:35,160 Men vi har redan vänt dess effekter. 820 00:35:35,160 --> 00:35:38,790 Så hur löser jag åtminstone en av dessa misstag? 821 00:35:38,790 --> 00:35:42,240 Vad kan jag göra efter rad 21? 822 00:35:42,240 --> 00:35:47,110 Jag kunde göra utan x, så att ge tillbaka det minnet. 823 00:35:47,110 --> 00:35:49,230 Och hur kan jag fixa detta fel? 824 00:35:49,230 --> 00:35:52,120 Jag ska definitivt gå inte längre än 0. 825 00:35:52,120 --> 00:35:53,670 Så låt mig försöka och kör detta. 826 00:35:53,670 --> 00:35:56,080 Tyvärr, definitivt gå inte längre än 9. 827 00:35:56,080 --> 00:35:57,510 Gör minne. 828 00:35:57,510 --> 00:36:00,650 Låt mig köra Valgrind i ett större fönster. 829 00:36:00,650 --> 00:36:01,580 Och nu ser. 830 00:36:01,580 --> 00:36:02,250 Trevligt. 831 00:36:02,250 --> 00:36:03,270 Alla heap block frigavs. 832 00:36:03,270 --> 00:36:04,270 Inget läckage är möjliga. 833 00:36:04,270 --> 00:36:07,520 Och upp över här, det finns inget omnämnande något mer av det ogiltiga höger. 834 00:36:07,520 --> 00:36:09,820 >> Bara för att få giriga, och låt oss se om en annan demonstration 835 00:36:09,820 --> 00:36:11,050 går inte som planerat - 836 00:36:11,050 --> 00:36:12,560 Jag fick tur för en stund sedan. 837 00:36:12,560 --> 00:36:15,530 Och det faktum att detta är 0 är kanske onödigt vilseledande. 838 00:36:15,530 --> 00:36:20,650 Låt oss bara göra 50, en något godtycklig antal, fabrikat minne dot slash minne - 839 00:36:20,650 --> 00:36:21,410 fortfarande ha tur. 840 00:36:21,410 --> 00:36:22,510 Ingenting krascha. 841 00:36:22,510 --> 00:36:26,150 Anta att jag bara göra något riktigt dumt, och jag gör 100. 842 00:36:26,150 --> 00:36:30,360 Låt mig remake minne, dot slash minne - 843 00:36:30,360 --> 00:36:31,075 got lucky igen. 844 00:36:31,075 --> 00:36:32,800 Vad sägs om 1000? 845 00:36:32,800 --> 00:36:35,370 ints utanför, ungefär, där jag borde vara? 846 00:36:35,370 --> 00:36:37,410 Gör minne - 847 00:36:37,410 --> 00:36:38,570 fan det. 848 00:36:38,570 --> 00:36:39,920 >> [SKRATT] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Låt oss inte röra runt längre. 851 00:36:43,920 --> 00:36:45,120 Rerun minne. 852 00:36:45,120 --> 00:36:45,840 Där vi går. 853 00:36:45,840 --> 00:36:46,410 Okej. 854 00:36:46,410 --> 00:36:52,500 Så uppenbarligen du index 100.000 ints bortom där du borde ha varit i 855 00:36:52,500 --> 00:36:54,410 minne, dåliga saker hända. 856 00:36:54,410 --> 00:36:56,430 Så det här är naturligtvis inte en hård, snabb regel. 857 00:36:56,430 --> 00:36:58,190 Jag var typ av hjälp rättegång och fel att komma dit. 858 00:36:58,190 --> 00:37:02,230 Men detta beror på, lång historia kort, datorns minne är också indelad 859 00:37:02,230 --> 00:37:03,580 in i dessa saker som kallas segment. 860 00:37:03,580 --> 00:37:07,260 Och ibland, datorn faktiskt har gett dig lite mer minne 861 00:37:07,260 --> 00:37:08,400 än du ber om. 862 00:37:08,400 --> 00:37:12,170 Men för effektivitet, det är bara lättare att få mer minne, men bara berätta 863 00:37:12,170 --> 00:37:13,780 att du får en del av det. 864 00:37:13,780 --> 00:37:16,370 >> Och om du har tur ibland, Därför kanske du kan röra 865 00:37:16,370 --> 00:37:17,795 minne som inte tillhör dig. 866 00:37:17,795 --> 00:37:21,860 Du har ingen garanti för att det värde du sätter det kommer att stanna där, eftersom 867 00:37:21,860 --> 00:37:25,080 datorn tycker fortfarande att det är inte er, men det är inte nödvändigtvis kommer 868 00:37:25,080 --> 00:37:29,910 att slå en annan del av minnet i dator och framkalla ett misstag som 869 00:37:29,910 --> 00:37:31,710 detta här. 870 00:37:31,710 --> 00:37:32,060 Okej. 871 00:37:32,060 --> 00:37:37,240 Några frågor så på minnet? 872 00:37:37,240 --> 00:37:37,590 >> Okej. 873 00:37:37,590 --> 00:37:40,610 Låt oss ta en titt här, då, vid något som vi har tagit för 874 00:37:40,610 --> 00:37:48,361 beviljas under ganska lång tid, vilket är i denna fil som heter cs50.h. 875 00:37:48,361 --> 00:37:49,420 Så detta är en fil. 876 00:37:49,420 --> 00:37:51,130 Dessa är bara en massa av kommentarer där uppe. 877 00:37:51,130 --> 00:37:53,900 Och du kanske har tittat på detta om du petade runt på apparaten. 878 00:37:53,900 --> 00:37:57,000 Men det visar sig att hela tiden, när vi brukade använda sträng som 879 00:37:57,000 --> 00:38:01,130 synonym, det medel genom vilket vi förklarade som synonym var med detta 880 00:38:01,130 --> 00:38:03,990 nyckelordet typedef, för typ definition. 881 00:38:03,990 --> 00:38:07,500 Och vi i huvudsak säger, gör sträng en synonym för röding stjärna. 882 00:38:07,500 --> 00:38:11,190 Att de medel som stapeln skapat dessa stödhjul kallas 883 00:38:11,190 --> 00:38:12,040 strängen. 884 00:38:12,040 --> 00:38:14,830 >> Nu här är bara en prototyp för getchar. 885 00:38:14,830 --> 00:38:17,350 Vi kanske har sett det förut, men det är faktiskt vad den gör. getchar 886 00:38:17,350 --> 00:38:19,070 tar inga argument, returnerar en röding. 887 00:38:19,070 --> 00:38:21,340 getdouble tar inga argument, returnerar en dubbel. 888 00:38:21,340 --> 00:38:24,440 getFloat tar inga argument, returer en flottör, och så vidare. 889 00:38:24,440 --> 00:38:27,270 getInt är här. getlonglong är här. 890 00:38:27,270 --> 00:38:28,820 Och getString är här. 891 00:38:28,820 --> 00:38:29,420 Och det är det. 892 00:38:29,420 --> 00:38:33,080 Denna lila linjen är en annan preprocessor direktivet på grund av 893 00:38:33,080 --> 00:38:35,550 hashtag i början av den. 894 00:38:35,550 --> 00:38:35,870 >> Okej. 895 00:38:35,870 --> 00:38:38,380 Så låt mig nu gå in cs50.c. 896 00:38:38,380 --> 00:38:40,400 Och vi kommer inte att prata för länge på det här. 897 00:38:40,400 --> 00:38:43,280 Men för att ge dig en glimt av vad som finns pågått hela detta 898 00:38:43,280 --> 00:38:46,434 tid, låt mig gå till - 899 00:38:46,434 --> 00:38:48,250 låt oss göra getchar. 900 00:38:48,250 --> 00:38:51,050 Så getchar är mestadels kommentarer. 901 00:38:51,050 --> 00:38:52,060 Men det ser ut så här. 902 00:38:52,060 --> 00:38:54,800 Så detta är den verkliga funktionen getchar att vi har varit 903 00:38:54,800 --> 00:38:56,055 tar för givet existerar. 904 00:38:56,055 --> 00:38:59,370 Och även om vi har använder inte denna som ofta, om någonsin, är det åtminstone 905 00:38:59,370 --> 00:39:00,470 relativt enkel. 906 00:39:00,470 --> 00:39:02,580 Så det är värt att ta en snabb titt på här. 907 00:39:02,580 --> 00:39:06,540 >> Så getchar har en oändlig loop, medvetet så tydligen. 908 00:39:06,540 --> 00:39:10,050 Det kräver då - och det är lite av en trevlig återanvändning av kod vi själva skrev. 909 00:39:10,050 --> 00:39:11,220 Det kallar getString. 910 00:39:11,220 --> 00:39:12,460 För vad gör det innebära att få en röding? 911 00:39:12,460 --> 00:39:14,730 Tja, kan man lika gärna försöka få ett hel textrad från användaren och 912 00:39:14,730 --> 00:39:16,940 sedan bara titta på en av dessa tecken. 913 00:39:16,940 --> 00:39:19,170 I linje 60, är ​​här en liten bit av en sanity check. 914 00:39:19,170 --> 00:39:21,610 Om getString återvände null, låt oss inte gå vidare. 915 00:39:21,610 --> 00:39:22,820 Något gick fel. 916 00:39:22,820 --> 00:39:28,120 >> Nu är det här något irriterande men konventionellt i C. röding max förmodligen 917 00:39:28,120 --> 00:39:29,960 representerar vad just baserat på dess namn? 918 00:39:29,960 --> 00:39:31,670 Det är en konstant. 919 00:39:31,670 --> 00:39:36,040 Det är som det numeriska värdet av största röding du kan representera med 920 00:39:36,040 --> 00:39:40,370 en tugga, vilket sannolikt är den 255, vilket är det största antalet du 921 00:39:40,370 --> 00:39:42,720 representerar åtta bitar, med början på noll. 922 00:39:42,720 --> 00:39:47,460 Så jag har att använda detta, i denna funktion, när skriva denna kod, bara för att 923 00:39:47,460 --> 00:39:51,753 om något går fel i getchar men sitt syfte i livet är att returnera en 924 00:39:51,753 --> 00:39:54,830 röding, måste du på något sätt kunna att signalera till användaren att 925 00:39:54,830 --> 00:39:55,840 något gick fel. 926 00:39:55,840 --> 00:39:56,970 Vi kan inte returnera null. 927 00:39:56,970 --> 00:39:58,480 Det visar sig att null är en pekare. 928 00:39:58,480 --> 00:40:01,030 Och återigen, har getchar att returnera en röding. 929 00:40:01,030 --> 00:40:04,760 >> Så konventionen, om något går fel, är du, programmeraren, eller i 930 00:40:04,760 --> 00:40:08,160 detta fall mig med biblioteket, hade jag en bestämmer bara godtyckligt, om 931 00:40:08,160 --> 00:40:12,230 något går fel, kommer jag att returnera antalet 255, som verkligen är 932 00:40:12,230 --> 00:40:17,240 innebär att vi inte kan, kan användaren inte skriver tecknet representeras av 933 00:40:17,240 --> 00:40:21,410 nr 255 eftersom vi hade en stjäla det som en så kallad sentinel värde till 934 00:40:21,410 --> 00:40:23,410 representera ett problem. 935 00:40:23,410 --> 00:40:27,010 Nu visar det sig att karaktären 255 är inte något man kan skriva om 936 00:40:27,010 --> 00:40:28,380 tangentbordet, så det är ingen big deal. 937 00:40:28,380 --> 00:40:30,910 Användaren märker inte att Jag har stulit denna karaktär. 938 00:40:30,910 --> 00:40:34,620 Men om du ser någonsin i man-sidorna på en datorsystem någon hänvisning till en 939 00:40:34,620 --> 00:40:38,560 versaler konstant som denna som säger, i fall av misstag denna konstanta kraft 940 00:40:38,560 --> 00:40:42,720 returneras, det är allt en del människor gjorde år sedan var godtyckligt beslutat att 941 00:40:42,720 --> 00:40:45,680 returnera denna speciella värde och kalla det en konstant i fall 942 00:40:45,680 --> 00:40:46,840 något går fel. 943 00:40:46,840 --> 00:40:48,580 >> Nu det magiska händer här nere. 944 00:40:48,580 --> 00:40:52,600 Först, jag förklarar i linje 67 två karaktärer, C1 och C2. 945 00:40:52,600 --> 00:40:57,080 Och sedan i linje 68, det finns faktiskt en kodrad som är som påminner om 946 00:40:57,080 --> 00:41:01,140 vår vän printf, med tanke på att det har procent Cs inom citationstecken. 947 00:41:01,140 --> 00:41:06,490 Men märker vad som händer här. sscanf betyder sträng scan - 948 00:41:06,490 --> 00:41:11,690 innebär skanna ett formaterat sträng, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Vad betyder det? 950 00:41:12,590 --> 00:41:16,310 Det betyder att du passerar till sscanf en sträng. 951 00:41:16,310 --> 00:41:18,420 Och linjen är vad användaren skriver i. 952 00:41:18,420 --> 00:41:23,520 Du passerar till sscanf ett format sträng som detta som berättar scanf vilka är 953 00:41:23,520 --> 00:41:25,870 Hoppas du att användaren har skrivit i. 954 00:41:25,870 --> 00:41:29,730 Du passerar in då adresserna för två bitar av minnet, i det här fallet, 955 00:41:29,730 --> 00:41:31,150 eftersom jag har två platshållare. 956 00:41:31,150 --> 00:41:34,610 Så jag kommer att ge den adressen C1 och adressen till C2. 957 00:41:34,610 --> 00:41:37,700 >> Och minns att du ger en funktion av adress viss variabel, vad är 958 00:41:37,700 --> 00:41:38,950 innebörden? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Vad kan denna funktion gör som ett resultat för att ge den en adress till en 961 00:41:45,050 --> 00:41:48,170 variabel, i motsats till variabeln själv? 962 00:41:48,170 --> 00:41:49,450 Det kan ändra det, eller hur? 963 00:41:49,450 --> 00:41:53,250 Om du hade någon en karta till en fysisk adress, kan man gå dit och göra 964 00:41:53,250 --> 00:41:54,750 vad de vill på den adressen. 965 00:41:54,750 --> 00:41:55,800 Samma idé här. 966 00:41:55,800 --> 00:41:59,950 Om vi ​​övergår till sscanf, adressen till två bitar av minnet, även dessa små 967 00:41:59,950 --> 00:42:03,585 små bitar av minne, C1 och C2, men Vi berättar det adressen till dem, 968 00:42:03,585 --> 00:42:05,170 sscanf kan ändra det. 969 00:42:05,170 --> 00:42:08,530 >> Så sscanf syfte i livet, om vi läser mannen sida, är att läsa vad 970 00:42:08,530 --> 00:42:13,420 användaren har skrivit in, hoppas på att användaren behöver skrev i en karaktär och kanske 971 00:42:13,420 --> 00:42:16,470 annan karaktär, och vad användaren skrivit, går det första tecknet 972 00:42:16,470 --> 00:42:19,310 här, går det andra tecknet här. 973 00:42:19,310 --> 00:42:22,470 Nu, som en parentes, detta, och du skulle bara vet detta från dokumentationen, 974 00:42:22,470 --> 00:42:25,570 det faktum att jag sätter ett tomt utrymme där betyder bara att jag inte bryr mig om 975 00:42:25,570 --> 00:42:28,440 användaren slår på mellanslagstangenten några gånger innan han eller hon tar en 976 00:42:28,440 --> 00:42:30,400 karaktär, kommer jag att ignorera alla blanktecken. 977 00:42:30,400 --> 00:42:32,510 Så att, jag vet från dokumentationen. 978 00:42:32,510 --> 00:42:36,570 >> Det faktum att det finns en andra% c följt av blanktecken är faktiskt 979 00:42:36,570 --> 00:42:37,410 avsiktlig. 980 00:42:37,410 --> 00:42:41,190 Jag vill kunna detektera om användaren skruvas upp eller inte samarbetade. 981 00:42:41,190 --> 00:42:45,630 Så jag hoppas att användaren endast skrivit i ett tecken, därför hoppas jag 982 00:42:45,630 --> 00:42:50,640 att sscanf kommer bara att returnera värde 1, eftersom, återigen, om jag läser 983 00:42:50,640 --> 00:42:55,400 dokumentationen, sscanf syfte i liv är att återvända till det antal 984 00:42:55,400 --> 00:42:59,170 variabler som är fyllda med indata från användaren. 985 00:42:59,170 --> 00:43:02,270 >> Jag gick i två variabler adresser, C1 och C2. 986 00:43:02,270 --> 00:43:06,420 Jag hoppas dock att endast en av dem blir dödad för om sscanf 987 00:43:06,420 --> 00:43:11,130 returnerar 2, vad är förmodligen implikationen logiskt? 988 00:43:11,130 --> 00:43:14,600 Att användaren inte bara ge mig en karaktär som jag sa till honom eller henne. 989 00:43:14,600 --> 00:43:17,860 De skrev förmodligen på minst två tecken. 990 00:43:17,860 --> 00:43:22,430 Så om jag istället hade inte den andra % C, hade jag bara en, vilket 991 00:43:22,430 --> 00:43:25,370 uppriktigt sagt skulle vara mer intuitivt tillvägagångssätt, jag tror att en första anblick, 992 00:43:25,370 --> 00:43:30,220 du kommer inte att kunna upptäcka Om användaren har gett dig mer 993 00:43:30,220 --> 00:43:31,780 input än vad du egentligen ville. 994 00:43:31,780 --> 00:43:34,100 Så detta är en implicit form av felkontroll. 995 00:43:34,100 --> 00:43:35,640 >> Men märker vad jag gör här. 996 00:43:35,640 --> 00:43:39,970 När jag är säker på att användaren gav mig en karaktär, fri jag linjen, gör 997 00:43:39,970 --> 00:43:44,450 motsatsen till getString, vilket i sin tur använder malloc, och sedan återvänder jag 998 00:43:44,450 --> 00:43:51,030 C1, karaktären som jag hoppats på användaren tillhandahålls och endast tillhandahålls. 999 00:43:51,030 --> 00:43:54,680 Så en snabb skymt bara, men några frågor om getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Vi ska återkomma till några av de andra. 1002 00:43:59,590 --> 00:44:03,770 >> Nåväl, låt mig gå vidare och göra detta - Antag nu, bara för att motivera vår 1003 00:44:03,770 --> 00:44:08,910 diskussion i en vecka plus tid, detta är en fil som heter structs.h. 1004 00:44:08,910 --> 00:44:11,440 Och återigen, detta är bara ett smakprov av något som ligger framför oss. 1005 00:44:11,440 --> 00:44:13,090 Men märker att en hel på detta är kommentarer. 1006 00:44:13,090 --> 00:44:17,440 Så låt mig belysa endast de intressant del för nu. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 Det är det samma sökord igen. 1009 00:44:19,700 --> 00:44:23,100 typedef vi använder för att förklara sträng som en speciell datatyp. 1010 00:44:23,100 --> 00:44:27,490 Du kan använda typedef för att skapa helt nya datatyper som inte fanns när 1011 00:44:27,490 --> 00:44:28,570 C uppfanns. 1012 00:44:28,570 --> 00:44:32,520 Till exempel kommer int med C. röding kommer med C. dubbel levereras med C. Men 1013 00:44:32,520 --> 00:44:34,000 det finns ingen föreställning om en elev. 1014 00:44:34,000 --> 00:44:37,230 Och ändå skulle det vara ganska bra att vara kunna skriva ett program som lagrar 1015 00:44:37,230 --> 00:44:40,440 i en variabel, en student ID-nummer, deras namn, och deras hus. 1016 00:44:40,440 --> 00:44:42,890 Med andra ord, tre stycken av data, som en int och en 1017 00:44:42,890 --> 00:44:44,420 sträng och en annan sträng. 1018 00:44:44,420 --> 00:44:48,220 >> Med typedef, är det ganska stark om detta och sökord sturct för 1019 00:44:48,220 --> 00:44:53,660 struktur, dig, programmeraren under 2013, kan faktiskt definiera din egen att 1020 00:44:53,660 --> 00:44:57,530 datatyper som inte existerade år sedan men som passar dina syften. 1021 00:44:57,530 --> 00:45:01,910 Och så här i raderna 13 till 19, vi förklara en ny datatyp, som 1022 00:45:01,910 --> 00:45:04,320 en int, men kalla det student. 1023 00:45:04,320 --> 00:45:09,310 Och inne i denna variabel kommer att vara tre saker - en int, en sträng, 1024 00:45:09,310 --> 00:45:09,930 och en sträng. 1025 00:45:09,930 --> 00:45:13,040 Så du kan tänka på vad som verkligen är hände här, trots att detta är en 1026 00:45:13,040 --> 00:45:17,160 lite av en förenkling för idag, en elev är i huvudsak går 1027 00:45:17,160 --> 00:45:19,450 att se ut så här. 1028 00:45:19,450 --> 00:45:22,580 Det kommer att bli en del av minne med ett ID, ett namn 1029 00:45:22,580 --> 00:45:25,580 fält, och ett hus fält. 1030 00:45:25,580 --> 00:45:30,670 Och vi kommer att kunna använda dessa bitar av minne och komma åt dem enligt följande. 1031 00:45:30,670 --> 00:45:38,870 >> Om jag går in struct0.c, är här en relativt lång, men efter en 1032 00:45:38,870 --> 00:45:42,630 mönster, av kod som använder denna nya trick. 1033 00:45:42,630 --> 00:45:45,790 Så först, låt mig fästa er uppmärksamhet till de intressanta delarna där uppe. 1034 00:45:45,790 --> 00:45:49,670 Sharp definierar studenter 3, förklarar en konstant kallas studenter och övertagare 1035 00:45:49,670 --> 00:45:53,450 det godtyckligt numret 3, precis så jag har tre elever som använder 1036 00:45:53,450 --> 00:45:54,830 detta program nu. 1037 00:45:54,830 --> 00:45:55,960 Här kommer Main. 1038 00:45:55,960 --> 00:45:58,860 Och lägg märke till hur jag deklarerar en samling av elever? 1039 00:45:58,860 --> 00:46:00,480 Tja, jag använder precis samma syntax. 1040 00:46:00,480 --> 00:46:02,110 Ordet elev är uppenbarligen nya. 1041 00:46:02,110 --> 00:46:04,790 Men deltagare, klassificera, fäste studenter. 1042 00:46:04,790 --> 00:46:06,720 >> Så tyvärr finns det en hel del av återanvändning av termer här. 1043 00:46:06,720 --> 00:46:07,660 Detta är bara ett nummer. 1044 00:46:07,660 --> 00:46:09,040 Så detta är som att säga tre. 1045 00:46:09,040 --> 00:46:11,430 Class är precis vad jag vill att ringa variabeln. 1046 00:46:11,430 --> 00:46:12,840 Jag skulle kalla det studenter. 1047 00:46:12,840 --> 00:46:15,880 Men klass, detta är inte en klass i en objektorienterad Java typ av väg. 1048 00:46:15,880 --> 00:46:17,220 Det är bara en klass elever. 1049 00:46:17,220 --> 00:46:20,590 Och datatypen för varje element i matrisen är student. 1050 00:46:20,590 --> 00:46:23,040 Så det här är lite annorlunda och från att säga något 1051 00:46:23,040 --> 00:46:25,250 så här, det är bara - 1052 00:46:25,250 --> 00:46:29,500 Jag säger ge mig tre elever och kallar den arrayen klassen. 1053 00:46:29,500 --> 00:46:29,800 >> Okej. 1054 00:46:29,800 --> 00:46:30,680 Nu här är en fyra loop. 1055 00:46:30,680 --> 00:46:33,480 Den här killen är bekant - iterate från noll på upp till tre. 1056 00:46:33,480 --> 00:46:35,160 Och här är den nya bit syntax. 1057 00:46:35,160 --> 00:46:37,710 Programmet kommer att uppmana mig, människan, för att ge det en elev 1058 00:46:37,710 --> 00:46:39,200 ID, som är en int. 1059 00:46:39,200 --> 00:46:44,650 Och här är den syntax som du kan använda förvara något i ID-fältet vid 1060 00:46:44,650 --> 00:46:48,630 plats klass bracket I. Så denna syntax är inte ny. 1061 00:46:48,630 --> 00:46:51,450 Det betyder bara ge mig den åttonde elev i klassen. 1062 00:46:51,450 --> 00:46:52,940 Men denna symbol är ny. 1063 00:46:52,940 --> 00:46:56,320 Fram tills nu har vi inte kan användas prick, åtminstone i koden så här. 1064 00:46:56,320 --> 00:47:01,490 Detta innebär att gå till struct som kallas en elev och sätta något där. 1065 00:47:01,490 --> 00:47:05,670 Även i detta nästa rad, 31, går vidare och sätta vad användaren skriver 1066 00:47:05,670 --> 00:47:10,530 för ett namn här och vad de gör för en hus, samma sak, gå vidare och 1067 00:47:10,530 --> 00:47:13,230 lägga den i. huset. 1068 00:47:13,230 --> 00:47:15,955 >> Så vad gör detta program slutändan göra? 1069 00:47:15,955 --> 00:47:17,220 Du kan se en liten teaser där. 1070 00:47:17,220 --> 00:47:24,780 Låt mig gå vidare och gör structs 0 dot slash struct 0, student ID 1, 1071 00:47:24,780 --> 00:47:28,250 säger David Mather, student-ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, student-ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 och det enda programmet gjorde, vilket är bara helt godtyckligt, är 1075 00:47:38,380 --> 00:47:40,980 Jag ville göra något med dessa data, nu när jag har lärt oss hur man 1076 00:47:40,980 --> 00:47:43,450 använda structs, är jag bara tvungen denna extra slinga här. 1077 00:47:43,450 --> 00:47:45,260 Jag iterera över gruppen av elever. 1078 00:47:45,260 --> 00:47:49,170 Jag använde vår, kanske nu välbekanta vän, sträng jämföra, stircomp till 1079 00:47:49,170 --> 00:47:53,780 kontrollen är 8th studentens hus lika med Mather? 1080 00:47:53,780 --> 00:47:56,760 Och i så fall, bara skriva ut något godtyckligt gillar, ja, är det. 1081 00:47:56,760 --> 00:47:59,430 Men återigen, bara ge mig möjligheter att använda och återanvända och 1082 00:47:59,430 --> 00:48:02,270 återanvända denna nya dot notation. 1083 00:48:02,270 --> 00:48:03,250 >> Så vem bryr sig, eller hur? 1084 00:48:03,250 --> 00:48:06,270 Kommer upp med en elev programmet är något godtyckligt, men det visar sig 1085 00:48:06,270 --> 00:48:09,800 att vi kan göra nyttiga saker med här till exempel enligt följande. 1086 00:48:09,800 --> 00:48:14,600 Detta är en mycket mer komplicerad struct i C. Den har ett dussin eller fler områden, 1087 00:48:14,600 --> 00:48:15,880 något kryptiskt heter. 1088 00:48:15,880 --> 00:48:20,110 Men om du någonsin hört talas om en grafik filformat som kallas bitmapp, BMP, det 1089 00:48:20,110 --> 00:48:22,830 visar sig att den bitmapp filformat ganska mycket ser ut som det. 1090 00:48:22,830 --> 00:48:24,200 Det är en dum liten Smiley face. 1091 00:48:24,200 --> 00:48:27,840 Det är en liten bild som jag har zoomat in på ganska stora så att jag kunde se varje 1092 00:48:27,840 --> 00:48:30,410 av de enskilda punkter eller pixlar. 1093 00:48:30,410 --> 00:48:33,800 Nu visar det sig att vi kan representera en svart prick med, säg, numret 0. 1094 00:48:33,800 --> 00:48:35,520 Och en vit prick med nummer 1. 1095 00:48:35,520 --> 00:48:39,140 >> Så med andra ord, att om du vill rita en Smiley face och spara den bilden på en 1096 00:48:39,140 --> 00:48:42,680 dator, räcker det att lagra nollor och de som ser ut så här, där, 1097 00:48:42,680 --> 00:48:45,250 igen, dessa är vita och nollor är svarta. 1098 00:48:45,250 --> 00:48:48,290 Och tillsammans, om du har ett effektivt en omgjorda av ettor och nollor, har du en 1099 00:48:48,290 --> 00:48:51,030 rutnät av pixlar, och om du lägger dem, har du en söt 1100 00:48:51,030 --> 00:48:52,560 lilla Smiley face. 1101 00:48:52,560 --> 00:48:58,150 Nu är bitmapp filformat, BMP, effektivt att under huven, 1102 00:48:58,150 --> 00:49:00,970 men med fler pixlar sot som du kan faktiskt representera färger. 1103 00:49:00,970 --> 00:49:05,170 >> Men när du har mer sofistikerade filformat som BMP och JPEG och GIF 1104 00:49:05,170 --> 00:49:09,360 som du kanske känner, de filer på hårddisken vanligen inte bara 1105 00:49:09,360 --> 00:49:13,760 ha nollor och ettor för pixlarna, men de har vissa metadata samt - 1106 00:49:13,760 --> 00:49:16,960 meta i den meningen att är inte riktigt uppgifter men det är bra att ha. 1107 00:49:16,960 --> 00:49:21,370 Så dessa områden här antyder, och vi får se detta mer i detalj i P-set 1108 00:49:21,370 --> 00:49:25,810 5, att innan de nollor och ettor som representerar pixlar i en bild, 1109 00:49:25,810 --> 00:49:29,110 det finns en massa metadata som storleken på bilden och 1110 00:49:29,110 --> 00:49:30,250 bredden på bilden. 1111 00:49:30,250 --> 00:49:32,910 Och märker jag plocka upp några godtyckliga saker här - 1112 00:49:32,910 --> 00:49:34,260 bredd och höjd. 1113 00:49:34,260 --> 00:49:36,160 Biträkningen och några andra saker. 1114 00:49:36,160 --> 00:49:37,840 Så det finns vissa metadata i en fil. 1115 00:49:37,840 --> 00:49:41,470 >> Men genom att förstå hur filer läggs ut på detta sätt, kan du faktiskt 1116 00:49:41,470 --> 00:49:45,890 sedan manipulera bilder, återhämta bilder från disk, ändra storlek på bilder. 1117 00:49:45,890 --> 00:49:47,560 Men du kan inte nödvändigtvis förbättra dem. 1118 00:49:47,560 --> 00:49:48,480 Jag behövde ett fotografi. 1119 00:49:48,480 --> 00:49:52,840 Så jag gick tillbaka till RJ hit, vem du såg på skärmen ganska länge sedan. 1120 00:49:52,840 --> 00:49:57,160 Och om jag öppnar Keynote här, är detta vad händer om du försöker att zooma in och 1121 00:49:57,160 --> 00:49:59,380 förbättra RJ. 1122 00:49:59,380 --> 00:50:01,480 Han blir inte bättre egentligen. 1123 00:50:01,480 --> 00:50:06,240 Nu Keynote är slags oskärpa det en lite, bara för att släta över 1124 00:50:06,240 --> 00:50:11,040 faktum att RJ inte blir särskilt förbättrad när du zoomar in 1125 00:50:11,040 --> 00:50:13,310 Och om att göra det här sättet, se rutorna? 1126 00:50:13,310 --> 00:50:15,490 Ja, kan du se definitivt rutorna på en projektor. 1127 00:50:15,490 --> 00:50:17,690 >> Det är vad du får när du förbättra. 1128 00:50:17,690 --> 00:50:22,570 Men att förstå hur vår RJ eller Smiley face genomförs kommer att låta oss 1129 00:50:22,570 --> 00:50:24,950 faktiskt skriva kod som manipulerar dessa saker. 1130 00:50:24,950 --> 00:50:29,970 Och jag trodde att jag skulle sluta på denna anmärkning, med 55 sekunder av ett förhöja det är, 1131 00:50:29,970 --> 00:50:31,230 Jag vågar säga ganska missvisande. 1132 00:50:31,230 --> 00:50:32,990 >> [VIDEO SPELA] 1133 00:50:32,990 --> 00:50:34,790 >> -Han ljuger. 1134 00:50:34,790 --> 00:50:38,310 Om vad, vet jag inte. 1135 00:50:38,310 --> 00:50:41,200 >> -Så vad vet vi? 1136 00:50:41,200 --> 00:50:45,280 >> -Det at 9:15 Ray Santoya var på ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Så frågan är vad gjorde han vid 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Inspelningen nio millimeter på något. 1139 00:50:50,750 --> 00:50:52,615 Kanske såg han prickskytt. 1140 00:50:52,615 --> 00:50:54,760 >> -Eller jobbade med honom. 1141 00:50:54,760 --> 00:50:56,120 >> -Vänta. 1142 00:50:56,120 --> 00:50:57,450 Gå tillbaka en. 1143 00:50:57,450 --> 00:50:58,700 >> -Vad ser du? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Ta med ansiktet uppåt, helskärm. 1146 00:51:09,490 --> 00:51:09,790 >> -Hans glasögon. 1147 00:51:09,790 --> 00:51:11,040 >> -Det är en reflektion. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Det är Neuvitas basketlag. 1150 00:51:23,520 --> 00:51:24,530 Det är deras logotyp. 1151 00:51:24,530 --> 00:51:27,040 >> -Och han pratar med den som är bär den jackan. 1152 00:51:27,040 --> 00:51:27,530 >> [END VIDEOAVSPELNING] 1153 00:51:27,530 --> 00:51:29,180 >> David J. MALAN: Detta kommer vara Problem Set 5. 1154 00:51:29,180 --> 00:51:30,720 Vi kommer att se dig nästa vecka. 1155 00:51:30,720 --> 00:51:32,330 >> HANE SPEAK: Vid nästa CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Syrsor som gnisslar] 1157 00:51:39,240 --> 00:51:41,270 >> [Musik Spela]