1 00:00:00,000 --> 00:00:11,242 >> [Musik Spela] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. MALAN: Okej detta är CS50 och detta är början på vecka fem. 3 00:00:16,630 --> 00:00:21,480 Så idag, under dina sittdynor, du kommer inte hitta något. 4 00:00:21,480 --> 00:00:24,790 Men ovan, bör du hitta dessa, en litet tecken på vår uppskattning för 5 00:00:24,790 --> 00:00:26,970 allt arbete som du lägger i Game of Fifteen. 6 00:00:26,970 --> 00:00:30,290 Ta bara bort den lilla cirkeln på botten för att börja spela för 7 00:00:30,290 --> 00:00:31,680 resten av klassen. 8 00:00:31,680 --> 00:00:38,930 >> Så minns att, eller vet att problem som fyra, som gick ut i helgen, 9 00:00:38,930 --> 00:00:40,340 innebär att skriva en annan lek. 10 00:00:40,340 --> 00:00:43,740 Men den här gången innebär att man använder en faktiska grafiskt användargränssnitt, inte en 11 00:00:43,740 --> 00:00:46,310 textuella gränssnitt som Game of Fifteen var. 12 00:00:46,310 --> 00:00:50,210 Och spelet som ligger framför dig, Om du inte har ännu sett detta nästa, 13 00:00:50,210 --> 00:00:52,310 ser lite ut så här. 14 00:00:52,310 --> 00:00:55,170 Jag kommer att gå in i min terminal fönster här i GDB. 15 00:00:55,170 --> 00:00:58,600 Och jag ska gå vidare och köra Personalen lösning, som du kan komma åt 16 00:00:58,600 --> 00:01:01,010 efter att ha kört uppdateringen 50 som vanligt. 17 00:01:01,010 --> 00:01:04,090 >> Men jag ska sätta den i en liten hemlig läge, lite påskägg, 18 00:01:04,090 --> 00:01:08,480 sk Gud läge, genom sätta Gud i argv1. 19 00:01:08,480 --> 00:01:12,920 Och jag måste följa mina egna riktningar, kör det i min egen 20 00:01:12,920 --> 00:01:14,220 Problemet inställd katalogen. 21 00:01:14,220 --> 00:01:19,190 Så nu ser du en komplett version av spelet Breakout. 22 00:01:19,190 --> 00:01:21,090 I själva verket är detta ingen händer läget. 23 00:01:21,090 --> 00:01:24,850 Så det är faktiskt - 24 00:01:24,850 --> 00:01:26,470 bländade fast du kan vara - 25 00:01:26,470 --> 00:01:30,850 ganska trivialt att implementera Gud läget i Breakout, till skillnad från Game of Fifteen, 26 00:01:30,850 --> 00:01:33,590 som vissa av er kanske har tacklat för hacker upplagan. 27 00:01:33,590 --> 00:01:37,890 >> I Breakout det räcker i Gud läge för att helt enkelt göra vad, 28 00:01:37,890 --> 00:01:41,220 intuitivt med paddeln? 29 00:01:41,220 --> 00:01:45,630 Bara göra det lika oavsett horisontellt läge är av bollen. 30 00:01:45,630 --> 00:01:49,220 Och så länge du gör det i takt med bollen rör sig här spelet kommer 31 00:01:49,220 --> 00:01:53,100 aldrig, någonsin, någonsin missa bollen och du kommer att vinna varje gång. 32 00:01:53,100 --> 00:01:55,430 >> Men i denna veckas hacker edition det finns mer än bara Gud läget. 33 00:01:55,430 --> 00:01:56,720 Det finns ett antal andra funktioner. 34 00:01:56,720 --> 00:01:58,140 Bland dem, lasrar. 35 00:01:58,140 --> 00:02:01,070 Så att om du får riktigt otålig du kan börja skjuta ner tegelstenarna 36 00:02:01,070 --> 00:02:02,120 och några andra. 37 00:02:02,120 --> 00:02:04,560 Och för er som vill kalibrera standard kontra hacker 38 00:02:04,560 --> 00:02:08,750 edition, kan jag se att denna veckas hacker edition är medvetet ett 39 00:02:08,750 --> 00:02:12,830 lite mer genomförbart, säger, än Gud läget var med Game of Fifteen. 40 00:02:12,830 --> 00:02:15,300 >> Så om du letar efter en sträcka och du är ute efter lite extra kul 41 00:02:15,300 --> 00:02:18,400 funktioner gör dyk in om intresse. 42 00:02:18,400 --> 00:02:21,280 Nu mer praktiskt, låt mig peka ut en sak också. 43 00:02:21,280 --> 00:02:24,780 GDB, vilket några av er kanske inte har ännu berörde personligen, vilket är bra. 44 00:02:24,780 --> 00:02:28,530 Men nu är verkligen tid att vänja till detta och bekväma med detta verktyg 45 00:02:28,530 --> 00:02:31,510 eftersom det kommer att göra ditt liv mycket lättare, verkligen. 46 00:02:31,510 --> 00:02:34,900 >> Per Rob föreläsning på GDB ett par veckor sedan, minns 47 00:02:34,900 --> 00:02:36,810 att GDB är en debugger. 48 00:02:36,810 --> 00:02:41,230 Det är ett verktyg som låter dig köra din program men kör det steg för steg, linje 49 00:02:41,230 --> 00:02:45,680 av linje, så att du kan rota runt, så att du ser saker som händer, så 50 00:02:45,680 --> 00:02:47,310 att du kan skriva ut värden på variabler. 51 00:02:47,310 --> 00:02:50,580 Kort sagt, det ger dig så mycket mer effekt än printDef gör. 52 00:02:50,580 --> 00:02:52,900 >> Nu visserligen gränssnittet är ganska svårbegriplig. 53 00:02:52,900 --> 00:02:55,180 Svart och vit text gränssnitt för det mesta. 54 00:02:55,180 --> 00:02:57,400 Kommandona är något tufft att komma ihåg i början. 55 00:02:57,400 --> 00:03:01,230 Men även om det kan ta en halv en timme, en timme, för att sätta det i förskott 56 00:03:01,230 --> 00:03:02,940 investering i tid till det, lita på mig. 57 00:03:02,940 --> 00:03:06,440 Visst genom termins slut kommer det att spara du en storleksordning mer 58 00:03:06,440 --> 00:03:07,600 tid än så. 59 00:03:07,600 --> 00:03:09,200 >> Så i början av veckan dyker i. 60 00:03:09,200 --> 00:03:13,200 Och i termer av Breakout, vet att du kan göra detta så länge du har 61 00:03:13,200 --> 00:03:18,230 distributionen koden eller din egen kod pågår i din Pst4 katalogen. 62 00:03:18,230 --> 00:03:21,680 Vet att du kan köra gdb. / Breakout. 63 00:03:21,680 --> 00:03:23,490 >> Detta kommer att öppna upp ett fönster som detta. 64 00:03:23,490 --> 00:03:25,530 Låt mig ge mig mer av ett terminalfönster. 65 00:03:25,530 --> 00:03:27,770 Och sedan vad jag ska gå vidare och göra, är det inte bara köra det. 66 00:03:27,770 --> 00:03:30,690 Jag ska först sätta en brytpunkt återkallelse, vilket gör att du kan pausa 67 00:03:30,690 --> 00:03:32,500 exekvering på en viss plats. 68 00:03:32,500 --> 00:03:35,750 >> Bara för att hålla det enkelt Jag kommer att bryta på linjen en bara genom att skriva 69 00:03:35,750 --> 00:03:37,000 nummer ett. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Låt mig faktiskt åter öppna det här fönstret eftersom det blir en 72 00:03:43,250 --> 00:03:45,700 lite små där. 73 00:03:45,700 --> 00:03:53,270 Så vad jag nu ska göra här är Om jag öppnar mitt terminalfönster. 74 00:03:53,270 --> 00:03:53,910 Kom igen, det går vi. 75 00:03:53,910 --> 00:03:59,850 >> Så nu om jag går tillbaka till dropbox, Pst4 och köra gdb. / breakout in, märker 76 00:03:59,850 --> 00:04:02,600 Jag kommer att bryta en att ställa en brytpunkt på linje ett. 77 00:04:02,600 --> 00:04:04,840 Och nu ska jag gå framåt och typ springa. 78 00:04:04,840 --> 00:04:07,370 Och när jag gör det, märker ingenting verkar hända. 79 00:04:07,370 --> 00:04:08,120 >> Det finns inga pop up. 80 00:04:08,120 --> 00:04:09,790 Det finns ingen grafisk användargränssnitt ännu. 81 00:04:09,790 --> 00:04:13,340 Men det är förståeligt eftersom jag är bokstavligen på rad ett i mitt program. 82 00:04:13,340 --> 00:04:17,110 Och märker att jag snabbt har överlämnats, specifikt nu till 62, eftersom alla 83 00:04:17,110 --> 00:04:20,600 grejer på toppen av denna fil är saker som kommentarer och konstanter och 84 00:04:20,600 --> 00:04:22,460 ointressant grejer för nu. 85 00:04:22,460 --> 00:04:25,840 >> Så nu är jag inne i huvud, det verkar, på rad 62. 86 00:04:25,840 --> 00:04:27,960 Och detta är bara fördelningen kod, återkallelse. 87 00:04:27,960 --> 00:04:33,810 Om jag öppnar detta upp genom att gå, på liknande sätt, i min drop box katalog i Pst4, 88 00:04:33,810 --> 00:04:35,450 in breakout.c. 89 00:04:35,450 --> 00:04:40,670 Och om jag bläddra ner och ner och ner, och låt mig gå vidare och slå på 90 00:04:40,670 --> 00:04:44,990 mina radnummer. 91 00:04:44,990 --> 00:04:50,300 >> Vad jag får se om jag bläddra ner till linje 62, är exakt den linje som 92 00:04:50,300 --> 00:04:50,910 Vi har pausat den. 93 00:04:50,910 --> 00:04:53,720 Så här linjen här, 62, är där vi ska vara. 94 00:04:53,720 --> 00:04:57,470 Så nu i GDB, om jag går vidare och skriver nu nästa, skriv det kommer att 95 00:04:57,470 --> 00:04:58,450 exekvera den linjen. 96 00:04:58,450 --> 00:05:00,610 Och voila, vi har den så kallade g fönster. 97 00:05:00,610 --> 00:05:02,800 Om obekant med vad en GWindow är, att inte oroa dig. 98 00:05:02,800 --> 00:05:05,740 Den spec kommer att introducera dig till det, som samt ett antal av genomgång videor 99 00:05:05,740 --> 00:05:06,830 inbäddade i spec. 100 00:05:06,830 --> 00:05:08,610 >> Men nu ska vi göra detta till en lite mer intressant. 101 00:05:08,610 --> 00:05:10,960 Låt mig gå här fönstret över åt sidan lite. 102 00:05:10,960 --> 00:05:13,480 Låt mig göra fönstret lite större så jag kan se mer. 103 00:05:13,480 --> 00:05:16,140 >> Och låt mig nu gå vidare och göra nästa gång. 104 00:05:16,140 --> 00:05:17,550 Och det är mina tegelstenar. 105 00:05:17,550 --> 00:05:20,490 Om jag skriver nästa gång nu ser jag bollen. 106 00:05:20,490 --> 00:05:23,520 Och om jag skriver nästa gång nu ser jag paddeln. 107 00:05:23,520 --> 00:05:26,690 >> Och lyckligtvis detta gedit är inte verkligen samarbeta genom att visa mig 108 00:05:26,690 --> 00:05:27,660 allt jag vill ha. 109 00:05:27,660 --> 00:05:30,820 Men nu när jag gör nästa gång, nästa gång, jag är bara 110 00:05:30,820 --> 00:05:32,260 förklara några variabler. 111 00:05:32,260 --> 00:05:34,750 Och jag kan skriva ut någon av dessa killar. 112 00:05:34,750 --> 00:05:37,170 Skriv tegel, grafik liv. 113 00:05:37,170 --> 00:05:39,910 >> Och nu om jag fortsätter att göra nästa, märker att jag ska vara 114 00:05:39,910 --> 00:05:40,870 insidan av denna slinga. 115 00:05:40,870 --> 00:05:43,380 Men koden kommer att köra precis som jag förväntar. 116 00:05:43,380 --> 00:05:45,810 Så när jag träffade den här funktionen, Vänta för klick, det kommer att göra 117 00:05:45,810 --> 00:05:46,830 det som bokstavligen. 118 00:05:46,830 --> 00:05:48,870 Så jag verkade ha förlorat kontrollen över programmet. 119 00:05:48,870 --> 00:05:50,480 >> GDB inte ge mig en annan snabbt. 120 00:05:50,480 --> 00:05:51,500 Men inte att oroa sig. 121 00:05:51,500 --> 00:05:53,720 Gå till mitt spel, klicka någonstans. 122 00:05:53,720 --> 00:05:56,270 >> Och voila, nu fortsätter det till linje 86. 123 00:05:56,270 --> 00:05:59,460 Så återigen, det är ovärderligt, i slutändan, för felsökning problem. 124 00:05:59,460 --> 00:06:03,050 Eftersom du kan bokstavligen gå igenom din kod, skriva ut saker och mycket, 125 00:06:03,050 --> 00:06:03,640 mycket, mer. 126 00:06:03,640 --> 00:06:07,210 Men för nu, dessa verktyg enbart borde få dig ganska långt. 127 00:06:07,210 --> 00:06:10,050 >> Så vi är, naturligtvis, ta en titt vid Grafik nu, helt plötsligt. 128 00:06:10,050 --> 00:06:12,350 Och nu vår värld blir lite mer intressant. 129 00:06:12,350 --> 00:06:15,680 Och ni vet, kanske, från några av de videoklipp på nätet som vi har dessa 130 00:06:15,680 --> 00:06:18,280 shorts som du har tittat på som en del av problemsamlingar. 131 00:06:18,280 --> 00:06:20,460 >> Och de har blivit skjuten, medvetet, mot en vit bakgrund. 132 00:06:20,460 --> 00:06:23,380 Och några av dem har undervisningen Fellows dra lite text på 133 00:06:23,380 --> 00:06:25,490 skärm som är överlagras på sidan av dem. 134 00:06:25,490 --> 00:06:27,760 Men naturligtvis är det inte så intressant i den verkliga världen. 135 00:06:27,760 --> 00:06:30,520 Detta är bara en föreläsningssal med en stor vit skärm och en bakgrund. 136 00:06:30,520 --> 00:06:33,330 Och vår fantastiska produktionsteam sort av gör allting ser vacker 137 00:06:33,330 --> 00:06:36,620 i efterhand genom att beskära ut eller överliggande något 138 00:06:36,620 --> 00:06:37,840 vi gör eller inte vill. 139 00:06:37,840 --> 00:06:41,560 >> Nu bara för att motivera denna vecka och riktigt, där du kan gå i slutändan, 140 00:06:41,560 --> 00:06:42,560 med datavetenskap. 141 00:06:42,560 --> 00:06:44,260 Inte bara efter problem som fyra. 142 00:06:44,260 --> 00:06:48,240 Men efter en kurs eller en hel läroplanen är det fantastiskt vad man kan 143 00:06:48,240 --> 00:06:51,090 göra dessa dagar med avseende på grafik i synnerhet. 144 00:06:51,090 --> 00:06:53,440 >> Några av er kanske har sett detta flyter runt på nätet. 145 00:06:53,440 --> 00:06:56,240 Men jag tänkte att jag skulle visa er, för bara ett par minuter, en glimt av vad 146 00:06:56,240 --> 00:07:01,890 datateknik och vad CGI, datorgrafik kan göra dessa dagar 147 00:07:01,890 --> 00:07:04,510 med en välbekant sång och kanske filmen. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIK - LANA DEL RAY, "Ung och vacker] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> Högtalare 1: Det är bara en liten bit fantastiskt, kanske, hur 151 00:10:52,470 --> 00:10:52,857 allestädes närvarande - 152 00:10:52,857 --> 00:10:57,040 >> [Applåder] 153 00:10:57,040 --> 00:10:59,230 >> Högtalare 1: Jag har precis hämtat den. 154 00:10:59,230 --> 00:11:02,920 Men det är verkligen fantastiskt, jag tror, ​​precis hur allestädes närvarande program och kod, och 155 00:11:02,920 --> 00:11:04,230 verktyg som detta är riktigt. 156 00:11:04,230 --> 00:11:07,685 Så det är en smak av riktningen där du kan gå. 157 00:11:07,685 --> 00:11:10,620 Åh, inget mer Appliance idag. 158 00:11:10,620 --> 00:11:14,640 Jo, det är faktiskt tragiskt timing givet den punkt jag bara försökt att göra. 159 00:11:14,640 --> 00:11:18,670 >> Okej, så låt oss starta Fusion igen. 160 00:11:18,670 --> 00:11:20,800 Påminn mig senare. 161 00:11:20,800 --> 00:11:24,190 Okej, och du bör ha fått en e-post som en åt sidan om du fick en 162 00:11:24,190 --> 00:11:25,460 märker sånt. 163 00:11:25,460 --> 00:11:29,940 Okej, så minns att förra veckan Vi började att dra tillbaka detta 164 00:11:29,940 --> 00:11:31,380 senare känd som sträng. 165 00:11:31,380 --> 00:11:34,700 >> string påminner en datatyp som är deklareras i CS50 biblioteket. 166 00:11:34,700 --> 00:11:37,740 Och det är en del av stödhjul som nu börjar ta fart. 167 00:11:37,740 --> 00:11:41,280 Det var ett användbart begrepp tidigt. 168 00:11:41,280 --> 00:11:43,750 Men nu kommer det att bli mer intressant och mer kraftfullt för att 169 00:11:43,750 --> 00:11:48,330 faktiskt se att under huven, en sträng är precis vad vi sa? 170 00:11:48,330 --> 00:11:50,500 >> Ja, så det är en så kallad char *. 171 00:11:50,500 --> 00:11:53,860 Och * det visar att det finns någon form av adress inblandade. 172 00:11:53,860 --> 00:11:58,690 Och så när du säger char * du menar bara en variabel vars datatyp är en 173 00:11:58,690 --> 00:11:59,290 pekare nu. 174 00:11:59,290 --> 00:12:01,770 Det faktum att det finns en stjärna där betyder bara att du deklarerar en 175 00:12:01,770 --> 00:12:03,020 så kallad pekare. 176 00:12:03,020 --> 00:12:06,220 Och att pekaren ska tydligen lagra adress, för 177 00:12:06,220 --> 00:12:07,810 Naturligtvis, en röding. 178 00:12:07,810 --> 00:12:08,960 >> Nu varför detta vettigt? 179 00:12:08,960 --> 00:12:11,200 Tja, vad är en sträng under huven? 180 00:12:11,200 --> 00:12:15,130 Tja, för lite tid vi har sagt att en sträng under huven är 181 00:12:15,130 --> 00:12:18,460 bara h-e-L-l-o, till exempel. 182 00:12:18,460 --> 00:12:21,585 >> Men vi har pratat om detta som är, i huvudsak, en array. 183 00:12:21,585 --> 00:12:25,410 Och en matris skulle då se lite mer om detta, med var och en av dessa 184 00:12:25,410 --> 00:12:26,460 tar upp en bit. 185 00:12:26,460 --> 00:12:28,710 Och då har vi sagt att det finns något speciellt tillbaka hit, det 186 00:12:28,710 --> 00:12:31,270 backslash 0, eller null terminator. 187 00:12:31,270 --> 00:12:35,230 >> Så hela den här tiden, det här har varit en sträng. 188 00:12:35,230 --> 00:12:38,320 Men egentligen, är en sträng faktiskt en adress. 189 00:12:38,320 --> 00:12:43,210 Och adresser, som vi ska se, är ofta prefixet 0x av konvention. 190 00:12:43,210 --> 00:12:44,540 Vad betecknar 0x? 191 00:12:44,540 --> 00:12:45,970 Någon som vet? 192 00:12:45,970 --> 00:12:47,320 >> Så det betyder bara hexadecimalt. 193 00:12:47,320 --> 00:12:52,360 Så du kanske minns, faktiskt, från Pst 1, jag tror, ​​en av uppvärmning 194 00:12:52,360 --> 00:12:55,740 frågor egentligen om hexadecimal form förutom 195 00:12:55,740 --> 00:12:57,100 binär och decimal. 196 00:12:57,100 --> 00:13:00,460 Och motivationen här är att med hexadecimala du har 16 197 00:13:00,460 --> 00:13:01,770 siffrorna till ditt förfogande. 198 00:13:01,770 --> 00:13:07,900 0, följt 1, 2, 3, 4, 5, 6, 7, 8, 9, av a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> Och om man räknar alla de upp, du får totalt 16. 200 00:13:10,430 --> 00:13:13,200 Så detta är i kontrast med decimal, där vi har 10 201 00:13:13,200 --> 00:13:14,690 siffror, 0 till nio. 202 00:13:14,690 --> 00:13:17,750 Det är i kontrast med binär där vi har bara 0 och 1. 203 00:13:17,750 --> 00:13:21,450 >> Men i slutet av dagen kan du bara representerar samma nummer, men 204 00:13:21,450 --> 00:13:22,500 något annorlunda. 205 00:13:22,500 --> 00:13:25,840 Och hexadecimal är vanligt eftersom så det visar sig - och vi kommer att se detta 206 00:13:25,840 --> 00:13:28,790 senare i kursen - även när vi får för webbprogrammering i samband med 207 00:13:28,790 --> 00:13:32,100 HTML och färgkoder, hexadecimal är trevligt. 208 00:13:32,100 --> 00:13:36,390 Eftersom varje siffra, visar sig, representerar fyra bitar perfekt. 209 00:13:36,390 --> 00:13:39,280 Så det typ bara för ledningar upp snyggt som vi så småningom se. 210 00:13:39,280 --> 00:13:44,720 Så detta kan vara Ox123 eller något sådär, betecknar adress 123 211 00:13:44,720 --> 00:13:47,050 någonstans inne i min datorns minne. 212 00:13:47,050 --> 00:13:50,600 >> Men naturligtvis vissa problem uppstår på grund av denna underliggande 213 00:13:50,600 --> 00:13:51,520 genomförande. 214 00:13:51,520 --> 00:13:55,930 Och minns att jag tog en stab på genomföra en funktion som denna - 215 00:13:55,930 --> 00:14:00,260 jämför dash 0 dot c förra veckan, som trots att det såg ut som om det var 216 00:14:00,260 --> 00:14:04,270 rätt, det helt enkelt inte jämföra två strängar korrekt. 217 00:14:04,270 --> 00:14:07,470 >> Jag har kastat bort huvud, och jag har kastat bort kommentarer bara för att fokusera på 218 00:14:07,470 --> 00:14:08,970 den kod som är intressant här. 219 00:14:08,970 --> 00:14:10,660 Och det är i rött eftersom det är buggig. 220 00:14:10,660 --> 00:14:11,670 Av vilken anledning? 221 00:14:11,670 --> 00:14:15,890 >> Tja, på toppen där när jag förklarade en sträng, vad händer egentligen på 222 00:14:15,890 --> 00:14:17,260 under huven? 223 00:14:17,260 --> 00:14:19,530 Nåväl, låt mig gå över till sålla här och dra det. 224 00:14:19,530 --> 00:14:23,230 Så jag förklarade igen, sträng s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Så jag ska gå vidare nu och dra er för vad den verkligen är. 226 00:14:26,640 --> 00:14:28,590 Det kommer att bli en kvadrat här. 227 00:14:28,590 --> 00:14:30,490 Och jag kommer att hävda att det är 32 bitar. 228 00:14:30,490 --> 00:14:32,890 Åtminstone är det oftast, åtminstone på CS50 229 00:14:32,890 --> 00:14:34,520 apparaten i många datorer. 230 00:14:34,520 --> 00:14:35,980 Jag ska kalla det är. 231 00:14:35,980 --> 00:14:39,070 >> Men nu minns att vi kallas GetString. 232 00:14:39,070 --> 00:14:41,430 Så getString avkastning, naturligtvis en sträng. 233 00:14:41,430 --> 00:14:45,790 Om användaren skriver i h-e-l-l-o ange strängen hej blir returneras. 234 00:14:45,790 --> 00:14:51,010 Och den strängen, som vi just sagt, slutar upp någonstans i din dators minne 235 00:14:51,010 --> 00:14:53,240 ett omvänt snedstreck 0 i slutet. 236 00:14:53,240 --> 00:14:56,650 Jag ska göra det som array - eller sammanhängande block av tecken - 237 00:14:56,650 --> 00:14:58,330 att det faktiskt är. 238 00:14:58,330 --> 00:15:01,790 >> Och nu, är vad getString faktiskt återvända? 239 00:15:01,790 --> 00:15:04,340 Vad har getString varit återvänder all denna tid? 240 00:15:04,340 --> 00:15:07,520 Tja, säger vi, i veckor innan, den returnerar en sträng. 241 00:15:07,520 --> 00:15:10,250 Men mer tekniskt, vad GetString avkastning tydligen? 242 00:15:10,250 --> 00:15:11,610 >> Publik: En adress. 243 00:15:11,610 --> 00:15:12,600 >> Högtalare 1: En adress. 244 00:15:12,600 --> 00:15:16,630 Specifikt den returnerar adressen för den allra första tuggan, vad det än är. 245 00:15:16,630 --> 00:15:18,830 Jag håller bara med hjälp av en, två, tre eftersom det är bekvämt. 246 00:15:18,830 --> 00:15:21,380 >> Den returnerar adressen för den första tecken i strängen. 247 00:15:21,380 --> 00:15:23,510 Och vi sade förra veckan att som är tillräcklig. 248 00:15:23,510 --> 00:15:26,710 Eftersom vi kan alltid räkna ut var slutet av strängen bara genom 249 00:15:26,710 --> 00:15:30,150 iteration över det, kanske, med en för slinga eller en while-slinga eller något liknande 250 00:15:30,150 --> 00:15:34,990 att bara letar efter "backslash 0", den speciella sentinel karaktär. 251 00:15:34,990 --> 00:15:37,220 >> Och då vet vi att strängen råkar vara av längd - 252 00:15:37,220 --> 00:15:37,980 i detta fall - 253 00:15:37,980 --> 00:15:38,670 fem. 254 00:15:38,670 --> 00:15:43,800 Så tekniskt vad GetString gör är det returnerar Ox123 i detta fall. 255 00:15:43,800 --> 00:15:53,670 Och tekniskt vad som sedan händer är att vi lagrar, insidan av s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Vid slutet av dagen, även om detta är nytt koncept, pekare, de är 257 00:15:56,460 --> 00:15:57,350 bara variabler. 258 00:15:57,350 --> 00:16:00,440 Men de råkar lagra bitar som tillsammans representerar en adress. 259 00:16:00,440 --> 00:16:03,700 Så tekniskt sett allt de får lagras i s är Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Men vi som människor - 261 00:16:04,680 --> 00:16:06,020 inklusive idag onward - 262 00:16:06,020 --> 00:16:09,290 är verkligen inte kommer att bry sig, typiskt, vad den faktiska adressen är 263 00:16:09,290 --> 00:16:10,520 av viss del av minnet. 264 00:16:10,520 --> 00:16:14,040 Det är bara till låg detaljnivå till vara intellektuellt intressant. 265 00:16:14,040 --> 00:16:15,440 Så jag kommer att ångra detta. 266 00:16:15,440 --> 00:16:19,810 Och i stället, mer hög nivå, bara säga att när vi pratar om pekare 267 00:16:19,810 --> 00:16:22,170 Jag ska bara dra mer användarvänlig pilen som förmedlar 268 00:16:22,170 --> 00:16:26,060 Samma idé och abstracts bort uppgifter om vad det faktiska 269 00:16:26,060 --> 00:16:27,700 underliggande adress är. 270 00:16:27,700 --> 00:16:33,290 >> Om vi ​​nu går tillbaka till koden, vad hände förra veckan om vi har string t 271 00:16:33,290 --> 00:16:34,510 lika getString? 272 00:16:34,510 --> 00:16:38,630 Tja, om jag igen, typ i hello den här gången kommer jag att få 273 00:16:38,630 --> 00:16:40,460 en annan del av minnet. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o backslash 0. 275 00:16:44,820 --> 00:16:48,320 >> Men eftersom jag ringde getString en andra gång - 276 00:16:48,320 --> 00:16:51,100 och jag vet detta från att titta på källkod för GetString - även 277 00:16:51,100 --> 00:16:54,350 även om det är en tillfällighet att hej var skrev i två gånger, är GetString inte 278 00:16:54,350 --> 00:16:55,890 kommer att försöka optimera och vara smart. 279 00:16:55,890 --> 00:16:58,550 Det kommer bara att få en annan bit av minne från datorn, som är 280 00:16:58,550 --> 00:16:59,640 kommer att vara på en annan adress. 281 00:16:59,640 --> 00:17:02,330 Låt godtyckligt bara säga 456. 282 00:17:02,330 --> 00:17:04,079 >> Och vad kommer det att återvända? 283 00:17:04,079 --> 00:17:08,030 Det kommer att gå tillbaka 456 och förvara den i t. 284 00:17:08,030 --> 00:17:12,010 Så vad som verkligen händer, om vänster sida är jag har en annan bit 285 00:17:12,010 --> 00:17:14,260 minne, 32 bitar typiskt. 286 00:17:14,260 --> 00:17:16,720 Och det kommer att gå Ox456. 287 00:17:16,720 --> 00:17:20,140 Men återigen, jag är inte intresserad av dessa särskilda siffror längre. 288 00:17:20,140 --> 00:17:23,069 Jag kommer bara att abstrakt rita den som en pil. 289 00:17:23,069 --> 00:17:25,202 >> Så detta är nu en ny förklaring. 290 00:17:25,202 --> 00:17:28,735 Men det är exakt samma idé som är pågått hela tiden. 291 00:17:28,735 --> 00:17:33,150 Och så anledning då, att denna första version av Compare var buggy 292 00:17:33,150 --> 00:17:34,480 förra veckan är varför? 293 00:17:34,480 --> 00:17:38,000 När du gör om s är lika med lika t Vad är du verkligen 294 00:17:38,000 --> 00:17:40,550 under huven jämföra? 295 00:17:40,550 --> 00:17:41,910 >> Du jämför adresserna. 296 00:17:41,910 --> 00:17:47,950 Och bara intuitivt, tydligt, Ox123 kommer inte till lika Ox456. 297 00:17:47,950 --> 00:17:49,380 Dessa siffror, dessa bitar är bara annorlunda. 298 00:17:49,380 --> 00:17:53,220 >> Och så konsekvent, förra veckan sa du skriver olika saker, även om 299 00:17:53,220 --> 00:17:55,360 ord var ordagrant samma. 300 00:17:55,360 --> 00:17:58,770 Så vi fixa detta. 301 00:17:58,770 --> 00:18:00,120 I lekmannaspråk, vad var fix? 302 00:18:00,120 --> 00:18:02,110 >> Publik: Använd en funktion. 303 00:18:02,110 --> 00:18:02,870 >> Högtalare 1: Använd en funktion. 304 00:18:02,870 --> 00:18:05,190 Eller stjärnor är definitivt inblandade, men använder en funktion för att göra vad? 305 00:18:05,190 --> 00:18:05,962 >> Publik: Att jämföra strängar. 306 00:18:05,962 --> 00:18:07,390 >> Högtalare 1: Att jämföra strängar. 307 00:18:07,390 --> 00:18:11,030 Så det grundläggande problemet här var att jag var just med tanke på 308 00:18:11,030 --> 00:18:15,870 kvaliteten på strängar som skall fastställas av jämförelse av deras adresser. 309 00:18:15,870 --> 00:18:18,540 Och självklart det är bara dum nu en gång du förstår vad som händer 310 00:18:18,540 --> 00:18:19,510 under huven. 311 00:18:19,510 --> 00:18:23,270 För att verkligen jämföra strängar för att se om de är lika på det sätt som en människa 312 00:18:23,270 --> 00:18:26,680 skulle överväga två strängar är lika vi behöver jämföra dem karaktär för 313 00:18:26,680 --> 00:18:28,070 tecken för tecken. 314 00:18:28,070 --> 00:18:30,020 >> Nu kunde jag ha gjort detta mycket tediously. 315 00:18:30,020 --> 00:18:32,240 Men familjärt, vi med hjälp av en for-loop. 316 00:18:32,240 --> 00:18:36,050 Och bara jämföra s konsol Jag mot t fäste i.. 317 00:18:36,050 --> 00:18:39,590 s fäste i plus 1 mot t fäste I plus ett, och så vidare, inuti 318 00:18:39,590 --> 00:18:40,580 något slags slinga. 319 00:18:40,580 --> 00:18:44,950 Och om jag upptäcker några två tecken som skiljer sig, eller om jag inser att ooh, är s 320 00:18:44,950 --> 00:18:48,410 kortare än t eller längre än t Jag kan direkt säga falsk, 321 00:18:48,410 --> 00:18:49,390 de är inte samma sak. 322 00:18:49,390 --> 00:18:55,370 >> Men om jag får igenom s och t och säga samma, samma, samma, samma, samma, i slutet av 323 00:18:55,370 --> 00:18:58,520 båda strängar, kan jag säga sant, de är lika. 324 00:18:58,520 --> 00:19:01,040 Tja, tack och lov, år sedan någon skrev att koden för oss. 325 00:19:01,040 --> 00:19:03,790 >> Och de kallade det StrComp för sträng jämföra. 326 00:19:03,790 --> 00:19:11,900 Och även om det är en liten räknare intuitivt, returnerar StrComp 0 om de 327 00:19:11,900 --> 00:19:14,520 två strängar, s och t är desamma. 328 00:19:14,520 --> 00:19:18,090 Men den returnerar negativt värde om s bör komma före t bokstavsordning 329 00:19:18,090 --> 00:19:20,610 positivt värde om det skulle komma efter t alfabetiskt. 330 00:19:20,610 --> 00:19:24,030 >> Så om du någonsin vill sortera något, det visar sig att StrComp är användbar. 331 00:19:24,030 --> 00:19:26,660 Eftersom den inte bara säga ja eller nej, lika eller inte. 332 00:19:26,660 --> 00:19:30,440 Det ger dig en känsla av att beställa gillar en ordbok makt. 333 00:19:30,440 --> 00:19:33,770 Så StrComp, lika s kommatecken t är lika med 0 innebär att 334 00:19:33,770 --> 00:19:35,200 strängar är verkligen lika. 335 00:19:35,200 --> 00:19:38,680 Eftersom den som skrev denna funktion år sedan antagligen använt en for-loop 336 00:19:38,680 --> 00:19:42,840 eller en while-slinga eller något liknande att integrera över karaktärerna igen 337 00:19:42,840 --> 00:19:45,270 och igen och igen. 338 00:19:45,270 --> 00:19:47,300 >> Men problemet två uppstod här. 339 00:19:47,300 --> 00:19:48,750 Detta var copy0.c. 340 00:19:48,750 --> 00:19:51,680 Och de två i rött är eftersom det är bristfällig. 341 00:19:51,680 --> 00:19:52,800 Och vad gjorde vi här? 342 00:19:52,800 --> 00:19:54,310 Tja, först jag ringde getString. 343 00:19:54,310 --> 00:19:56,255 Och jag lagrat returvärdet i ar. 344 00:19:56,255 --> 00:20:00,260 Så det är ganska mycket samma som denna övre delen av bilden. 345 00:20:00,260 --> 00:20:01,490 >> Men vad kommer efter det? 346 00:20:01,490 --> 00:20:04,980 Nåväl, låt mig gå vidare och bli av en hel massa av detta. 347 00:20:04,980 --> 00:20:09,650 Vi ska spola tillbaka i tiden till när vi bara har s, vilket är konsekvent med 348 00:20:09,650 --> 00:20:10,940 line en uppe. 349 00:20:10,940 --> 00:20:11,400 >> Jag kollar. 350 00:20:11,400 --> 00:20:13,450 Om s är lika med är lika med 0. 351 00:20:13,450 --> 00:20:18,670 Nu, en snabb liten not, när kanske GetString returnera 0? 352 00:20:18,670 --> 00:20:19,580 Det finns inte tillräckligt med minne. 353 00:20:19,580 --> 00:20:19,880 Rätt? 354 00:20:19,880 --> 00:20:22,310 >> Det är sällsynt att detta kommer att hända, förvisso på en dator som är 355 00:20:22,310 --> 00:20:24,740 fick hundratals meg eller även gig RAM. 356 00:20:24,740 --> 00:20:27,080 Men det kan, i teorin, tillbaka 0, i synnerhet om 357 00:20:27,080 --> 00:20:28,080 användaren inte samarbetar. 358 00:20:28,080 --> 00:20:31,640 Det finns olika sätt att låtsas som att du inte har inmatade någonting och trick 359 00:20:31,640 --> 00:20:34,100 GetString till att återvända 0 effektivt. 360 00:20:34,100 --> 00:20:35,470 >> Så det kommer att kontrollera detta. 361 00:20:35,470 --> 00:20:39,430 För om någon av er har börjat få, redan, segmentering fel - 362 00:20:39,430 --> 00:20:42,280 som förmodligen har varit en källa av viss frustration - 363 00:20:42,280 --> 00:20:46,150 de är nästan alltid resultatet minne-relaterat fel. 364 00:20:46,150 --> 00:20:50,440 På något sätt du trasslat med avseende på en pekare, även om du inte inser 365 00:20:50,440 --> 00:20:51,530 det fanns en pekare. 366 00:20:51,530 --> 00:20:55,260 Så du kanske har inducerat segmentering fel så tidigt som vecka en med 367 00:20:55,260 --> 00:21:02,100 något som en for-loop eller en stund slinga och en array genom att gå för långt 368 00:21:02,100 --> 00:21:05,900 förbi gränserna för någon array som du förklarade, i vecka två i 369 00:21:05,900 --> 00:21:06,690 synnerhet. 370 00:21:06,690 --> 00:21:09,220 >> Du kanske har gjort det även i problem ställa fyra med Breakout. 371 00:21:09,220 --> 00:21:12,910 Även om du förmodligen inte har sett några stjärnor i distributionen koden för 372 00:21:12,910 --> 00:21:17,410 Breakout, visar det sig att de GRect och GOval och andra sådana saker, 373 00:21:17,410 --> 00:21:19,650 de är faktiskt pekare under huven. 374 00:21:19,650 --> 00:21:23,430 >> Men Stanford, liksom vi, typ av hudar att specificera åtminstone för biblioteken 375 00:21:23,430 --> 00:21:26,540 ändamål, ungefär som vi gör för sträng och röding *. 376 00:21:26,540 --> 00:21:30,060 Men GRect och GOval och alla de saker ni är eller kommer att använda 377 00:21:30,060 --> 00:21:32,630 denna vecka är ytterst minnesadresser. 378 00:21:32,630 --> 00:21:33,650 Du vet bara inte det. 379 00:21:33,650 --> 00:21:37,240 >> Så det är inte förvånande då, kanske, att du kanske snubbla över några 380 00:21:37,240 --> 00:21:38,580 segmentering fel. 381 00:21:38,580 --> 00:21:41,290 Men vad som är intressant här nu, om när vi kontrollerar för 0 vi gör 382 00:21:41,290 --> 00:21:43,460 string t blir s. 383 00:21:43,460 --> 00:21:44,690 Nåväl, låt mig förklara t. 384 00:21:44,690 --> 00:21:47,730 Jag kommer att göra det som en kvadrat, 32 bitar, kalla det t. 385 00:21:47,730 --> 00:21:49,740 Och sen ska jag göra blir s. 386 00:21:49,740 --> 00:21:51,130 >> Tja, vad betyder det? 387 00:21:51,130 --> 00:21:53,280 Tja, det är lite svårt att tänka om det föreställa klokt. 388 00:21:53,280 --> 00:21:55,025 Men låt oss tänka på vad som finns inuti x? 389 00:21:55,025 --> 00:21:59,430 Vad är bokstavligen inuti denna variabel? 390 00:21:59,430 --> 00:22:01,500 Värdet Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Så när jag säger string t blir s, som bara betyder ordagrant ta nummer 392 00:22:05,815 --> 00:22:10,070 i s, vilket är Ox123 och lägga den Ox123. 393 00:22:10,070 --> 00:22:13,740 Eller bildmässigt, om jag slags abstrakt bort från denna detalj den har 394 00:22:13,740 --> 00:22:16,600 effekt bokstavligen göra detta också. 395 00:22:16,600 --> 00:22:22,110 >> Så nu tänker tillbaka på förra veckan när Vi fortsatte till kapitalistiska T. I 396 00:22:22,110 --> 00:22:23,800 gjorde T bracket 0. 397 00:22:23,800 --> 00:22:27,150 Tja, T bracket 0, även om det är en pekare, kan du behandla det som om 398 00:22:27,150 --> 00:22:29,220 det är en array, med en kvadratisk hakparenteser. 399 00:22:29,220 --> 00:22:31,550 >> Så där är T bracket 0? 400 00:22:31,550 --> 00:22:32,990 Tja, det är det h.. 401 00:22:32,990 --> 00:22:36,800 Och så när vi använder denna kodrad, två övre, som är i att C type.h 402 00:22:36,800 --> 00:22:38,460 headerfil, det är där det är deklarerade. 403 00:22:38,460 --> 00:22:44,410 Du kapitalisera denna H. Men Naturligtvis, det är exakt samma h som är 404 00:22:44,410 --> 00:22:46,540 insidan av s, så att säga. 405 00:22:46,540 --> 00:22:51,930 Och så nu har ändrats eller aktiveras både den ursprungliga och den 406 00:22:51,930 --> 00:22:53,120 så kallade kopia. 407 00:22:53,120 --> 00:22:56,620 Eftersom du inte göra en kopia i sätt att en människa vill att det ska vara. 408 00:22:56,620 --> 00:22:59,710 >> Så vad var det fix här, i copy1.c förra veckan? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funktioner, så vi kunde faktiskt kopiera strängen. 411 00:23:05,580 --> 00:23:08,700 Och i grunden, vad vi behöver göra för att kopiera strängen? 412 00:23:08,700 --> 00:23:12,070 >> Nåväl, i denna gröna versionen här är jag kommer att göra det ganska låg nivå. 413 00:23:12,070 --> 00:23:14,260 Det finns faktiskt fungerar de kunde hjälpa till med detta. 414 00:23:14,260 --> 00:23:17,710 Men den mest grundläggande en, och den mest välbekant, åtminstone, kommer snart att vara 415 00:23:17,710 --> 00:23:19,600 bekant för oss, är följande - 416 00:23:19,600 --> 00:23:21,910 så en på den första raden av koden i grönt nu. 417 00:23:21,910 --> 00:23:23,970 >> Jag skrev precis s som char *. 418 00:23:23,970 --> 00:23:25,250 Det finns ingen fungerande skillnad där. 419 00:23:25,250 --> 00:23:28,790 Jag kastade bara bort CS50 biblioteket och Jag kallar det vad det är, en char *. 420 00:23:28,790 --> 00:23:31,640 >> Nu dot, dot, dot, eftersom det fanns någon felkontroll som inte 421 00:23:31,640 --> 00:23:33,200 intressant att prata om igen. 422 00:23:33,200 --> 00:23:34,710 Så nu t deklareras. 423 00:23:34,710 --> 00:23:35,780 Det är också en char *. 424 00:23:35,780 --> 00:23:38,280 Så jag ritade en liten fyrkant på skärmen som förut. 425 00:23:38,280 --> 00:23:41,870 >> Men på den högra sidan, malloc, vi sagt är minnet fördela. 426 00:23:41,870 --> 00:23:44,130 Så anslå cirka bit av minnet. 427 00:23:44,130 --> 00:23:48,830 Och hur många byte gör vi faktiskt vill fördela, det verkar? 428 00:23:48,830 --> 00:23:50,340 >> Tja, strängen längd s. 429 00:23:50,340 --> 00:23:52,310 Så om det är hej det är kommer att bli fem. 430 00:23:52,310 --> 00:23:53,950 Vi kommer att säga h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Så fem bytes. 432 00:23:55,090 --> 00:23:57,960 >> Men sedan plus 1, varför ett? 433 00:23:57,960 --> 00:23:58,830 Den 0 tecken. 434 00:23:58,830 --> 00:24:03,640 Om vi ​​inte lämnar utrymme för den här killen vi kan av misstag skapa en situation 435 00:24:03,640 --> 00:24:05,600 där strängen är h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 Och sedan nästa gång GetString är ringde och jag skriver in, till exempel, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, den datorn kommer att tro att s är faktiskt 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d eftersom det finns Ingen paus mellan dessa ord. 439 00:24:18,900 --> 00:24:19,810 >> Så vi behöver denna paus. 440 00:24:19,810 --> 00:24:20,720 Så vill vi inte fem. 441 00:24:20,720 --> 00:24:22,100 Vi vill ha sex byte. 442 00:24:22,100 --> 00:24:23,110 >> Och byte jag säga. 443 00:24:23,110 --> 00:24:25,220 Men det är verkligen dags storlek röding. 444 00:24:25,220 --> 00:24:28,040 Tekniskt röding är nästan alltid en enda byte. 445 00:24:28,040 --> 00:24:31,030 >> Men bara för att göra vår kod bärbar, så att säga, så att det fungerar på 446 00:24:31,030 --> 00:24:33,750 olika datorer även om de kanske vara något annorlunda under 447 00:24:33,750 --> 00:24:36,590 huva, jag ska generiskt säga storleken på röding, så att 448 00:24:36,590 --> 00:24:37,660 min kod fungerar alltid. 449 00:24:37,660 --> 00:24:40,610 Och jag behöver inte kompilera det bara eftersom jag uppgradera min dator eller använda 450 00:24:40,610 --> 00:24:42,140 någon annan plattform. 451 00:24:42,140 --> 00:24:45,300 >> Så jag har 6 gånger större en röding, som råkar vara 1. 452 00:24:45,300 --> 00:24:47,440 Så det innebär malloc kunde ge mig sex byte. 453 00:24:47,440 --> 00:24:49,140 Vad är det egentligen gör? 454 00:24:49,140 --> 00:24:52,810 Nåväl, låt mig rulla tillbaka i tiden här dit vi är i berättelsen. 455 00:24:52,810 --> 00:24:57,620 >> Så om jag går tillbaka hit, har jag förklarat en char * heter t. 456 00:24:57,620 --> 00:25:00,280 Jag har nu heter malloc för sex byte. 457 00:25:00,280 --> 00:25:06,400 Och nu ska jag dra dessa sex bytes precis som arrayen tidigare. 458 00:25:06,400 --> 00:25:10,570 Men jag vet faktiskt inte vad som är inuti denna array. 459 00:25:10,570 --> 00:25:14,640 >> Om du tilldelar minne det visar sig att Du kan inte lita på att det finns någon 460 00:25:14,640 --> 00:25:15,810 kända värdet där. 461 00:25:15,810 --> 00:25:18,400 Det kunde ha använts av något annat, någon annan funktion, någon annan 462 00:25:18,400 --> 00:25:19,630 kodrad som du skrev. 463 00:25:19,630 --> 00:25:22,870 Så vi ska generellt kalla dessa sopor värden och rita dem, kanske, som 464 00:25:22,870 --> 00:25:26,170 frågetecken, bara visar att vi vet inte vad som faktiskt finns. 465 00:25:26,170 --> 00:25:30,390 Och det är ingen big deal så länge vi är smart nog att skriva över dem 466 00:25:30,390 --> 00:25:34,550 sopor värden med siffror eller tecken som vi bryr oss om. 467 00:25:34,550 --> 00:25:36,340 >> Så i det här fallet vad ska jag göra? 468 00:25:36,340 --> 00:25:38,670 Tja, min kodrad nästa, har jag fyra. 469 00:25:38,670 --> 00:25:41,350 int jag får 0, blir n sträng längd s. 470 00:25:41,350 --> 00:25:42,750 Så en bekant för slinga. 471 00:25:42,750 --> 00:25:45,875 I är mindre än eller lika med n, som vanligtvis är över. 472 00:25:45,875 --> 00:25:47,500 >> Men den här gången är det avsiktligt. 473 00:25:47,500 --> 00:25:51,890 Jag + +, och då gör jag helt enkelt t fäste jag blir s. 474 00:25:51,890 --> 00:25:56,320 Eftersom min bild ser ut så här på detta ögonblick, som lagras i t är 475 00:25:56,320 --> 00:25:59,530 adress för att slumpmässiga bit av minne vars värden är okända. 476 00:25:59,530 --> 00:26:03,030 Men så fort jag gör t fäste 0 som sätter mig här. 477 00:26:03,030 --> 00:26:07,430 >> Och vad slutar upp att få dras dit? 478 00:26:07,430 --> 00:26:08,740 Vi hamnar att lägga tim. 479 00:26:08,740 --> 00:26:11,170 För det är vad som står på s konsol 0. 480 00:26:11,170 --> 00:26:14,300 Och sedan samma sak för e, och L, och L och o. 481 00:26:14,300 --> 00:26:17,930 >> n, varför jag går upp genom en lika med n? 482 00:26:17,930 --> 00:26:19,200 På grund av den 0 karaktär. 483 00:26:19,200 --> 00:26:23,580 Så bara för att vara tydlig, då, om jag faktiskt radera oavsett dessa sopor 484 00:26:23,580 --> 00:26:28,870 värden och sedan faktiskt dra in vad jag förväntar, är detta s bracket 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, plus det är släpande ny karaktär. 486 00:26:32,440 --> 00:26:36,080 >> Och så nu, om vi fortsatte förbi punkten, prick, prick i denna rätt version 487 00:26:36,080 --> 00:26:41,930 och aktiverade T konsol 0 Jag skulle, om naturligtvis utnyttja just detta 488 00:26:41,930 --> 00:26:47,050 kille här, som begreppsmässigt, var slutligen målet. 489 00:26:47,050 --> 00:26:48,040 Så det är allt pekaren är. 490 00:26:48,040 --> 00:26:51,430 >> Och du har använt dem i flera veckor nu i samband med strängar. 491 00:26:51,430 --> 00:26:53,530 Men under huven de är lite mer komplex. 492 00:26:53,530 --> 00:26:57,520 Men om man tänker på dem i denna illustrerad formen föreslår jag att de är 493 00:26:57,520 --> 00:27:01,720 förmodligen inte så skrämmande som de kan först tyckas vid första anblicken, 494 00:27:01,720 --> 00:27:04,730 särskilt med en sådan ny syntax. 495 00:27:04,730 --> 00:27:07,290 Eventuella frågor om pekare, strängar, eller tecken? 496 00:27:07,290 --> 00:27:07,580 Yeah? 497 00:27:07,580 --> 00:27:09,252 >> Publik: Kan du gå tillbaka till [OHÖRBAR]? 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Visst. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> Publik: Så hur kommer i allra sista linje, har du inte en * t linje 501 00:27:19,525 --> 00:27:21,513 och en * s på linjen? 502 00:27:21,513 --> 00:27:23,004 Har du inte hänvisningen till - 503 00:27:23,004 --> 00:27:24,640 >> Högtalare 1: Ah, en riktigt bra fråga. 504 00:27:24,640 --> 00:27:26,800 Varför inte jag har en * t och en * s? 505 00:27:26,800 --> 00:27:30,340 Eftersom kortfattat, förra veckan, som i vårt swap-funktion, sa jag att när 506 00:27:30,340 --> 00:27:33,350 du har en pekare till medel som du går det som vi gjorde 507 00:27:33,350 --> 00:27:36,590 fysiskt på scenen, var faktiskt använda stjärnan operatören. 508 00:27:36,590 --> 00:27:40,570 >> Det visar sig att detta torg-fäste notation är vad vi kallar syntaktiska 509 00:27:40,570 --> 00:27:44,190 socker, vilket är bara en sexig sätt säger att det är förkortning notation för 510 00:27:44,190 --> 00:27:45,950 exakt vad du beskriver. 511 00:27:45,950 --> 00:27:49,385 Men det är lite mer intuitiv. 512 00:27:49,385 --> 00:27:53,510 Och med risk för att detta verkar mer komplicerat än det behöver vara, 513 00:27:53,510 --> 00:27:56,990 vad som verkligen händer här är följande - 514 00:27:56,990 --> 00:28:01,450 Om jag säger * t som innebär att gå till adressen lagrad i t. 515 00:28:01,450 --> 00:28:04,350 >> Så bokstavligt, om t lagrar adressen till att H 516 00:28:04,350 --> 00:28:07,300 initialt, * t medel gå hit. 517 00:28:07,300 --> 00:28:10,730 Nu, vad gör t bracket 0 betyder? 518 00:28:10,730 --> 00:28:11,560 Exakt samma sak. 519 00:28:11,560 --> 00:28:13,510 Det är bara lite mer användarvänlig vänligt att skriva. 520 00:28:13,510 --> 00:28:14,430 >> Men jag är inte klar ännu. 521 00:28:14,430 --> 00:28:17,800 Jag kan inte bara säga * t får * s. 522 00:28:17,800 --> 00:28:19,440 För vad skulle jag göra då? 523 00:28:19,440 --> 00:28:22,950 Jag skulle kunna sätta h, h, h, h, h hela saken. 524 00:28:22,950 --> 00:28:22,995 Rätt? 525 00:28:22,995 --> 00:28:26,020 >> Eftersom * t är att gå till den adressen it. 526 00:28:26,020 --> 00:28:27,580 Men vi är inne i en loop. 527 00:28:27,580 --> 00:28:32,150 Och vilket värde jag uppräkning, naturligtvis på varje iteration? 528 00:28:32,150 --> 00:28:32,690 i.. 529 00:28:32,690 --> 00:28:34,590 >> Men det finns en möjlighet här, eller hur? 530 00:28:34,590 --> 00:28:37,870 Även om detta känns som det blir lite mer sofistikerad 531 00:28:37,870 --> 00:28:40,730 än torget-fästet notation vi har använt under en längre tid - 532 00:28:40,730 --> 00:28:43,840 låt mig ångra min h förändring där - 533 00:28:43,840 --> 00:28:48,870 även om detta nu bli lite finare, den grundläggande idén, om * t 534 00:28:48,870 --> 00:28:53,630 betyder här och * t är bara gå till adressen it. 535 00:28:53,630 --> 00:28:54,990 >> Men vad var adressen i t? 536 00:28:54,990 --> 00:28:56,850 Numret vi fortsätta använda? 537 00:28:56,850 --> 00:29:00,540 Gilla Ox456, låt oss få det tillbaka bara för diskussionens skull. 538 00:29:00,540 --> 00:29:05,380 Tja, om jag vill komma åt e i t sträng, vill jag bara gå till, 539 00:29:05,380 --> 00:29:06,460 huvudsak 456. 540 00:29:06,460 --> 00:29:09,230 >> Eller snarare, 457. 541 00:29:09,230 --> 00:29:10,590 Jag behöver bara lägga till en. 542 00:29:10,590 --> 00:29:11,790 Men jag kan göra det, eller hur? 543 00:29:11,790 --> 00:29:14,680 Eftersom t, även om jag håller ritning det nu som en pil, det är bara en 544 00:29:14,680 --> 00:29:16,570 nummer, Ox456. 545 00:29:16,570 --> 00:29:21,400 Och om jag lägger till något till det, eller mer allmänhet, om jag lägger jag till att jag kan 546 00:29:21,400 --> 00:29:24,350 faktiskt få precis där jag vill. 547 00:29:24,350 --> 00:29:26,260 Så om jag faktiskt gör det här - 548 00:29:26,260 --> 00:29:28,970 och detta är vad som nu kallas pekararitmetik - 549 00:29:28,970 --> 00:29:30,375 Jag kan ta bort den här raden. 550 00:29:30,375 --> 00:29:33,550 Vilket är, uppriktigt sagt, tror jag klarare och lite mer användarvänlig att läsa. 551 00:29:33,550 --> 00:29:35,970 Men detta är inte mindre korrekt. 552 00:29:35,970 --> 00:29:38,570 >> Denna kodrad nu använder pekararitmetik. 553 00:29:38,570 --> 00:29:40,920 Det säger gå till efter adress - 554 00:29:40,920 --> 00:29:44,670 oavsett starten av t är, som är t plus att jag, som inledningsvis 555 00:29:44,670 --> 00:29:45,730 är 0, vilket är bra. 556 00:29:45,730 --> 00:29:49,280 Eftersom det innebär början på t plus 1, plus två, plus tre, och så vidare. 557 00:29:49,280 --> 00:29:51,030 Och samma deal med er. 558 00:29:51,030 --> 00:29:52,750 >> Så syntaktiska socker för detta. 559 00:29:52,750 --> 00:29:55,900 Men förstå vad som verkligen händer under huven, vill jag hävda, 560 00:29:55,900 --> 00:29:57,410 är faktiskt användbart i och av sig själv. 561 00:29:57,410 --> 00:30:00,620 Eftersom det innebär att nu finns det inte mycket mer magiskt på gång 562 00:30:00,620 --> 00:30:01,620 under huven. 563 00:30:01,620 --> 00:30:03,920 Det kommer inte att bli många fler lager som vi kan skära ner för dig. 564 00:30:03,920 --> 00:30:04,810 Det är c. 565 00:30:04,810 --> 00:30:06,410 Och detta är programmering. 566 00:30:06,410 --> 00:30:08,002 Riktigt bra fråga. 567 00:30:08,002 --> 00:30:11,570 >> Okej, så detta var att buggy Programmet jag syftade på tidigare. 568 00:30:11,570 --> 00:30:12,650 swap var bristfällig. 569 00:30:12,650 --> 00:30:14,070 Om verkade fungera. 570 00:30:14,070 --> 00:30:17,390 Minns att precis som med mjölk och apelsinjuice - som jag började 571 00:30:17,390 --> 00:30:18,660 dricka dagens demonstration. 572 00:30:18,660 --> 00:30:22,220 Så precis som med apelsinjuice och mjölken, vi måste använda ett 573 00:30:22,220 --> 00:30:26,200 temporär variabel, TMP, att hålla en tillfälligt så att vi kunde då 574 00:30:26,200 --> 00:30:28,820 ändra dess värde och sedan uppdatera b.. 575 00:30:28,820 --> 00:30:32,870 >> Men denna funktion, sade vi, eller detta program där denna funktion var 576 00:30:32,870 --> 00:30:35,670 skrivet var fel och brister, varför? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Ja? 579 00:30:39,090 --> 00:30:42,471 >> Publik: [OHÖRBAR]. 580 00:30:42,471 --> 00:30:44,940 >> Högtalare 1: Exakt, när du pendling - 581 00:30:44,940 --> 00:30:47,820 eller mer allmänt, när man ringa flesta någon funktion - 582 00:30:47,820 --> 00:30:51,210 om argumenten för denna funktion är primitiva, så att säga, ints och chars 583 00:30:51,210 --> 00:30:56,740 och dubblar och flottar, saker utan stjärnor, du passerar i en kopia av 584 00:30:56,740 --> 00:30:57,540 argumentet. 585 00:30:57,540 --> 00:31:01,580 Så om x var 1 och y var 2, är en pågående att vara 1 och B kommer att vara 2. 586 00:31:01,580 --> 00:31:05,250 Men de kommer att vara olika bitar av bitar, olika bitar av 587 00:31:05,250 --> 00:31:07,540 minne som råkar vara lagra identiska värden. 588 00:31:07,540 --> 00:31:12,160 >> Så här koden är super perfekt på att byta a och b. 589 00:31:12,160 --> 00:31:13,850 Det är inte bra på att byta - 590 00:31:13,850 --> 00:31:15,290 i förra veckans exempel - 591 00:31:15,290 --> 00:31:16,390 x och y. 592 00:31:16,390 --> 00:31:18,780 Eftersom igen, de är i fel räckvidd. 593 00:31:18,780 --> 00:31:21,310 >> Nu, hur vi ska bestämma detta? 594 00:31:21,310 --> 00:31:23,140 Vi var tvungna att göra funktionen ser lite fulare. 595 00:31:23,140 --> 00:31:25,250 Men återigen, överväga vad Det betyder bara. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> Och faktiskt, låt mig, för konsekvensens skull, ändra en sak så det är identiskt med 598 00:31:31,500 --> 00:31:33,200 vad vi just gjorde. 599 00:31:33,200 --> 00:31:35,690 Som jag nämnde förra veckan, det gör det inte oavsett var den går. 600 00:31:35,690 --> 00:31:38,120 I själva verket, typiskt du skulle sätta stjärnan bredvid variabelnamnet. 601 00:31:38,120 --> 00:31:40,750 Men jag tror att det skulle vara lite lättare att överväga * bredvid 602 00:31:40,750 --> 00:31:44,910 datatyp som innebär att det är en pekare till en int i det här fallet. 603 00:31:44,910 --> 00:31:46,270 >> Så vad gör jag här? 604 00:31:46,270 --> 00:31:49,590 Jag säger inte ger mig en int följt av ytterligare int, 605 00:31:49,590 --> 00:31:50,810 kalla dem a och b. 606 00:31:50,810 --> 00:31:52,460 Ge mig adressen till en int. 607 00:31:52,460 --> 00:31:53,960 Ge mig adressen till en annan int. 608 00:31:53,960 --> 00:31:56,330 Ring dessa adresser a och b. 609 00:31:56,330 --> 00:32:00,860 >> Och sedan använda * notation ner nedan, gå till vart och ett av dessa adresser 610 00:32:00,860 --> 00:32:05,290 efter behov för att antingen få eller ställa in dess värde. 611 00:32:05,290 --> 00:32:07,400 Men det finns ett undantag här. 612 00:32:07,400 --> 00:32:11,130 Varför har jag inte en * bredvid tmp? 613 00:32:11,130 --> 00:32:15,070 Varför gör jag inte det här, till exempel? 614 00:32:15,070 --> 00:32:19,370 Det känns som jag ska bara gå all ut och korrigera det hela. 615 00:32:19,370 --> 00:32:19,752 Yeah? 616 00:32:19,752 --> 00:32:21,002 >> Publik: [OHÖRBAR]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> Högtalare 1: Jag har inte deklarerats tmp som en sträng. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Så detta skulle förklara, i detta fall, en tmp vara adressen till en int. 621 00:32:34,950 --> 00:32:37,380 Men det är inte riktigt vad jag vill, för ett par anledningar. 622 00:32:37,380 --> 00:32:38,616 >> Målgrupp: Du vill inte byta dem. 623 00:32:38,616 --> 00:32:41,800 >> Högtalare 1: Exakt, jag vill inte byta något med tmp. TMP är bara 624 00:32:41,800 --> 00:32:42,790 vecka-en grejer. 625 00:32:42,790 --> 00:32:45,150 Allt jag vill ha är en variabel att lagra vissa nummer. 626 00:32:45,150 --> 00:32:47,330 Jag bryr mig inte ens om adresser i detta ögonblick. 627 00:32:47,330 --> 00:32:50,530 >> Jag behöver bara 32 bitar så att lagra en int. 628 00:32:50,530 --> 00:32:56,690 Och jag vill sätta in dessa 32 bitar vad är inte i ett, så att säga, men 629 00:32:56,690 --> 00:33:01,260 vad som står på en, bara för att vara mer exakt. 630 00:33:01,260 --> 00:33:06,420 För om en är en adress, * a innebär gå dit och få värdet 1. 631 00:33:06,420 --> 00:33:10,560 Till exempel, i förra veckans exempel eller i B: s fall får värdet 2. 632 00:33:10,560 --> 00:33:11,750 >> Så vad som verkligen händer? 633 00:33:11,750 --> 00:33:15,070 Låt mig dra en bild här som kommer bara retas isär en del av idag. 634 00:33:15,070 --> 00:33:18,580 Men detta kommer att fortsätta att synas under ganska lång tid. 635 00:33:18,580 --> 00:33:22,430 >> Detta, hävdar jag, är vad din dators minne ser ut när du kör en 636 00:33:22,430 --> 00:33:24,060 program, alla program. 637 00:33:24,060 --> 00:33:28,340 När du kör ett program i den absoluta toppen av datorns RAM-minne - så tänk på 638 00:33:28,340 --> 00:33:33,530 denna rektangel, verkligen, som din datorns RAM eller minne, alla 101 639 00:33:33,530 --> 00:33:36,920 miljard byte av det, alla två miljardfolk byte, alla två gigabyte det, 640 00:33:36,920 --> 00:33:39,910 oavsett den mängd du har är, låt oss göra det som en rektangel. 641 00:33:39,910 --> 00:33:43,260 Och jag hävdar att när du kör ett program som Microsoft Word eller Chrome 642 00:33:43,260 --> 00:33:49,220 eller nåt sånt, de bitar som Microsoft eller att Google skrev - 643 00:33:49,220 --> 00:33:50,910 i fallen med dessa program - 644 00:33:50,910 --> 00:33:54,490 laddas i datorns minne där de kan genomföras mer 645 00:33:54,490 --> 00:33:57,520 snabbt och matas in i CPU, som är hjärnan i datorn. 646 00:33:57,520 --> 00:34:00,940 >> Och i TAM de är lagrade på mycket toppen av ditt program, så att säga. 647 00:34:00,940 --> 00:34:03,300 Med andra ord, om detta är en bit av minne, när du dubbelklicka på 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, bitarna kommer bort hårddisken. 649 00:34:05,740 --> 00:34:06,680 De få laddas in i RAM-minnet. 650 00:34:06,680 --> 00:34:10,330 Och vi kommer att stoppa upp dem i toppen av denna rektangel konceptuellt. 651 00:34:10,330 --> 00:34:13,010 >> Tja, är resten av ditt minne användas för olika saker. 652 00:34:13,010 --> 00:34:16,460 Längst upp ser du initiera uppgifter och avinitiera data. 653 00:34:16,460 --> 00:34:20,500 Detta har att göra, för det mesta, med konstanter eller globala variabler 654 00:34:20,500 --> 00:34:21,340 som har värden. 655 00:34:21,340 --> 00:34:22,980 Men mer om dem en annan gång. 656 00:34:22,980 --> 00:34:25,150 >> Då har du högen, vilket Vi ska återkomma till. 657 00:34:25,150 --> 00:34:28,420 Men i botten är den del som är särskilt relevant just nu. 658 00:34:28,420 --> 00:34:30,210 Det är den så kallade stack. 659 00:34:30,210 --> 00:34:33,850 Så precis som i de flesta någon D Hall här på campus, har du dessa brickor som 660 00:34:33,850 --> 00:34:37,210 bara stapla ovanpå varandra på vilka du kan få mat och allt. 661 00:34:37,210 --> 00:34:40,139 Stapeln i ett datorsystem är mycket lika. 662 00:34:40,139 --> 00:34:42,679 Utom medan facket, som vi använder i matsalen, naturligtvis, menas 663 00:34:42,679 --> 00:34:45,710 att bära saker facken eller ramarna - 664 00:34:45,710 --> 00:34:49,469 som vi kallar dem - i en dators minne används för att hålla 665 00:34:49,469 --> 00:34:51,610 variabler och värden. 666 00:34:51,610 --> 00:34:53,929 >> Så vad går egentligen på under huven? 667 00:34:53,929 --> 00:34:55,820 Nåväl, låt mig vända över till skärmen här. 668 00:34:55,820 --> 00:34:58,370 Och låt oss bara fokusera på nedre del för en stund. 669 00:34:58,370 --> 00:35:02,770 Om detta är den nedre delen av min datorns minne visar det sig när jag 670 00:35:02,770 --> 00:35:05,350 anropa funktionen main - vilket händer, ärligt talat, 671 00:35:05,350 --> 00:35:06,950 automatiskt för mig - 672 00:35:06,950 --> 00:35:10,510 Jag får en bit av minnet på djupet av mitt RAM så att säga. 673 00:35:10,510 --> 00:35:13,390 Och det är där huvud är lokala variabler går. 674 00:35:13,390 --> 00:35:16,770 Det är där argc och argv kanske gå, och alla variabler I 675 00:35:16,770 --> 00:35:18,170 deklarera inuti main. 676 00:35:18,170 --> 00:35:20,260 De hamnar i botten av datorns RAM. 677 00:35:20,260 --> 00:35:25,040 >> Antag nu att huvudsakliga Anropar en funktion som swap, som det gjorde förra veckan? 678 00:35:25,040 --> 00:35:30,620 Nåväl, satte vi i huvudsak ett nytt magasin, en ny ram, på min bit av minnet. 679 00:35:30,620 --> 00:35:34,160 Och jag kommer att beskriva detta som hör till swap-funktionen. 680 00:35:34,160 --> 00:35:35,770 >> Vad är nu inne i swap? 681 00:35:35,770 --> 00:35:39,240 Tja, baserat på förra veckans program och den vi såg bara ett utdrag från, 682 00:35:39,240 --> 00:35:46,590 insidan av swap s ram, eller på swapens fack, vad variabler? 683 00:35:46,590 --> 00:35:47,970 Tja, a och b. 684 00:35:47,970 --> 00:35:51,850 Eftersom de var dess lokala argument, plus en tredje, tmp. 685 00:35:51,850 --> 00:35:54,470 Så egentligen, kunde jag dra denna lite mer rent. 686 00:35:54,470 --> 00:35:56,680 Låt mig gå vidare och ångra etiketten. 687 00:35:56,680 --> 00:35:58,520 Och låt mig påstå att du vet vad? 688 00:35:58,520 --> 00:36:00,560 >> en är förmodligen kommer att hamna här. 689 00:36:00,560 --> 00:36:02,160 B kommer att hamna här. 690 00:36:02,160 --> 00:36:03,810 Och TMP kommer att hamna här. 691 00:36:03,810 --> 00:36:05,160 Nu, den beställning kanske vara lite annorlunda. 692 00:36:05,160 --> 00:36:06,840 Men begreppsmässigt detta är tanken. 693 00:36:06,840 --> 00:36:11,490 >> Och precis kollektivt, är detta vad vi kallar swapens ram, eller 694 00:36:11,490 --> 00:36:12,136 matsalen facket. 695 00:36:12,136 --> 00:36:13,150 Och samma deal med huvud. 696 00:36:13,150 --> 00:36:14,040 Men jag kommer inte att rita det. 697 00:36:14,040 --> 00:36:17,810 Men det är där argc och argv och eventuella dess lokala variabler som x och y 698 00:36:17,810 --> 00:36:18,940 kan vara så bra. 699 00:36:18,940 --> 00:36:22,170 >> Så nu överväga vad som verkligen händer när du ringer swap. 700 00:36:22,170 --> 00:36:26,370 När du ringer swap, köra kod som detta, du går in, i 701 00:36:26,370 --> 00:36:30,670 buggy version, a och b som kopior av x och y. 702 00:36:30,670 --> 00:36:34,300 Så om jag drar nu detta på skärmen - 703 00:36:34,300 --> 00:36:36,700 fick bli bättre på detta - 704 00:36:36,700 --> 00:36:40,850 så historien jag berättade för mig själv var i denna barnvagn versionen, när vi 705 00:36:40,850 --> 00:36:46,130 pendling passerar bokstavligen a och b som heltal, vad händer egentligen? 706 00:36:46,130 --> 00:36:48,250 >> Tja, vad som verkligen händer är här. 707 00:36:48,250 --> 00:36:52,850 Låt mig gå vidare och ångra bara att rensa upp lite utrymme här. 708 00:36:52,850 --> 00:36:54,720 Så det här är min dators minne. 709 00:36:54,720 --> 00:36:57,510 >> Så om jag har, till exempel - 710 00:36:57,510 --> 00:36:58,910 faktiskt Låt oss göra det här sättet - 711 00:36:58,910 --> 00:37:02,690 om jag hävdar att det är x, lagring värdet 1 precis som förra veckan. 712 00:37:02,690 --> 00:37:05,930 Och detta är y, lagra värdet 2 gillar bara förra veckan. 713 00:37:05,930 --> 00:37:11,370 Och detta är viktigaste, när jag pendling, därigenom ge mig tillgång till en och 714 00:37:11,370 --> 00:37:15,150 b och TMP, kommer jag att hävda att detta är en och detta är ett. 715 00:37:15,150 --> 00:37:16,080 >> Detta är b.. 716 00:37:16,080 --> 00:37:17,010 Detta är 2. 717 00:37:17,010 --> 00:37:18,370 Detta kallas TMP. 718 00:37:18,370 --> 00:37:23,360 >> Och inledningsvis, har det vissa skräp värde tills jag förvara faktiskt i det, 719 00:37:23,360 --> 00:37:24,450 vilket är ett. 720 00:37:24,450 --> 00:37:28,320 Då ska jag gå vidare och ändra en vara vad? 721 00:37:28,320 --> 00:37:29,720 B: s värde. 722 00:37:29,720 --> 00:37:31,980 >> Och så nu har jag två här. 723 00:37:31,980 --> 00:37:34,050 Och då sa vi b får tmp. 724 00:37:34,050 --> 00:37:37,670 Återigen, precis som en sundhetskontroll, den tredje kodrad här är helt enkelt detta 725 00:37:37,670 --> 00:37:39,440 en, blir b tmp. 726 00:37:39,440 --> 00:37:41,730 >> Och så slutligen, vad gör jag? 727 00:37:41,730 --> 00:37:46,800 Jag går vidare och ändra b för att vara vad värdet av tmp är, vilket är 1. 728 00:37:46,800 --> 00:37:48,390 Jag rör inte tmp igen. 729 00:37:48,390 --> 00:37:54,100 >> Men nu är problemet så snart som swap avkastning, eftersom det inte är handing 730 00:37:54,100 --> 00:37:57,540 backa något värde, det finns ingen återvändo uttalande explicit i det. 731 00:37:57,540 --> 00:37:59,080 Vad händer egentligen? 732 00:37:59,080 --> 00:38:03,480 Tja, i huvudsak allt detta minne - 733 00:38:03,480 --> 00:38:07,410 OK, uppenbarligen suddgummi gillar bara ett finger i taget - 734 00:38:07,410 --> 00:38:08,180 bara försvinner. 735 00:38:08,180 --> 00:38:10,070 >> Nu i verkligheten är det inte kommer någonstans. 736 00:38:10,070 --> 00:38:11,810 Men du kan tänka på det nu som frågetecken. 737 00:38:11,810 --> 00:38:14,040 Eftersom det inte längre faktiskt används. 738 00:38:14,040 --> 00:38:17,470 Och ingenting görs med dessa värden. 739 00:38:17,470 --> 00:38:21,920 >> Så i fallet med den gröna versionen av denna kod, är det istället vara 740 00:38:21,920 --> 00:38:24,640 övergått i swap? 741 00:38:24,640 --> 00:38:25,770 Så behandlar. 742 00:38:25,770 --> 00:38:28,520 Så adress av x och adressen till y. 743 00:38:28,520 --> 00:38:35,790 Så om vi åter berätta historien en sista tid, och jag drar faktiskt swap igen, 744 00:38:35,790 --> 00:38:44,620 men med pekare, vilket det, detta vara b, och detta är tmp, vilken är 745 00:38:44,620 --> 00:38:49,080 faktiskt lagras i en i denna gröna version av min kod där jag passerar 746 00:38:49,080 --> 00:38:52,110 i adresser? 747 00:38:52,110 --> 00:38:53,780 >> Det kommer att vara en pekare till x. 748 00:38:53,780 --> 00:38:54,890 Så jag kunde rita en pil. 749 00:38:54,890 --> 00:38:57,310 Men låt oss använda samma godtyckliga exempel som tidigare. 750 00:38:57,310 --> 00:39:01,220 Låt oss säga att det är något liknande Ox123. 751 00:39:01,220 --> 00:39:04,970 Och detta kommer att bli Ox127 eftersom det är fyra bytes bort eftersom det är en 752 00:39:04,970 --> 00:39:07,370 int, så Ox127. 753 00:39:07,370 --> 00:39:09,080 >> Och återigen, jag tar några friheter med siffrorna. 754 00:39:09,080 --> 00:39:11,430 De är mycket mindre än de skulle faktiskt vara och i en annan ordning. 755 00:39:11,430 --> 00:39:14,350 Men det är hur bilden är nu annorlunda. 756 00:39:14,350 --> 00:39:19,060 >> Men när jag använder denna gröna koden och jag får int tmp * a. 757 00:39:19,060 --> 00:39:25,010 * Ett medel för att göra följande, ta behandla som finns i en och gå till det, 758 00:39:25,010 --> 00:39:26,190 vilket är ett. 759 00:39:26,190 --> 00:39:28,480 Och det är vad jag sedan lägga i tmp. 760 00:39:28,480 --> 00:39:32,480 Under tiden i nästa kodrad här, * a blir b, vad betyder det? 761 00:39:32,480 --> 00:39:36,910 >> Tja, * a, så gå här blir * b, vilket innebär att åka dit. 762 00:39:36,910 --> 00:39:39,310 Och det innebär att sätta värdet till det. 763 00:39:39,310 --> 00:39:43,670 Slutligen, den sista raden i koden sade bara * b får tmp. 764 00:39:43,670 --> 00:39:48,900 >> Så B säger gå dit och skriva över den med tmp som, i det här fallet, kommer 765 00:39:48,900 --> 00:39:51,520 att vara, igen, en. 766 00:39:51,520 --> 00:39:54,920 Och det är därför den gröna versionen av vår kod fungerar, medan den röda 767 00:39:54,920 --> 00:39:56,010 version gjorde aldrig. 768 00:39:56,010 --> 00:39:59,020 Det hela handlar bara ner till hur minne hanteras och där det är 769 00:39:59,020 --> 00:40:02,580 faktiskt placerats i din datorns RAM-minne. 770 00:40:02,580 --> 00:40:07,270 Och för nu, det är en av de saker att stapeln används för. 771 00:40:07,270 --> 00:40:09,225 >> Frågor på layouten? 772 00:40:09,225 --> 00:40:10,380 På pekare? 773 00:40:10,380 --> 00:40:11,630 Eller om swap? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Okej, så malloc, återkallelse, gjorde något liknande. 776 00:40:17,043 --> 00:40:18,260 Detta var en super enkelt exempel. 777 00:40:18,260 --> 00:40:20,550 Och det var det som Binky introducerade oss till, om än ganska 778 00:40:20,550 --> 00:40:21,870 snabbt, vid slutet av klassen. 779 00:40:21,870 --> 00:40:24,480 Helvete, där vi gå igen. 780 00:40:24,480 --> 00:40:28,780 >> Så minns att detta var det exempel som Binky introducerade oss till, om än 781 00:40:28,780 --> 00:40:30,360 något snabbt i slutet av klassen. 782 00:40:30,360 --> 00:40:33,640 Och här har vi använt malloc verkligen för andra gången. 783 00:40:33,640 --> 00:40:37,330 Eftersom den första gången vi använde det för att skapa tillräckligt med RAM, allokera tillräckligt med RAM 784 00:40:37,330 --> 00:40:38,340 att lagra en sträng. 785 00:40:38,340 --> 00:40:40,250 >> Denna gång hålls Binky det enkelt. 786 00:40:40,250 --> 00:40:42,465 Så det är att lagra bara en int, tydligen. 787 00:40:42,465 --> 00:40:43,510 Och det är helt bra. 788 00:40:43,510 --> 00:40:46,560 Det är lite konstigt, ärligt talat, att använda malloc att allokera en int. 789 00:40:46,560 --> 00:40:50,650 Men poängen med Nicks claymation var egentligen bara berätta historien om vad 790 00:40:50,650 --> 00:40:53,830 händer eller inte händer när du misshandla minne. 791 00:40:53,830 --> 00:40:56,520 >> Så i detta fall, det här programmet gjorde ett par saker. 792 00:40:56,520 --> 00:41:01,580 I det första fallet här, förklarar det en pekare som heter x till en int. 793 00:41:01,580 --> 00:41:04,480 Det förklarar sedan en pekare kallas y till en int. 794 00:41:04,480 --> 00:41:06,150 Den lagrar sedan i x, vad? 795 00:41:06,150 --> 00:41:07,110 Någon annan nu. 796 00:41:07,110 --> 00:41:09,685 Vad får lagras i x enligt den tredje raden i det här programmet? 797 00:41:09,685 --> 00:41:12,380 >> Publik: [OHÖRBAR]. 798 00:41:12,380 --> 00:41:14,130 >> Högtalare 1: Tja, inte riktigt bytes, per säga. 799 00:41:14,130 --> 00:41:16,760 Vara mer exakt nu. 800 00:41:16,760 --> 00:41:18,325 Vad får lagras i x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 En adress, jag tror jag hörde det. 803 00:41:22,060 --> 00:41:23,570 >> Så vad betyder återvänder malloc? 804 00:41:23,570 --> 00:41:26,030 malloc beteendemässigt allokerar en bit av minnet. 805 00:41:26,030 --> 00:41:27,850 Men hur ger det dig tillgång till det? 806 00:41:27,850 --> 00:41:29,460 Den returnerar vad? 807 00:41:29,460 --> 00:41:32,000 Adressen för den första byten i bit av minnet. 808 00:41:32,000 --> 00:41:33,020 >> Nu är det super enkelt. 809 00:41:33,020 --> 00:41:35,380 Det är bara ett byte, vilket innebär att itu vi får tillbaka är 810 00:41:35,380 --> 00:41:37,300 adress på det hela. 811 00:41:37,300 --> 00:41:42,070 Så lagras i x då är adressen av denna bit av minnet. 812 00:41:42,070 --> 00:41:43,400 Under tiden, vad händer nu? 813 00:41:43,400 --> 00:41:45,890 Så egentligen, låt oss gå vidare och dra ut det riktigt snabbt. 814 00:41:45,890 --> 00:41:52,490 >> Så om vi går över till skärmen här och vi spelar här ut int * x och int * y 815 00:41:52,490 --> 00:41:53,740 kommer att göra det för mig? 816 00:41:53,740 --> 00:41:58,280 Jag hävdar att det bara kommer att göra något som detta och kalla det x, och 817 00:41:58,280 --> 00:42:00,010 detta och kallar det y. 818 00:42:00,010 --> 00:42:03,110 Under tiden är den tredje kodrad kommer att fördela storleken på en int, 819 00:42:03,110 --> 00:42:06,160 som råkar vara - ledsen om jag sa en innan jag menade en int - 820 00:42:06,160 --> 00:42:08,280 fyra byte på en vanlig dator. 821 00:42:08,280 --> 00:42:09,720 Åtminstone med CS50 apparaten. 822 00:42:09,720 --> 00:42:11,490 >> Så detta kommer att fördela det, vem vet? 823 00:42:11,490 --> 00:42:12,800 Någonstans här ute. 824 00:42:12,800 --> 00:42:15,780 Och detta lagras vid vissa adress Ox, vem vet? 825 00:42:15,780 --> 00:42:18,330 Men vad som kommer att få tillbaka är den adressen. 826 00:42:18,330 --> 00:42:22,270 Men vi ska dra denna bildmässigt som bara en pil som. 827 00:42:22,270 --> 00:42:25,430 >> Nu i nästa rad * x blir 42. 828 00:42:25,430 --> 00:42:29,400 Vad betyder * x innebär i lekmannaspråk? 829 00:42:29,400 --> 00:42:30,040 Bara åka dit. 830 00:42:30,040 --> 00:42:30,960 Gå till denna adress. 831 00:42:30,960 --> 00:42:35,900 Eller med andra ord, följ pil och satte 42 där. 832 00:42:35,900 --> 00:42:38,140 Men sedan hände något dåligt till Binky, rätt? 833 00:42:38,140 --> 00:42:43,950 >> Minns att linjen fem här, blir * y 13, ja ett otursnummer, 834 00:42:43,950 --> 00:42:44,760 gjorde vad för oss? 835 00:42:44,760 --> 00:42:47,320 Tja, * y medel gå dit. 836 00:42:47,320 --> 00:42:50,460 Tja, har detta inte fått ett värde ändå, eller hur? 837 00:42:50,460 --> 00:42:54,090 Koden har inte y är initieras till någonting. 838 00:42:54,090 --> 00:42:56,120 Vi hade x initieras till en adress. 839 00:42:56,120 --> 00:42:57,640 Men y förklarades uppe. 840 00:42:57,640 --> 00:43:00,250 Men sedan ett semikolon, inget värde var faktiskt sätta i det. 841 00:43:00,250 --> 00:43:02,330 Så det är rättvist att kalla detta ett skräp värde. 842 00:43:02,330 --> 00:43:03,430 Vem vet vad som finns där? 843 00:43:03,430 --> 00:43:07,160 Det är resterna av bitarna som använts av några tidigare kodrad i 844 00:43:07,160 --> 00:43:08,300 mitt program. 845 00:43:08,300 --> 00:43:13,250 >> Så om jag säger gå dit, detta är som, Jag har ingen aning om var den här pilen är 846 00:43:13,250 --> 00:43:14,490 kommer att hamna. 847 00:43:14,490 --> 00:43:17,720 Och det är då du vanligtvis få en segmentering fel. 848 00:43:17,720 --> 00:43:22,430 Om du av misstag dereferens, så att tala, eller gå till en adress som inte är 849 00:43:22,430 --> 00:43:25,400 faktiskt en behörig adress, dåliga saker hända. 850 00:43:25,400 --> 00:43:27,550 >> Och det är precis vad som hände att tänka Binky. 851 00:43:27,550 --> 00:43:31,060 Så minns att berättelsen att Nick var berättar här var samma idé som vad 852 00:43:31,060 --> 00:43:34,050 Jag har ritat med illusionen av krita på tavlan där. 853 00:43:34,050 --> 00:43:35,960 X och y är deklarerade. 854 00:43:35,960 --> 00:43:39,690 >> Då vi anslog storlek en int och lagras den i x. 855 00:43:39,690 --> 00:43:42,130 Sedan nästa rad vi gjorde * x. 856 00:43:42,130 --> 00:43:46,070 Detta var Nicks trollspö av dereferencing. 857 00:43:46,070 --> 00:43:49,780 Det satte 42 i minnet påpekats av x. 858 00:43:49,780 --> 00:43:51,600 >> Men det är där saker och ting gick fruktansvärt fel. 859 00:43:51,600 --> 00:43:51,820 Rätt? 860 00:43:51,820 --> 00:43:53,550 Vi försökte dereference y. 861 00:43:53,550 --> 00:43:55,620 Men y hade några falska värde, rätt? 862 00:43:55,620 --> 00:43:57,720 >> Att pilen i nedre vänstra hörn, är inte 863 00:43:57,720 --> 00:43:58,950 faktiskt pekar på någonting. 864 00:43:58,950 --> 00:44:01,520 Det är typ att göra vad jag gjorde här på tavlan. 865 00:44:01,520 --> 00:44:05,900 Så dåliga saker hända, segmentering fel, eller Binky fel, i det här fallet. 866 00:44:05,900 --> 00:44:10,800 >> Men om vi fixar så att genom att göra x får y hur ser historien förändras? 867 00:44:10,800 --> 00:44:15,760 Tja, om jag gör x blir y, det är effektivt detsamma som att säga 868 00:44:15,760 --> 00:44:19,235 vad det är, Ox-något kommer att vara det samma här, 869 00:44:19,235 --> 00:44:20,080 Ox-någonting. 870 00:44:20,080 --> 00:44:22,970 Eller bildmässigt vi ska rita en pil. 871 00:44:22,970 --> 00:44:25,530 >> Så här på brädan med Binky, med nästa rad av 872 00:44:25,530 --> 00:44:28,350 kod, betyder * y åka dit. 873 00:44:28,350 --> 00:44:29,400 Var finns det? 874 00:44:29,400 --> 00:44:30,820 Det betyder över här. 875 00:44:30,820 --> 00:44:36,050 >> Och när vi uppdaterar att vara 13 det handlar bara gå och 876 00:44:36,050 --> 00:44:39,470 skriver 13 här nu. 877 00:44:39,470 --> 00:44:44,130 Så kanske inte helt enkelt vid första anblicken. 878 00:44:44,130 --> 00:44:47,740 Men för att sammanfatta och att använda samma jargong som Binky använde här, så 879 00:44:47,740 --> 00:44:50,485 de två första fördela pekare, x och y, men inte de pointees. 880 00:44:50,485 --> 00:44:54,750 Och pointees är inte en allmänt använd term. 881 00:44:54,750 --> 00:44:56,120 Men pekare är absolut. 882 00:44:56,120 --> 00:44:59,200 Men det är vad som pekade på i Binky s nomenklatur. 883 00:44:59,200 --> 00:45:01,660 >> Denna nästa rad, naturligtvis, allokerar en int pointee. 884 00:45:01,660 --> 00:45:04,840 Så en bit av minnet - så jag drog över på den högra sidan där - och set 885 00:45:04,840 --> 00:45:06,470 x är lika med att peka på den. 886 00:45:06,470 --> 00:45:11,350 Detta dereferences x för att lagra 42 i minnet att den pekar på. 887 00:45:11,350 --> 00:45:13,380 Och sedan detta, naturligtvis, var en dålig sak. 888 00:45:13,380 --> 00:45:15,600 Eftersom y inte pekade på något ännu. 889 00:45:15,600 --> 00:45:16,530 Detta fixar det. 890 00:45:16,530 --> 00:45:18,240 Så detta är fortfarande buggig program. 891 00:45:18,240 --> 00:45:21,580 Bara för att vi blåser genom koden rad för rad och säga, jaha, 892 00:45:21,580 --> 00:45:22,690 låt det krascha det. 893 00:45:22,690 --> 00:45:23,420 Det är en dålig sak. 894 00:45:23,420 --> 00:45:26,790 Oddsen är att programmet bara kommer att avbryta helt och hållet på den linjen. 895 00:45:26,790 --> 00:45:30,550 Men om du skulle ta bort kraschade linje och ersätta den med de två sista 896 00:45:30,550 --> 00:45:32,470 linjer där du tilldelar - 897 00:45:32,470 --> 00:45:35,310 använda pekare uppdrag - y att peka på x som punkt t. 898 00:45:35,310 --> 00:45:39,280 Och då du avreferera y på ett mycket säkert sätt. 899 00:45:39,280 --> 00:45:41,520 >> Så var lämnar det oss? 900 00:45:41,520 --> 00:45:45,350 Tja, visar sig att under huven i CS50 biblioteket, pekare är 901 00:45:45,350 --> 00:45:46,320 används genomgående. 902 00:45:46,320 --> 00:45:48,910 Och vi ska faktiskt börja skal tillbaka det lagret innan länge. 903 00:45:48,910 --> 00:45:51,740 Men det visar också ett uttryck som några av er kanske känner till, 904 00:45:51,740 --> 00:45:54,580 särskilt de mer bekväm, är faktiskt som en mycket populär 905 00:45:54,580 --> 00:45:56,390 webbplats, eller stack overflow, dessa dagar. 906 00:45:56,390 --> 00:45:58,720 >> Men detta har faktiskt mycket teknisk mening. 907 00:45:58,720 --> 00:46:00,160 Vi vet nu vad en stapel är. 908 00:46:00,160 --> 00:46:02,550 Det är som en stapel av brickor inne i en matsal. 909 00:46:02,550 --> 00:46:05,140 >> Eller insidan av datorns minne Dess dessa ramar 910 00:46:05,140 --> 00:46:06,900 som används av funktioner. 911 00:46:06,900 --> 00:46:10,760 Jo, visar det sig att på grund av att mycket enkel implementering av 912 00:46:10,760 --> 00:46:14,970 minne och ramarna på den så kallade stack, kan du faktiskt ta kontroll 913 00:46:14,970 --> 00:46:17,050 av ett datorsystem ganska lätt. 914 00:46:17,050 --> 00:46:22,180 Du kan hacka in i ett system om människor som vi inte har skrivit vår kod 915 00:46:22,180 --> 00:46:23,300 särskilt väl. 916 00:46:23,300 --> 00:46:26,670 >> Om folk gillar oss använder bitar av minne eller använda matriser - 917 00:46:26,670 --> 00:46:27,810 ännu oftare - 918 00:46:27,810 --> 00:46:31,800 men ibland glömmer att kontrollera gränserna för vår array som du kanske 919 00:46:31,800 --> 00:46:38,470 har själv ibland, och itererad alldeles för långt förbi slutet en array. 920 00:46:38,470 --> 00:46:40,520 I bästa fall, ditt program kanske bara krascha. 921 00:46:40,520 --> 00:46:42,280 Segmentering fel, typ för pinsamt. 922 00:46:42,280 --> 00:46:45,480 Inte bra, men det är inte nödvändigtvis en enormt dålig sak. 923 00:46:45,480 --> 00:46:49,480 >> Men om ditt program är faktiskt på riktigt användarnas datorer, om det är igång 924 00:46:49,480 --> 00:46:53,070 På en webbplats som verkliga slumpmässiga människor på internet slår, uthyrning 925 00:46:53,070 --> 00:46:56,690 människor inducerar dåliga saker om din kod är allmänhet inte bra eftersom 926 00:46:56,690 --> 00:46:59,930 det innebär en möjlighet att ta kontroll över datorn. 927 00:46:59,930 --> 00:47:01,350 Och detta kommer att se ut lite kryptiskt. 928 00:47:01,350 --> 00:47:04,570 Men jag trodde att jag skulle skrämma er med detta sista exemplet här. 929 00:47:04,570 --> 00:47:05,650 >> Här är ett exempel på kod. 930 00:47:05,650 --> 00:47:07,370 Och det finns en bra Wikipedia artikel som går igenom 931 00:47:07,370 --> 00:47:08,530 detta mer i detalj. 932 00:47:08,530 --> 00:47:13,890 Jag har huvud på botten ringer foo, passerar i argv av 1. 933 00:47:13,890 --> 00:47:15,750 Och det är bara så att du kan köra programmet och skicka 934 00:47:15,750 --> 00:47:17,080 en godtycklig inmatning. 935 00:47:17,080 --> 00:47:20,180 >> Och sedan foo förklaras uppe som att acceptera en sträng, eller mer 936 00:47:20,180 --> 00:47:21,700 exakt, en char *. 937 00:47:21,700 --> 00:47:23,860 Den förklarar därefter en rad tecken. 938 00:47:23,860 --> 00:47:27,130 Kalla det en buffert, mer allmänt, av storlek 12. 939 00:47:27,130 --> 00:47:30,900 Så 12 tecken får plats inuti av denna grupp som kallas c. 940 00:47:30,900 --> 00:47:33,510 >> Och då använder denna nya funktion, som är nytt, men inte svårt att 941 00:47:33,510 --> 00:47:34,930 förstå, minneskopia. 942 00:47:34,930 --> 00:47:39,290 Den kopierar minnet från baren, vilket var variabeln förflutna n, oavsett 943 00:47:39,290 --> 00:47:42,080 användaren har skrivit in argv 1 i c. 944 00:47:42,080 --> 00:47:43,090 Hur många byte? 945 00:47:43,090 --> 00:47:44,260 Strängen längd bar. 946 00:47:44,260 --> 00:47:48,380 >> Så med andra ord, om användaren skriver in h-e-l-l-o enter, stränglängden 947 00:47:48,380 --> 00:47:49,260 av hej är fem. 948 00:47:49,260 --> 00:47:52,790 Så fem av dessa bytes kommer att få kopieras in i arrayen kallas C, vilket 949 00:47:52,790 --> 00:47:54,110 är av storlek 12. 950 00:47:54,110 --> 00:47:58,710 Men vad användaren skriver in en mycket längre ord som är 13 tecken eller 14 951 00:47:58,710 --> 00:48:01,250 tecken eller 100 tecken eller mer? 952 00:48:01,250 --> 00:48:02,660 >> Där kommer de att gå? 953 00:48:02,660 --> 00:48:06,090 Nåväl, denna ram, som fack i matsalen stack, 954 00:48:06,090 --> 00:48:06,930 de kommer att åka dit. 955 00:48:06,930 --> 00:48:10,080 Och det är bara att börja skriva andra saker som redan 956 00:48:10,080 --> 00:48:12,880 på den stacken, överfyllda stapeln, så att säga. 957 00:48:12,880 --> 00:48:14,780 >> Så bildmässigt, tänk på det här sättet. 958 00:48:14,780 --> 00:48:17,970 Detta är bara en färgstark version av den bild vi har dragit. 959 00:48:17,970 --> 00:48:20,060 Längst ner, låt oss säga, är främsta. 960 00:48:20,060 --> 00:48:24,690 Och på toppen, vad du ser nu är ramen, färgkodade nu, för en 961 00:48:24,690 --> 00:48:26,090 Funktionen heter foo. 962 00:48:26,090 --> 00:48:30,170 Men vad som är intressant här om foo är att här är dess ram. 963 00:48:30,170 --> 00:48:32,860 Så det har dragit precis som jag gjorde men i ljusblått. 964 00:48:32,860 --> 00:48:35,220 Och nu det är här c konsol 0 går. 965 00:48:35,220 --> 00:48:37,410 Och det är där c fäste 11 kommer att hamna. 966 00:48:37,410 --> 00:48:39,670 >> Med andra ord, det händer att representeras som en kvadrat. 967 00:48:39,670 --> 00:48:42,320 Men om du håller bara plopping bytes ned - eller tecken - de kommer att sluta 968 00:48:42,320 --> 00:48:46,070 upp vid positionen 0 hela vägen upp till 11 eftersom det är 0 indexerade. 969 00:48:46,070 --> 00:48:49,170 >> Men där är det 13: e tecknet kommer att hamna? 970 00:48:49,170 --> 00:48:50,310 Var är den 14: e? 971 00:48:50,310 --> 00:48:52,430 Var är den 50: e tecknet kommer att hamna? 972 00:48:52,430 --> 00:48:54,070 >> Det kommer att fortsätta nedåt. 973 00:48:54,070 --> 00:48:57,350 För även om vi har dragit bild med stapeln växer upp, de 974 00:48:57,350 --> 00:48:59,920 adresser, visar det sig, att gå från små adresser, liten 975 00:48:59,920 --> 00:49:01,830 pekare, till stora adresser. 976 00:49:01,830 --> 00:49:03,540 Så det håller bara gå upp och upp. 977 00:49:03,540 --> 00:49:05,660 >> Så om användaren skriver in hej, det är bra. 978 00:49:05,660 --> 00:49:08,650 Ingen bugg, inga problem, allas säker. 979 00:49:08,650 --> 00:49:11,940 Men om användaren skriver in vad vi ska ringa kontradiktoriskt kod, representerade 980 00:49:11,940 --> 00:49:16,040 allmänt som en, attack, attack, attack, attack, vad kan hända? 981 00:49:16,040 --> 00:49:19,760 >> Tja, om all input som användaren skrev i är inte bara några vänliga 982 00:49:19,760 --> 00:49:21,540 eller kränkande teckensträng. 983 00:49:21,540 --> 00:49:24,050 Det är faktiskt en sekvens av tecken att om du sammanställt det, 984 00:49:24,050 --> 00:49:26,050 det är faktiskt kod. 985 00:49:26,050 --> 00:49:29,570 Kanske är det kod som raderar alla filer på din hårddisk eller skickar skräppost 986 00:49:29,570 --> 00:49:30,810 eller nåt sånt. 987 00:49:30,810 --> 00:49:35,110 Lägg märke till att det som är nyckeln här är att Om den dåliga killen fick turen att 988 00:49:35,110 --> 00:49:37,830 skriva över den röda bit av minnet - 989 00:49:37,830 --> 00:49:41,080 som jag inte rita på min bild, men denna Wikipedia bild här har - 990 00:49:41,080 --> 00:49:42,890 sin så kallade returadress. 991 00:49:42,890 --> 00:49:47,470 >> När mat återvänder, när swap returer, Hur vet datorn att gå från 992 00:49:47,470 --> 00:49:49,790 upp här nere? 993 00:49:49,790 --> 00:49:52,920 Eller i Tech segmentet upp ovan, hur vet den att gå från swap 994 00:49:52,920 --> 00:49:54,870 kod - 0 s och 1 s att komponera swap - 995 00:49:54,870 --> 00:49:56,020 tillbaka till main? 996 00:49:56,020 --> 00:50:00,450 Det finns en så kallad returadress lagras i samma stackram, på 997 00:50:00,450 --> 00:50:02,140 samma cafeterian facket. 998 00:50:02,140 --> 00:50:06,080 >> Så om skurken är tillräckligt smart för att sätta attack-kod, attack-kod, attack 999 00:50:06,080 --> 00:50:07,960 koden, och få turen - 1000 00:50:07,960 --> 00:50:11,630 ofta genom försök och misstag - till skriva att röda returadress, 1001 00:50:11,630 --> 00:50:14,360 med adress och meddelande den absoluta toppen. 1002 00:50:14,360 --> 00:50:16,830 Lägg märke 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Den är skriven baklänges uppe för skäl kommer vi kanske återkomma. 1004 00:50:20,650 --> 00:50:22,050 Detta är det numret. 1005 00:50:22,050 --> 00:50:25,790 >> Så om den onde blir turen eller är smart nog att skriva över den röda 1006 00:50:25,790 --> 00:50:29,480 remsor av minne med adressen till kod som han eller hon har något 1007 00:50:29,480 --> 00:50:34,980 injiceras i datorn, gissa vars koden kommer att återlämnas till 1008 00:50:34,980 --> 00:50:38,260 så snart som foo görs verkställande? 1009 00:50:38,260 --> 00:50:39,440 >> Den onde kod. 1010 00:50:39,440 --> 00:50:43,610 Så här attack-kod, AAA, igen, kanske skicka spam, kanske ta bort alla filer 1011 00:50:43,610 --> 00:50:44,500 på din hårddisk. 1012 00:50:44,500 --> 00:50:48,740 Men det är vad som verkligen en stackspill är, eller en buffert genom eller en 1013 00:50:48,740 --> 00:50:51,060 buffertspill attack. 1014 00:50:51,060 --> 00:50:54,400 >> Och det är otroligt, otroligt vanligt till denna dag med program skrivna i 1015 00:50:54,400 --> 00:50:58,220 C, C + +, och även vissa andra språk. 1016 00:50:58,220 --> 00:51:02,275 På det skrämmande anmärkning, vi slutar med ett skämt. 1017 00:51:02,275 --> 00:51:03,230 >> [SKRATT] 1018 00:51:03,230 --> 00:51:04,550 >> Vi ses på onsdag. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Vid nästa CS50 - 1021 00:51:10,310 --> 00:51:15,920 Så jag är alla ut av disk lampor idag men vänta, fettfri mjölk, hälften telefonen 1022 00:51:15,920 --> 00:51:17,850 bok, apelsinjuice att jag drack idag. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB-kabel, en skiftnyckel. 1025 00:51:22,780 --> 00:51:24,800 >> [Musik Spela]