1 00:00:00,000 --> 00:00:11,242 >> [MUSIC Playing] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. MALAN: Okay dette er CS50 og dette er starten på ugen fem. 3 00:00:16,630 --> 00:00:21,480 Så i dag, under dine sædehynder vil du ikke finde noget. 4 00:00:21,480 --> 00:00:24,790 Men ovenstående, bør du finde disse, en lille token af ​​vores påskønnelse for 5 00:00:24,790 --> 00:00:26,970 alt det arbejde, du lægger ind i Game of Fifteen. 6 00:00:26,970 --> 00:00:30,290 Du skal blot fjerne den lille cirkel på bund for at begynde at spille for 7 00:00:30,290 --> 00:00:31,680 resten af ​​klassen. 8 00:00:31,680 --> 00:00:38,930 >> Så husker det, eller ved, at sætte problemet fire, der gik ud i denne weekend, 9 00:00:38,930 --> 00:00:40,340 indebærer skrive et andet spil. 10 00:00:40,340 --> 00:00:43,740 Men denne gang det indebærer anvendelse af en faktiske grafisk brugergrænseflade, ikke en 11 00:00:43,740 --> 00:00:46,310 tekstuelle interface som Game of Fifteen var. 12 00:00:46,310 --> 00:00:50,210 Og det spil, der ligger foran dig, hvis du ikke har endnu ikke set denne næste, 13 00:00:50,210 --> 00:00:52,310 ser lidt noget som dette. 14 00:00:52,310 --> 00:00:55,170 Jeg har tænkt mig at gå ind i min terminal vindue her i GDB. 15 00:00:55,170 --> 00:00:58,600 Og jeg har tænkt mig at gå videre og køre personale løsning, som du kan få adgang 16 00:00:58,600 --> 00:01:01,010 efter at have kørt update 50 som sædvanlig. 17 00:01:01,010 --> 00:01:04,090 >> Men jeg har tænkt mig at sætte det ind i en lille hemmelig tilstand, lidt påskeæg, 18 00:01:04,090 --> 00:01:08,480 såkaldte Gud tilstand ved sætte Gud i argv1. 19 00:01:08,480 --> 00:01:12,920 Og jeg er nødt til at følge mine egne retninger, kører det i min egen 20 00:01:12,920 --> 00:01:14,220 Problemet sæt bibliotek. 21 00:01:14,220 --> 00:01:19,190 Så nu kan du se en komplet udgave af spillet Breakout. 22 00:01:19,190 --> 00:01:21,090 I virkeligheden er dette ikke-hænder mode. 23 00:01:21,090 --> 00:01:24,850 Så det er faktisk - 24 00:01:24,850 --> 00:01:26,470 henrykkede selvom du måske være - 25 00:01:26,470 --> 00:01:30,850 temmelig trivielt at implementere Gud tilstand Breakout, i modsætning til Game of Fifteen, 26 00:01:30,850 --> 00:01:33,590 som nogle af jer måske har tacklet for hackeren edition. 27 00:01:33,590 --> 00:01:37,890 >> I Breakout er det tilstrækkeligt på Gud tilstand til blot at gøre hvad, 28 00:01:37,890 --> 00:01:41,220 intuitivt med pagajen? 29 00:01:41,220 --> 00:01:45,630 Bare gør det lig uanset vandrette position er af bolden. 30 00:01:45,630 --> 00:01:49,220 Og så længe du gør dette i lockstep med bolden bevæger dette spil vil 31 00:01:49,220 --> 00:01:53,100 aldrig, aldrig, aldrig glip af bolden og du vil vinde hver gang. 32 00:01:53,100 --> 00:01:55,430 >> Men i denne uges hacker edition der er mere end bare Gud mode. 33 00:01:55,430 --> 00:01:56,720 Der er en række andre funktioner. 34 00:01:56,720 --> 00:01:58,140 Blandt dem,. Lasere 35 00:01:58,140 --> 00:02:01,070 Så hvis du virkelig får utålmodig du kan begynde at skyde ned murstenene 36 00:02:01,070 --> 00:02:02,120 og et par andre. 37 00:02:02,120 --> 00:02:04,560 Og for dem af jer der gerne vil kalibrere standard versus hacker 38 00:02:04,560 --> 00:02:08,750 edition, kan jeg se, at denne uges hacker edition bevidst er en 39 00:02:08,750 --> 00:02:12,830 lidt mere doable, siger, end Gud tilstand var sammen med Game of Fifteen. 40 00:02:12,830 --> 00:02:15,300 >> Så hvis du leder efter en stræk og du leder efter nogle ekstra sjov 41 00:02:15,300 --> 00:02:18,400 funktioner gør dykke i, hvis af interesse. 42 00:02:18,400 --> 00:02:21,280 Nu mere praktisk, så lad mig påpege ud én ting så godt. 43 00:02:21,280 --> 00:02:24,780 GDB, som nogle af jer måske endnu ikke har rørte personligt, hvilket er fint. 44 00:02:24,780 --> 00:02:28,530 Men nu er virkelig tid til at vænne til dette og komfortable med dette værktøj 45 00:02:28,530 --> 00:02:31,510 fordi det vil gøre dit liv meget lettere, virkelig. 46 00:02:31,510 --> 00:02:34,900 >> Per Robs forelæsning om GDB et par uger siden, husker 47 00:02:34,900 --> 00:02:36,810 at GDB er en debugger. 48 00:02:36,810 --> 00:02:41,230 Det er et værktøj, der lader dig køre din program, men køre det skridt for skridt, linje 49 00:02:41,230 --> 00:02:45,680 efter linje, du så kan stikke omkring, så du kan se ting, der sker, så 50 00:02:45,680 --> 00:02:47,310 at du kan printe ud værdier af variabler. 51 00:02:47,310 --> 00:02:50,580 Kort sagt, giver det dig så meget mere strøm end printDef gør. 52 00:02:50,580 --> 00:02:52,900 >> Nu ganske vist grænsefladen er temmelig mystisk. 53 00:02:52,900 --> 00:02:55,180 Sort og hvid tekstmæssige grænseflade for det meste. 54 00:02:55,180 --> 00:02:57,400 Kommandoerne er lidt hårde at huske på først. 55 00:02:57,400 --> 00:03:01,230 Men selvom det kan tage dig en halv en time, en time, for at sige, at upfront 56 00:03:01,230 --> 00:03:02,940 investering af tid i det, tro mig. 57 00:03:02,940 --> 00:03:06,440 Bestemt ved semesters ende vil spare du en størrelsesorden mere 58 00:03:06,440 --> 00:03:07,600 tid end det. 59 00:03:07,600 --> 00:03:09,200 >> Så tidligt i ugen dykke i. 60 00:03:09,200 --> 00:03:13,200 Og med hensyn til Breakout, ved, at du kan gøre dette, så længe du har 61 00:03:13,200 --> 00:03:18,230 distributionen kode eller din egen kode i gang i din Pst4 bibliotek. 62 00:03:18,230 --> 00:03:21,680 Vid, at du kan køre gdb. / Breakout. 63 00:03:21,680 --> 00:03:23,490 >> Dette kommer til at åbne op et vindue som dette. 64 00:03:23,490 --> 00:03:25,530 Lad mig give mig mere af en terminal vindue. 65 00:03:25,530 --> 00:03:27,770 Og hvad så jeg har tænkt mig at gå videre og gøre, det er ikke bare køre den. 66 00:03:27,770 --> 00:03:30,690 Jeg har tænkt mig først at sætte et break point tilbagekaldelse, som giver dig mulighed for at holde pause 67 00:03:30,690 --> 00:03:32,500 udførelse på et bestemt sted. 68 00:03:32,500 --> 00:03:35,750 >> Bare for at holde tingene enkle jeg har tænkt mig til at bryde på linje én lige ved at skrive 69 00:03:35,750 --> 00:03:37,000 nummer et. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Lad mig faktisk genåbne dette vindue fordi det bliver en 72 00:03:43,250 --> 00:03:45,700 lidt lille der. 73 00:03:45,700 --> 00:03:53,270 Så hvad jeg vil nu gøre her, er hvis jeg åbner mit terminalvindue. 74 00:03:53,270 --> 00:03:53,910 Kom, der går vi. 75 00:03:53,910 --> 00:03:59,850 >> Så nu, hvis jeg går tilbage til dropbox, Pst4 og køre gdb. / breakout ind, mærke 76 00:03:59,850 --> 00:04:02,600 Jeg har tænkt mig at bryde en til at sætte et break point ved linie et. 77 00:04:02,600 --> 00:04:04,840 Og nu vil jeg til at gå fremad og type køre. 78 00:04:04,840 --> 00:04:07,370 Og når jeg gør det, bemærker noget synes at ske. 79 00:04:07,370 --> 00:04:08,120 >> Der er ingen pop up. 80 00:04:08,120 --> 00:04:09,790 Der er ingen grafisk brugergrænseflade endnu. 81 00:04:09,790 --> 00:04:13,340 Men det er forståeligt, fordi jeg er bogstaveligt talt ved linie et i mit program. 82 00:04:13,340 --> 00:04:17,110 Og mærke til, at jeg hurtigt har videresendt, specielt nu til 62, fordi alle 83 00:04:17,110 --> 00:04:20,600 de ting i toppen af ​​denne fil er ting som kommentarer og konstanter og 84 00:04:20,600 --> 00:04:22,460 uinteressant ting til nu. 85 00:04:22,460 --> 00:04:25,840 >> Så nu er jeg inde i main, det ser ud, på linje 62.. 86 00:04:25,840 --> 00:04:27,960 Og dette er kun fordelingen kode, tilbagekaldelse. 87 00:04:27,960 --> 00:04:33,810 Hvis jeg åbner dette op ved at gå, på samme måde, ind i min drop box mappe i Pst4, 88 00:04:33,810 --> 00:04:35,450 ind breakout.c. 89 00:04:35,450 --> 00:04:40,670 Og hvis jeg rulle ned og ned og ned, og lad mig gå videre og slå 90 00:04:40,670 --> 00:04:44,990 min linje numre. 91 00:04:44,990 --> 00:04:50,300 >> Hvad jeg vil se, om jeg rulle ned til linie 62, er netop den linje, 92 00:04:50,300 --> 00:04:50,910 vi har på pause på. 93 00:04:50,910 --> 00:04:53,720 Så denne linje her, 62, er hvor vi er ved at være. 94 00:04:53,720 --> 00:04:57,470 Så nu i GDB skrive, hvis jeg går videre og nu næste, skal du indtaste det kommer til at 95 00:04:57,470 --> 00:04:58,450 udføre den pågældende linje. 96 00:04:58,450 --> 00:05:00,610 Og vupti, vi har såkaldt g vinduet. 97 00:05:00,610 --> 00:05:02,800 Hvis bekendt med, hvad en GWindow er, ikke at bekymre dig. 98 00:05:02,800 --> 00:05:05,740 Den spec vil introducere dig til det, som samt en række præsentationsvideoer 99 00:05:05,740 --> 00:05:06,830 indlejret i spec. 100 00:05:06,830 --> 00:05:08,610 >> Men lad os nu gøre dette til en lidt mere interessant. 101 00:05:08,610 --> 00:05:10,960 Lad mig flytte dette vindue over til siden en lille smule. 102 00:05:10,960 --> 00:05:13,480 Lad mig gøre vinduet lidt større, så jeg kan se mere. 103 00:05:13,480 --> 00:05:16,140 >> Og lad mig nu gå videre og gøre næste gang. 104 00:05:16,140 --> 00:05:17,550 Og der er mine mursten. 105 00:05:17,550 --> 00:05:20,490 Hvis jeg skriver næste gang nu ser jeg bolden. 106 00:05:20,490 --> 00:05:23,520 Og hvis jeg skriver næste gang nu ser jeg pagajen. 107 00:05:23,520 --> 00:05:26,690 >> Og heldigvis gedit er ikke virkelig samarbejder ved at vise mig 108 00:05:26,690 --> 00:05:27,660 alt, hvad jeg vil have. 109 00:05:27,660 --> 00:05:30,820 Men nu, hvis jeg gøre næste gang, næste gang, jeg er bare 110 00:05:30,820 --> 00:05:32,260 erklære nogle variabler. 111 00:05:32,260 --> 00:05:34,750 Og jeg kan udskrive nogen af disse fyre. 112 00:05:34,750 --> 00:05:37,170 Print mursten, udskrifter liv. 113 00:05:37,170 --> 00:05:39,910 >> Og nu, hvis jeg fortsætter med at gøre Dernæst bemærke, at jeg vil være 114 00:05:39,910 --> 00:05:40,870 indersiden af ​​denne løkke. 115 00:05:40,870 --> 00:05:43,380 Men koden vil udføre præcis som jeg forventer. 116 00:05:43,380 --> 00:05:45,810 Så når jeg ramte denne funktion, Wait til Click, det kommer til at gøre 117 00:05:45,810 --> 00:05:46,830 det bogstaveligt talt det. 118 00:05:46,830 --> 00:05:48,870 Så jeg syntes at have mistet kontrollen over programmet. 119 00:05:48,870 --> 00:05:50,480 >> GDB er ikke at give mig en anden prompt. 120 00:05:50,480 --> 00:05:51,500 Men ikke at bekymre sig. 121 00:05:51,500 --> 00:05:53,720 Gå til mit spil, skal du klikke et eller andet sted. 122 00:05:53,720 --> 00:05:56,270 >> Og voila, nu er det videre til linje 86.. 123 00:05:56,270 --> 00:05:59,460 Så igen, det er uvurderligt, i sidste ende, for debugging problemer. 124 00:05:59,460 --> 00:06:03,050 Fordi du kan bogstavelig talt gå gennem din kode, udskrive ting ud og meget, 125 00:06:03,050 --> 00:06:03,640 meget mere. 126 00:06:03,640 --> 00:06:07,210 Men for nu, værktøjer dem alene bør få dig temmelig langt. 127 00:06:07,210 --> 00:06:10,050 >> Så vi er selvfølgelig at tage et kig på Graphics nu, lige pludselig. 128 00:06:10,050 --> 00:06:12,350 Og nu er vores verden bliver lidt mere interessant. 129 00:06:12,350 --> 00:06:15,680 Og du ved, måske, fra nogle af de videoer online, at vi har disse 130 00:06:15,680 --> 00:06:18,280 shorts, du har været at se som en del af problemet sæt. 131 00:06:18,280 --> 00:06:20,460 >> Og de er blevet skudt, bevidst, mod en hvid baggrund. 132 00:06:20,460 --> 00:06:23,380 Og nogle af dem har undervisningen Fellows trække noget tekst på 133 00:06:23,380 --> 00:06:25,490 skærm, der er overlejret på siden af ​​dem. 134 00:06:25,490 --> 00:06:27,760 Men selvfølgelig er det ikke alle, der interessant i den virkelige verden. 135 00:06:27,760 --> 00:06:30,520 Dette er blot en foredragssal med en store hvide skærm og en kulisse. 136 00:06:30,520 --> 00:06:33,330 Og vores fantastiske produktion team slags af gør alting ser smuk 137 00:06:33,330 --> 00:06:36,620 efter den kendsgerning ved at beskære ud eller overlejring noget 138 00:06:36,620 --> 00:06:37,840 vi gør eller ikke ønsker. 139 00:06:37,840 --> 00:06:41,560 >> Nu bare at motivere denne uge og virkelig, hvor du kan gå, i sidste ende, 140 00:06:41,560 --> 00:06:42,560 med datalogi. 141 00:06:42,560 --> 00:06:44,260 Ikke bare efter problem sæt fire. 142 00:06:44,260 --> 00:06:48,240 Men efter et andet kursus eller en hel curriculum det er utroligt, hvad du kan, 143 00:06:48,240 --> 00:06:51,090 gøre disse dage i form af grafik i særdeleshed. 144 00:06:51,090 --> 00:06:53,440 >> Nogle af jer har måske set det flyder rundt på nettet. 145 00:06:53,440 --> 00:06:56,240 Men jeg troede, jeg ville vise dig, for bare en par minutter, et glimt af hvad 146 00:06:56,240 --> 00:07:01,890 computerteknologi og hvad CGI, computergrafik kan gøre i disse dage 147 00:07:01,890 --> 00:07:04,510 med en velkendt sang og måske film. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LANA DEL RAY, "Ung og smuk] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: Det er bare en lille smule forbløffende, måske, bare hvor 151 00:10:52,470 --> 00:10:52,857 allestedsnærværende - 152 00:10:52,857 --> 00:10:57,040 >> [Applaus] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Jeg har lige hentet det. 154 00:10:59,230 --> 00:11:02,920 Men det er virkelig forbløffende, tror jeg, bare hvordan allestedsnærværende software og kode og 155 00:11:02,920 --> 00:11:04,230 værktøjer som dette virkelig er. 156 00:11:04,230 --> 00:11:07,685 Så det er en smag af retningen hvor du kan gå. 157 00:11:07,685 --> 00:11:10,620 Åh, nej mere Appliance dag. 158 00:11:10,620 --> 00:11:14,640 Tja, det er faktisk tragisk timing givet punkt, jeg prøvede bare at gøre. 159 00:11:14,640 --> 00:11:18,670 >> Okay, så lad os starte Fusion igen. 160 00:11:18,670 --> 00:11:20,800 Påmind mig senere. 161 00:11:20,800 --> 00:11:24,190 Okay, og du bør have fået en e-mail som en sidebemærkning, hvis du fik en 162 00:11:24,190 --> 00:11:25,460 bemærke sådan. 163 00:11:25,460 --> 00:11:29,940 Okay, så minde om, at i sidste uge vi begyndte at skrælle tilbage denne 164 00:11:29,940 --> 00:11:31,380 senere kendt som streng. 165 00:11:31,380 --> 00:11:34,700 >> string minder en datatype, der er anmeldt i CS50 biblioteket. 166 00:11:34,700 --> 00:11:37,740 Og det er en del af støttehjul der vil nu begynde at tage fart. 167 00:11:37,740 --> 00:11:41,280 Det var et nyttigt begreb tidligt. 168 00:11:41,280 --> 00:11:43,750 Men nu er det kommer til at få mere interessant og mere kraftfuld til 169 00:11:43,750 --> 00:11:48,330 faktisk se, at under hætten, en streng er bare hvad, vi siger? 170 00:11:48,330 --> 00:11:50,500 >> Yeah, så det er en såkaldt char *. 171 00:11:50,500 --> 00:11:53,860 Og * der angiver, at der er en slags adresse involveret. 172 00:11:53,860 --> 00:11:58,690 Og så når du siger char * du bare betyde en variabel, hvis datatype er 173 00:11:58,690 --> 00:11:59,290 pointer nu. 174 00:11:59,290 --> 00:12:01,770 Det faktum, at der er den stjerne der betyder blot, at du er om en 175 00:12:01,770 --> 00:12:03,020 såkaldt pegepind. 176 00:12:03,020 --> 00:12:06,220 Og det pointer vil tilsyneladende gemme adressen på 177 00:12:06,220 --> 00:12:07,810 Selvfølgelig en char. 178 00:12:07,810 --> 00:12:08,960 >> Nu hvorfor det mening? 179 00:12:08,960 --> 00:12:11,200 Nå, hvad er en streng under hætten? 180 00:12:11,200 --> 00:12:15,130 Tja, for nogle gang, vi har sagt at en streng under hætten er 181 00:12:15,130 --> 00:12:18,460 bare t-e-L-L-o, f.eks. 182 00:12:18,460 --> 00:12:21,585 >> Men vi har talt om dette som være væsentlige, et array. 183 00:12:21,585 --> 00:12:25,410 Og et array ville så se lidt mere som denne, med hver af disse 184 00:12:25,410 --> 00:12:26,460 optage en bid. 185 00:12:26,460 --> 00:12:28,710 Og så har vi sagt, at der er noget særligt tilbage her, de 186 00:12:28,710 --> 00:12:31,270 backslash 0 eller null terminator. 187 00:12:31,270 --> 00:12:35,230 >> Så alt dette tidspunkt, her i har været en streng. 188 00:12:35,230 --> 00:12:38,320 Men virkelig, en streng er faktisk en adresse. 189 00:12:38,320 --> 00:12:43,210 Og adresser, da vi vil se, er ofte foranstillet 0x af konventionen. 190 00:12:43,210 --> 00:12:44,540 Hvad betyder 0x betegner? 191 00:12:44,540 --> 00:12:45,970 Er der nogen vide? 192 00:12:45,970 --> 00:12:47,320 >> Så det betyder bare hexadecimal. 193 00:12:47,320 --> 00:12:52,360 Så du måske husker, faktisk, fra Pst 1, tror jeg, en af ​​de varme-up 194 00:12:52,360 --> 00:12:55,740 spørgsmål faktisk bedt om hexadecimal notation i tillæg til 195 00:12:55,740 --> 00:12:57,100 binær og decimal. 196 00:12:57,100 --> 00:13:00,460 Og motivationen her er, at med hexadecimal har du 16 197 00:13:00,460 --> 00:13:01,770 cifre til din rådighed. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, efterfulgt ved en,. b, c, d, e, f 199 00:13:07,900 --> 00:13:10,430 >> Og hvis man tæller alle dem op, du får en alt 16. 200 00:13:10,430 --> 00:13:13,200 Så dette er i modsætning til decimal, hvor vi har 10 201 00:13:13,200 --> 00:13:14,690 cifre, 0 til ni. 202 00:13:14,690 --> 00:13:17,750 Det er i modsætning til binær hvor vi bare have 0 og 1. 203 00:13:17,750 --> 00:13:21,450 >> Men i slutningen af ​​dagen kan du bare repræsenterer de samme numre, men 204 00:13:21,450 --> 00:13:22,500 noget anderledes. 205 00:13:22,500 --> 00:13:25,840 Og hexadecimal er fælles, fordi så det viser sig - og vi vil se denne 206 00:13:25,840 --> 00:13:28,790 senere i kurset - også når vi får til webprogrammering i forbindelse med 207 00:13:28,790 --> 00:13:32,100 HTML og farvekoder, hexadecimal er rart. 208 00:13:32,100 --> 00:13:36,390 Fordi hvert ciffer, viser sig, repræsenterer fire bit perfekt. 209 00:13:36,390 --> 00:13:39,280 Så er det bare slags linjer op pænt da vi i sidste ende vil se. 210 00:13:39,280 --> 00:13:44,720 Så dette kunne være Ox123 eller noget sådan, betegner adresse 123 211 00:13:44,720 --> 00:13:47,050 et sted inde i min computerens hukommelse. 212 00:13:47,050 --> 00:13:50,600 >> Men selvfølgelig opstå nogle problemer på grund af denne underliggende 213 00:13:50,600 --> 00:13:51,520 gennemførelse. 214 00:13:51,520 --> 00:13:55,930 Og huske, at jeg tog en kniv på gennemføre en funktion som denne - 215 00:13:55,930 --> 00:14:00,260 sammenligne dash 0 dot c i sidste uge, at selvom det lignede det var 216 00:14:00,260 --> 00:14:04,270 ret, er det simpelthen ikke sammenligne to strenge rigtigt. 217 00:14:04,270 --> 00:14:07,470 >> Jeg har smidt væk main, og jeg har smidt væk kommentarerne bare at fokusere på 218 00:14:07,470 --> 00:14:08,970 den kode, der er af interesse her. 219 00:14:08,970 --> 00:14:10,660 Og det er i rødt, fordi det er buggy. 220 00:14:10,660 --> 00:14:11,670 Af hvilken grund? 221 00:14:11,670 --> 00:14:15,890 >> Nå, i toppen er der, når jeg erklærede en streng, var, hvad der virkelig foregår 222 00:14:15,890 --> 00:14:17,260 under hætten? 223 00:14:17,260 --> 00:14:19,530 Nå, lad mig gå over til screene her og trække det. 224 00:14:19,530 --> 00:14:23,230 Så jeg erklærede igen, string s getString. 225 00:14:23,230 --> 00:14:26,640 >> Så jeg har tænkt mig at gå videre nu, og tegne s for, hvad det egentlig er. 226 00:14:26,640 --> 00:14:28,590 Det kommer til at være et kvadrat her. 227 00:14:28,590 --> 00:14:30,490 Og jeg har tænkt mig at hævde at der er 32 bits. 228 00:14:30,490 --> 00:14:32,890 I det mindste er normalt, i det mindste på CS50 229 00:14:32,890 --> 00:14:34,520 apparat i en masse computere. 230 00:14:34,520 --> 00:14:35,980 Jeg har tænkt mig at kalde det er. 231 00:14:35,980 --> 00:14:39,070 >> Men nu minde om, at vi kaldet getString. 232 00:14:39,070 --> 00:14:41,430 Så getString afkast, selvfølgelig. en streng 233 00:14:41,430 --> 00:14:45,790 Hvis brugeren typer i h-e-l-l-o indtaste strengen hej bliver returneret. 234 00:14:45,790 --> 00:14:51,010 Og denne streng, som vi lige har sagt, slutter op et sted i computerens hukommelse 235 00:14:51,010 --> 00:14:53,240 med en omvendt skråstreg 0 ved udgangen. 236 00:14:53,240 --> 00:14:56,650 Jeg vil henlede dette ligesom array - eller sammenhængende blok karakterer - 237 00:14:56,650 --> 00:14:58,330 at det faktisk er. 238 00:14:58,330 --> 00:15:01,790 >> Og nu, hvad der getString faktisk vender tilbage? 239 00:15:01,790 --> 00:15:04,340 Hvad er getString været tilbage al den tid? 240 00:15:04,340 --> 00:15:07,520 Nå, vi siger, i uger før, den returnerer en streng. 241 00:15:07,520 --> 00:15:10,250 Men mere teknisk, hvad betyder GetString afkast tilsyneladende? 242 00:15:10,250 --> 00:15:11,610 >> PUBLIKUM: En adresse. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: En adresse. 244 00:15:12,600 --> 00:15:16,630 Specifikt returnerer adressen den allerførste bid, uanset hvad det er. 245 00:15:16,630 --> 00:15:18,830 Jeg bare holde ved hjælp af en, to, tre fordi det er belejligt. 246 00:15:18,830 --> 00:15:21,380 >> Den returnerer adressen på den første tegn i strengen. 247 00:15:21,380 --> 00:15:23,510 Og vi sagde sidste uge, at der er tilstrækkeligt. 248 00:15:23,510 --> 00:15:26,710 Fordi vi altid kan regne ud, hvor enden af ​​strengen bare ved 249 00:15:26,710 --> 00:15:30,150 iteration over det, måske med en for sløjfe eller en while-løkke eller noget lignende 250 00:15:30,150 --> 00:15:34,990 at bare på udkig efter "omvendt skråstreg 0" den særlige sentinel karakter. 251 00:15:34,990 --> 00:15:37,220 >> Og så ved vi, at strengen sker for at være af længde - 252 00:15:37,220 --> 00:15:37,980 i dette tilfælde - 253 00:15:37,980 --> 00:15:38,670 fem. 254 00:15:38,670 --> 00:15:43,800 Så teknisk set hvad getString gør er det returnerer Ox123 i dette tilfælde. 255 00:15:43,800 --> 00:15:53,670 Og teknisk hvad så sker, er at vi opbevarer, indersiden af ​​s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Ved slutningen af ​​dagen, men selv dette er nyt koncept, pegepinde, de er 257 00:15:56,460 --> 00:15:57,350 kun variabler. 258 00:15:57,350 --> 00:16:00,440 Men de tilfældigvis til at gemme bits, kollektivt repræsenterer en adresse. 259 00:16:00,440 --> 00:16:03,700 Så teknisk set alt, hvad de får lagres i s er Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Men vi som mennesker - 261 00:16:04,680 --> 00:16:06,020 herunder dag og fremefter - 262 00:16:06,020 --> 00:16:09,290 virkelig ikke kommer til at passe, typisk, hvad den faktiske adresse er 263 00:16:09,290 --> 00:16:10,520 for nogle luns af hukommelse. 264 00:16:10,520 --> 00:16:14,040 Det er bare at lave detaljeret til være intellektuelt interessant. 265 00:16:14,040 --> 00:16:15,440 Så jeg har tænkt mig at fortryde dette. 266 00:16:15,440 --> 00:16:19,810 Og i stedet, mere højt niveau, bare sige at når vi taler om pointers 267 00:16:19,810 --> 00:16:22,170 Jeg har tænkt mig at bare trække mere brugervenlig pil, der formidler 268 00:16:22,170 --> 00:16:26,060 samme idé og abstracts væk oplysninger om, hvad den faktiske 269 00:16:26,060 --> 00:16:27,700 underliggende adresse er. 270 00:16:27,700 --> 00:16:33,290 >> Nu, hvis vi går tilbage til den kode, hvad skete i sidste uge, hvis vi har string t 271 00:16:33,290 --> 00:16:34,510 lig getString? 272 00:16:34,510 --> 00:16:38,630 Tja, hvis jeg igen, skriver i hej denne gang jeg har tænkt mig at få 273 00:16:38,630 --> 00:16:40,460 anden luns af hukommelse. 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 fordi jeg kaldte getString en anden gang - 276 00:16:48,320 --> 00:16:51,100 og jeg kender det fra ser på kildekoden til getString - selv 277 00:16:51,100 --> 00:16:54,350 selvom det er tilfældigt, at hello var indtastet to gange, getString er ikke 278 00:16:54,350 --> 00:16:55,890 vil forsøge at optimere og være klog. 279 00:16:55,890 --> 00:16:58,550 Det er bare at få en anden bid af hukommelse fra computeren, hvilket er 280 00:16:58,550 --> 00:16:59,640 kommer til at være på en anden adresse. 281 00:16:59,640 --> 00:17:02,330 Lad os vilkårligt bare sige 456. 282 00:17:02,330 --> 00:17:04,079 >> Og hvad er det kommer til at vende tilbage? 283 00:17:04,079 --> 00:17:08,030 Det kommer til at vende tilbage 456 og opbevar det i t. 284 00:17:08,030 --> 00:17:12,010 Så hvad der virkelig foregår på venstre side er jeg har en anden luns 285 00:17:12,010 --> 00:17:14,260 hukommelse. 32 bits typisk 286 00:17:14,260 --> 00:17:16,720 Og derinde kommer til at gå Ox456. 287 00:17:16,720 --> 00:17:20,140 Men igen, jeg er ikke interesseret i disse bestemte numre længere. 288 00:17:20,140 --> 00:17:23,069 Jeg skal bare til abstrakt tegne den som en pil. 289 00:17:23,069 --> 00:17:25,202 >> Så dette er nu en ny forklaring. 290 00:17:25,202 --> 00:17:28,735 Men det er nøjagtig de samme idé, der er er sket al denne tid. 291 00:17:28,735 --> 00:17:33,150 Og så grund så, at denne første version af Sammenlign var fejlbehæftet 292 00:17:33,150 --> 00:17:34,480 sidste uge, er hvorfor? 293 00:17:34,480 --> 00:17:38,000 Når du gøre, hvis s er lig lig t hvad er du virkelig 294 00:17:38,000 --> 00:17:40,550 under hætten sammenligning? 295 00:17:40,550 --> 00:17:41,910 >> Du sammenligner de adresser. 296 00:17:41,910 --> 00:17:47,950 Og bare intuitivt klart, Ox123 kommer ikke til lige Ox456. 297 00:17:47,950 --> 00:17:49,380 Disse tal, disse bits er bare forskellige. 298 00:17:49,380 --> 00:17:53,220 >> Og så konsekvent, i sidste uge sagde det du skriver forskellige ting, selvom 299 00:17:53,220 --> 00:17:55,360 ord var ordret det samme. 300 00:17:55,360 --> 00:17:58,770 Så vi løse dette. 301 00:17:58,770 --> 00:18:00,120 I lægmandssprog, hvad var fix? 302 00:18:00,120 --> 00:18:02,110 >> PUBLIKUM: Brug en funktion. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: Brug en funktion. 304 00:18:02,870 --> 00:18:05,190 Eller stjerner er absolut involveret, men bruge en funktion til at gøre hvad? 305 00:18:05,190 --> 00:18:05,962 >> PUBLIKUM: At sammenligne strengene. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: At sammenligne strengene. 307 00:18:07,390 --> 00:18:11,030 Så det grundlæggende problem her var at jeg bare var overvejer 308 00:18:11,030 --> 00:18:15,870 kvaliteten af ​​strenge, der skal defineres af sammenligning af deres adresser. 309 00:18:15,870 --> 00:18:18,540 Og selvfølgelig det er bare dum nu engang du forstår, hvad der foregår 310 00:18:18,540 --> 00:18:19,510 under hætten. 311 00:18:19,510 --> 00:18:23,270 For virkelig at sammenligne strenge at se, om de er ens i den måde, at et menneske 312 00:18:23,270 --> 00:18:26,680 ville overveje to strenge at være lig vi nødt til at sammenligne dem tegn for 313 00:18:26,680 --> 00:18:28,070 tegn for tegn. 314 00:18:28,070 --> 00:18:30,020 >> Nu kunne jeg have gjort denne meget kedelig. 315 00:18:30,020 --> 00:18:32,240 Men vitterligt er vi ved hjælp af en for-løkke. 316 00:18:32,240 --> 00:18:36,050 Og bare sammenligne s beslag I mod t beslag I. 317 00:18:36,050 --> 00:18:39,590 s beslag I plus 1 mod t beslag I plus 1, og så videre, inde 318 00:18:39,590 --> 00:18:40,580 en slags sløjfe. 319 00:18:40,580 --> 00:18:44,950 Og hvis jeg øje på to tegn, der forskellige, eller hvis jeg indser, at ooh, s er 320 00:18:44,950 --> 00:18:48,410 kortere end t eller længere end t Jeg kan med det samme sige falsk, 321 00:18:48,410 --> 00:18:49,390 de er ikke det samme. 322 00:18:49,390 --> 00:18:55,370 >> Men hvis jeg kommer igennem s og t og sige samme, samme, samme, samme, samme, ultimo 323 00:18:55,370 --> 00:18:58,520 begge strenge, kan jeg sige sand, er de ens. 324 00:18:58,520 --> 00:19:01,040 Nå, heldigvis, år siden nogen skrev, at koden for os. 325 00:19:01,040 --> 00:19:03,790 >> Og de kaldte det StrComp for string sammenligne. 326 00:19:03,790 --> 00:19:11,900 Og selvom det er en lidt counter intuitiv, StrComp returnerer 0, hvis de 327 00:19:11,900 --> 00:19:14,520 to strenge, s og t er de samme. 328 00:19:14,520 --> 00:19:18,090 Men det returnerer negativ værdi, hvis s bør komme før t alfabetisk eller 329 00:19:18,090 --> 00:19:20,610 positiv værdi, hvis det skulle komme efter t alfabetisk. 330 00:19:20,610 --> 00:19:24,030 >> Så hvis du nogensinde ønsker at sortere noget, det viser sig, at StrComp er nyttig. 331 00:19:24,030 --> 00:19:26,660 Fordi det ikke bare sige ja eller nej, lig med eller ej. 332 00:19:26,660 --> 00:19:30,440 Det giver dig en følelse af bestilling gerne en ordbog magt. 333 00:19:30,440 --> 00:19:33,770 Så StrComp, lig s komma t lig 0 betyder, at 334 00:19:33,770 --> 00:19:35,200 strenge er virkelig lige. 335 00:19:35,200 --> 00:19:38,680 Fordi hvem skrev denne funktion år siden formentlig brugt en for-løkke 336 00:19:38,680 --> 00:19:42,840 eller en while-løkke eller noget lignende at integrere over tegnene igen 337 00:19:42,840 --> 00:19:45,270 og igen og igen. 338 00:19:45,270 --> 00:19:47,300 >> Men problemet to opstod her. 339 00:19:47,300 --> 00:19:48,750 Dette var copy0.c. 340 00:19:48,750 --> 00:19:51,680 Og de to i rød er fordi det er fejlbehæftet. 341 00:19:51,680 --> 00:19:52,800 Og hvad gjorde vi her? 342 00:19:52,800 --> 00:19:54,310 Nå, først jeg kaldte getString. 343 00:19:54,310 --> 00:19:56,255 Og jeg gemt returværdien i sek. 344 00:19:56,255 --> 00:20:00,260 Så det er temmelig meget det samme som denne øverste del af billedet. 345 00:20:00,260 --> 00:20:01,490 >> Men hvad der kommer efter det? 346 00:20:01,490 --> 00:20:04,980 Nå, lad mig gå videre og slippe af en hel flok af dette. 347 00:20:04,980 --> 00:20:09,650 Vi tilbage i tide til, hvor vi bare har s, som nu er i overensstemmelse med 348 00:20:09,650 --> 00:20:10,940 line én deroppe. 349 00:20:10,940 --> 00:20:11,400 >> Jeg tjekke. 350 00:20:11,400 --> 00:20:13,450 Hvis s er lig med lig 0. 351 00:20:13,450 --> 00:20:18,670 Nu, et hurtig side bemærkning, når måske getString returnere 0? 352 00:20:18,670 --> 00:20:19,580 Der er ikke nok hukommelse. 353 00:20:19,580 --> 00:20:19,880 Right? 354 00:20:19,880 --> 00:20:22,310 >> Det er sjældent, at dette kommer til at ske, helt sikkert på en computer, der er 355 00:20:22,310 --> 00:20:24,740 fik hundreder af megs eller selv gigs RAM. 356 00:20:24,740 --> 00:20:27,080 Men det kunne i teorien tilbage 0, især hvis 357 00:20:27,080 --> 00:20:28,080 brugeren ikke samarbejder. 358 00:20:28,080 --> 00:20:31,640 Der er måder at lade som du ikke har indtastet noget og trick 359 00:20:31,640 --> 00:20:34,100 GetString til at vende tilbage 0 effektivt. 360 00:20:34,100 --> 00:20:35,470 >> Så det kommer til at tjekke for det. 361 00:20:35,470 --> 00:20:39,430 For hvis nogen af ​​jer er begyndt at får, allerede segmentering fejl - 362 00:20:39,430 --> 00:20:42,280 der sandsynligvis har været en kilde for nogle frustrationer - 363 00:20:42,280 --> 00:20:46,150 de er næsten altid resultatet hukommelse-relaterede fejl. 364 00:20:46,150 --> 00:20:50,440 En eller anden måde du har rodet op med hensyn til en pointer, selvom du ikke var klar 365 00:20:50,440 --> 00:20:51,530 der var en pegepind. 366 00:20:51,530 --> 00:20:55,260 Så du måske har fremkaldt segmentering fejl så tidligt som uge en hjælp 367 00:20:55,260 --> 00:21:02,100 noget som en for-løkke eller et stykke loop og et array ved at gå for langt 368 00:21:02,100 --> 00:21:05,900 forbi grænserne for nogle array, du erklærede i uge to i 369 00:21:05,900 --> 00:21:06,690 særdeleshed. 370 00:21:06,690 --> 00:21:09,220 >> Du har måske gjort det selv i problemer sæt fire med Breakout. 371 00:21:09,220 --> 00:21:12,910 Selvom du sikkert ikke har set enhver stjerner i distributionen koden for 372 00:21:12,910 --> 00:21:17,410 Breakout, viser det sig, at de GRect og GOval og andre sådanne ting, 373 00:21:17,410 --> 00:21:19,650 dem er faktisk pointers under hætten. 374 00:21:19,650 --> 00:21:23,430 >> Men Stanford, ligesom os, en slags af huder der detaljeret i det mindste for bibliotekerne 375 00:21:23,430 --> 00:21:26,540 formål, ligesom vi gør for snor og char *. 376 00:21:26,540 --> 00:21:30,060 Men GRect og GOval og alle de ting du fyre er eller vil bruge 377 00:21:30,060 --> 00:21:32,630 denne uge i sidste ende er hukommelse adresser. 378 00:21:32,630 --> 00:21:33,650 Du skal bare ikke kender det. 379 00:21:33,650 --> 00:21:37,240 >> Så det er ikke overraskende, da, måske, som du måske tur over nogle 380 00:21:37,240 --> 00:21:38,580 segmentering fejl. 381 00:21:38,580 --> 00:21:41,290 Men hvad er interessant her nu, hvis det efter vi kontrollere for 0 vi gør 382 00:21:41,290 --> 00:21:43,460 streng t får sek. 383 00:21:43,460 --> 00:21:44,690 Nå, lad mig erklære t. 384 00:21:44,690 --> 00:21:47,730 Jeg har tænkt mig at tegne den som en firkant, 32 bits, kalde det t. 385 00:21:47,730 --> 00:21:49,740 Og så jeg har tænkt mig at gøre, får s. 386 00:21:49,740 --> 00:21:51,130 >> Nå, hvad betyder det? 387 00:21:51,130 --> 00:21:53,280 Tja, det er lidt svært at tænke om det forestiller klogt. 388 00:21:53,280 --> 00:21:55,025 Men lad os tænke over hvad der er inde i x? 389 00:21:55,025 --> 00:21:59,430 Hvad er bogstaveligt talt inde i denne variabel? 390 00:21:59,430 --> 00:22:01,500 Værdien Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Så når jeg siger string t får s, der bare bogstaveligt betyder tage nummer 392 00:22:05,815 --> 00:22:10,070 i s, hvilket er Ox123 og sætte det Ox123. 393 00:22:10,070 --> 00:22:13,740 Eller billedligt, hvis jeg slags abstrakt væk fra denne detalje har den 394 00:22:13,740 --> 00:22:16,600 virkning bogstaveligt gøre det så godt. 395 00:22:16,600 --> 00:22:22,110 >> Så nu, tænke tilbage til sidste uge, da vi fortsatte med at kapitalistiske T. I 396 00:22:22,110 --> 00:22:23,800 gjorde T beslag 0. 397 00:22:23,800 --> 00:22:27,150 Nå, T beslag 0, selvom det er en pointer, kan du behandle den, som om 398 00:22:27,150 --> 00:22:29,220 det er en matrix, med en kvadratisk beslag notation. 399 00:22:29,220 --> 00:22:31,550 >> Så hvor er T beslag 0? 400 00:22:31,550 --> 00:22:32,990 Tja, det er h. 401 00:22:32,990 --> 00:22:36,800 Og så når vi bruger denne linje kode, to øverste, som er i det c type.h 402 00:22:36,800 --> 00:22:38,460 header fil, det er hvor det erklærede. 403 00:22:38,460 --> 00:22:44,410 Du kapitalisere denne H. Men Selvfølgelig, det er nøjagtig de samme h, der er 404 00:22:44,410 --> 00:22:46,540 indersiden af ​​s, så at sige. 405 00:22:46,540 --> 00:22:51,930 Og så nu du har ændret eller kapitaliseret både den oprindelige og 406 00:22:51,930 --> 00:22:53,120 såkaldt kopi. 407 00:22:53,120 --> 00:22:56,620 Fordi du ikke lave en kopi i måde, at et menneske ville have det til at være. 408 00:22:56,620 --> 00:22:59,710 >> Så hvad var fix her i copy1.c sidste uge? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funktioner, så vi kunne faktisk kopiere strengen. 411 00:23:05,580 --> 00:23:08,700 Og fundamentalt, hvad vi har brug for at gøre for at kopiere strengen? 412 00:23:08,700 --> 00:23:12,070 >> Tja, i denne grønne version her er jeg vil gøre det temmelig lavt niveau. 413 00:23:12,070 --> 00:23:14,260 Der er faktisk fungerer de kunne hjælpe med dette. 414 00:23:14,260 --> 00:23:17,710 Men den mest grundlæggende en, og de mest velkendt en, i det mindste, vil snart være 415 00:23:17,710 --> 00:23:19,600 velkendt for os, er følgende - 416 00:23:19,600 --> 00:23:21,910 så man på den første linje kode i grøn nu. 417 00:23:21,910 --> 00:23:23,970 >> Jeg skrev s som char *. 418 00:23:23,970 --> 00:23:25,250 Der er ingen funktionel forskel der. 419 00:23:25,250 --> 00:23:28,790 Jeg bare smed CS50 bibliotek og Jeg kalder det, hvad det er, en char *. 420 00:23:28,790 --> 00:23:31,640 >> Nu dot, dot, dot, fordi der var nogle fejlkontrol, der er ikke 421 00:23:31,640 --> 00:23:33,200 interessant at tale om igen. 422 00:23:33,200 --> 00:23:34,710 Så nu t deklareres. 423 00:23:34,710 --> 00:23:35,780 Det er også en char *. 424 00:23:35,780 --> 00:23:38,280 Så jeg trak en lille firkant på skærmen som før. 425 00:23:38,280 --> 00:23:41,870 >> Men på den højre side, malloc vi sagde, er hukommelsen tildele. 426 00:23:41,870 --> 00:23:44,130 Så afsætte nogle luns af hukommelse. 427 00:23:44,130 --> 00:23:48,830 Og hvor mange bytes gør vi faktisk ønsker at tildele, virker det? 428 00:23:48,830 --> 00:23:50,340 >> Nå, strengen længden af ​​s. 429 00:23:50,340 --> 00:23:52,310 Så hvis det er hej, der er kommer til at være fem. 430 00:23:52,310 --> 00:23:53,950 Vi vil sige 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 så plus 1, hvorfor? 1 433 00:23:57,960 --> 00:23:58,830 De 0 tegn. 434 00:23:58,830 --> 00:24:03,640 Hvis vi ikke giver plads til denne fyr vi uheld kan skabe en situation, 435 00:24:03,640 --> 00:24:05,600 hvor strengen er h-e-L-L-o. 436 00:24:05,600 --> 00:24:08,470 Og så næste gang getString er kaldet og jeg skriver i, for eksempel, 437 00:24:08,470 --> 00:24:14,020 David D-a-v-i-d, computeren går at tro, at s er faktisk 438 00:24:14,020 --> 00:24:18,900 h-e-L-L-o-d-a-v-i-d fordi der er ingen pause i mellem disse ord. 439 00:24:18,900 --> 00:24:19,810 >> Så vi har brug for den pause. 440 00:24:19,810 --> 00:24:20,720 Så vi ønsker ikke fem. 441 00:24:20,720 --> 00:24:22,100 Vi ønsker seks bytes. 442 00:24:22,100 --> 00:24:23,110 >> Og bytes jeg siger. 443 00:24:23,110 --> 00:24:25,220 Men det er virkelig på tide størrelse char. 444 00:24:25,220 --> 00:24:28,040 Teknisk char er næsten altid en enkelt byte. 445 00:24:28,040 --> 00:24:31,030 >> Men bare for at gøre vores kode bærbare, så at sige, så det fungerer på 446 00:24:31,030 --> 00:24:33,750 forskellige computere, selvom de måske være noget anderledes under 447 00:24:33,750 --> 00:24:36,590 hætte, jeg kommer til at generisk sige størrelse af char så 448 00:24:36,590 --> 00:24:37,660 min kode altid arbejde. 449 00:24:37,660 --> 00:24:40,610 Og jeg behøver ikke at kompilere det bare fordi jeg opgradere min computer, eller brug 450 00:24:40,610 --> 00:24:42,140 nogle forskellige platform. 451 00:24:42,140 --> 00:24:45,300 >> Så jeg har fået 6 gange størrelsen af en char, hvilket sker for at være 1.. 452 00:24:45,300 --> 00:24:47,440 Så det betyder malloc kunne giv mig seks bytes. 453 00:24:47,440 --> 00:24:49,140 Hvad er det egentlig gør? 454 00:24:49,140 --> 00:24:52,810 Nå, lad mig rulle tilbage i tiden her , hvor vi er i historien. 455 00:24:52,810 --> 00:24:57,620 >> Så hvis jeg gå tilbage her, har jeg erklæret en char * kaldet t. 456 00:24:57,620 --> 00:25:00,280 Jeg har nu kaldt malloc for seks bytes. 457 00:25:00,280 --> 00:25:06,400 Og nu vil jeg til at trække disse seks bytes ligesom array tidligere. 458 00:25:06,400 --> 00:25:10,570 Men jeg ved faktisk ikke, hvad der er inde i denne matrix. 459 00:25:10,570 --> 00:25:14,640 >> Hvis du allokere hukommelse det sig, at du kan ikke tillid til, at der er nogle 460 00:25:14,640 --> 00:25:15,810 kendte værdi der. 461 00:25:15,810 --> 00:25:18,400 Det kunne have været brugt af noget andet, nogle andre funktioner, nogle andre 462 00:25:18,400 --> 00:25:19,630 linje kode, du skrev. 463 00:25:19,630 --> 00:25:22,870 Så vi vil generelt kalde disse skrald værdier og trække dem, måske, som 464 00:25:22,870 --> 00:25:26,170 spørgsmålstegn, blot indikerer, at vi ikke ved, hvad er faktisk der. 465 00:25:26,170 --> 00:25:30,390 Og det er ikke nogen big deal, så længe vi er kloge nok til at overskrive dem 466 00:25:30,390 --> 00:25:34,550 skrald værdier med tal eller chars, som vi holder af. 467 00:25:34,550 --> 00:25:36,340 >> Så i dette tilfælde, hvad skal jeg gøre? 468 00:25:36,340 --> 00:25:38,670 Nå, min linje kode næste, jeg har fire. 469 00:25:38,670 --> 00:25:41,350 int jeg får 0, n får streng længde sek. 470 00:25:41,350 --> 00:25:42,750 Så en velkendt for løkke. 471 00:25:42,750 --> 00:25:45,875 Jeg er mindre end eller lig med n, som normalt er oven. 472 00:25:45,875 --> 00:25:47,500 >> Men denne gang er det bevidst. 473 00:25:47,500 --> 00:25:51,890 I + +, og så vil jeg bare gøre t beslag I får sek. 474 00:25:51,890 --> 00:25:56,320 Fordi min billedet ligner dette på dette øjeblik, gemt på t er den 475 00:25:56,320 --> 00:25:59,530 adressen på denne tilfældige bid af hukommelse hvis værdier er ukendt. 476 00:25:59,530 --> 00:26:03,030 Men så snart jeg gør t beslag 0, der sætter mig her. 477 00:26:03,030 --> 00:26:07,430 >> Og hvad ender med at få trukket der? 478 00:26:07,430 --> 00:26:08,740 Vi ender med at sætte h. 479 00:26:08,740 --> 00:26:11,170 Fordi det er hvad der er på s beslag 0. 480 00:26:11,170 --> 00:26:14,300 Og så de samme ting for e, og L og L og o. 481 00:26:14,300 --> 00:26:17,930 >> n, hvorfor jeg går op gennem et lig n? 482 00:26:17,930 --> 00:26:19,200 På grund af den 0 tegn. 483 00:26:19,200 --> 00:26:23,580 Så bare for at være klar, så hvis jeg faktisk sletter alt disse skrald 484 00:26:23,580 --> 00:26:28,870 værdier er, og derefter rent faktisk trække i hvad jeg forventer, det er s beslag 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, plus der er efterstillede ny karakter. 486 00:26:32,440 --> 00:26:36,080 >> Og så nu, hvis vi fortsatte forbi prik, dot, dot i denne korrekte version 487 00:26:36,080 --> 00:26:41,930 og kapitaliserede t beslag 0 Jeg vil af Selvfølgelig skal udnytte netop dette 488 00:26:41,930 --> 00:26:47,050 fyr her, hvilket begrebsmæssigt i sidste ende målet. 489 00:26:47,050 --> 00:26:48,040 Så det er alle de pointer er. 490 00:26:48,040 --> 00:26:51,430 >> Og du har brugt dem i flere uger nu i forbindelse med strengene. 491 00:26:51,430 --> 00:26:53,530 Men under hætten, de er lidt mere kompliceret. 492 00:26:53,530 --> 00:26:57,520 Men hvis du tænker over dem i denne billedlig form, foreslår jeg, at de er 493 00:26:57,520 --> 00:27:01,720 formentlig ikke alt det skræmmende, som de måske først synes ved første øjekast, 494 00:27:01,720 --> 00:27:04,730 især med en sådan ny syntaks. 495 00:27:04,730 --> 00:27:07,290 Eventuelle spørgsmål vedrørende pointere, strings, eller chars? 496 00:27:07,290 --> 00:27:07,580 Ja? 497 00:27:07,580 --> 00:27:09,252 >> PUBLIKUM: Kan du gå tilbage til [uhørligt]? 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Sure. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> PUBLIKUM: Så hvordan kommer i din allersidste line, behøver du ikke have en * t linje 501 00:27:19,525 --> 00:27:21,513 og et * s på linjen? 502 00:27:21,513 --> 00:27:23,004 Har du ikke har henvisningen til - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ah, en virkelig godt spørgsmål. 504 00:27:24,640 --> 00:27:26,800 Hvorfor kan jeg ikke har en * t og et * s? 505 00:27:26,800 --> 00:27:30,340 Fordi kortvarigt, i sidste uge, ligesom i vores swap-funktion, jeg siger, at når 506 00:27:30,340 --> 00:27:33,350 du har fået en pointer de midler som du går der, som vi gjorde 507 00:27:33,350 --> 00:27:36,590 fysisk på scenen, var faktisk bruge stjerne operatør. 508 00:27:36,590 --> 00:27:40,570 >> Det viser sig, at denne kvadrat-beslag notation er, hvad vi vil kalde syntaktisk 509 00:27:40,570 --> 00:27:44,190 sukker, der er bare en sexet måde siger det stenografi notation for 510 00:27:44,190 --> 00:27:45,950 præcis, hvad du beskriver. 511 00:27:45,950 --> 00:27:49,385 Men det er lidt mere intuitiv. 512 00:27:49,385 --> 00:27:53,510 Og risikoen for at gøre dette synes mere kompliceret end det behøver at være, 513 00:27:53,510 --> 00:27:56,990 hvad der virkelig foregår her er følgende - 514 00:27:56,990 --> 00:28:01,450 Hvis jeg siger * t, der betyder at gå til adressen lagres i t. 515 00:28:01,450 --> 00:28:04,350 >> Så bogstaveligt, hvis t gemmer adressen på h 516 00:28:04,350 --> 00:28:07,300 i første omgang, * t midler gå her. 517 00:28:07,300 --> 00:28:10,730 Nu, hvad t beslag 0 betyde? 518 00:28:10,730 --> 00:28:11,560 Samme nøjagtige ting. 519 00:28:11,560 --> 00:28:13,510 Det er bare lidt mere brugervenlig venlig at skrive. 520 00:28:13,510 --> 00:28:14,430 >> Men jeg er ikke færdig endnu. 521 00:28:14,430 --> 00:28:17,800 Jeg kan ikke bare sige * t får * s. 522 00:28:17,800 --> 00:28:19,440 For hvad skulle jeg gøre så? 523 00:28:19,440 --> 00:28:22,950 Jeg ville være at sætte h, h, h, h, h gennem det hele. 524 00:28:22,950 --> 00:28:22,995 Right? 525 00:28:22,995 --> 00:28:26,020 >> Fordi * t er at gå til adressen i t. 526 00:28:26,020 --> 00:28:27,580 Men vi er inde i en løkke. 527 00:28:27,580 --> 00:28:32,150 Og hvilken værdi jeg forøgning, naturligvis? på hver iteration 528 00:28:32,150 --> 00:28:32,690 I. 529 00:28:32,690 --> 00:28:34,590 >> Men der er en mulighed her, ikke? 530 00:28:34,590 --> 00:28:37,870 Selvom det føles som om det er at få lidt mere sofistikeret 531 00:28:37,870 --> 00:28:40,730 end kvadrat-beslag notation Vi har brugt et stykke tid - 532 00:28:40,730 --> 00:28:43,840 lad mig fortryde mit h forandring der - 533 00:28:43,840 --> 00:28:48,870 selvom det er nu at få lidt amatør, den grundlæggende ide, hvis * t 534 00:28:48,870 --> 00:28:53,630 betyder her, og * t er bare gå til adressen i t.. 535 00:28:53,630 --> 00:28:54,990 >> Men hvad var adressen i t? 536 00:28:54,990 --> 00:28:56,850 Antallet holder vi bruger? 537 00:28:56,850 --> 00:29:00,540 Ligesom Ox456, lad os bringe det tilbage netop af hensyn til diskussion. 538 00:29:00,540 --> 00:29:05,380 Tja, hvis jeg ønsker at få på ei t streng, jeg ønsker blot at gå til, 539 00:29:05,380 --> 00:29:06,460 væsentlige 456. 540 00:29:06,460 --> 00:29:09,230 >> Eller rettere, 457. 541 00:29:09,230 --> 00:29:10,590 Jeg har bare brug for at tilføje en. 542 00:29:10,590 --> 00:29:11,790 Men jeg kan gøre det, right? 543 00:29:11,790 --> 00:29:14,680 Fordi t, selvom jeg holder tegning det nu som en pil, er det blot et 544 00:29:14,680 --> 00:29:16,570 nummer, Ox456. 545 00:29:16,570 --> 00:29:21,400 Og hvis jeg tilføje en til det, eller mere generelt, hvis jeg tilføjer jeg til, at jeg kan 546 00:29:21,400 --> 00:29:24,350 faktisk få præcis, hvor jeg vil. 547 00:29:24,350 --> 00:29:26,260 Så hvis jeg rent faktisk gør det - 548 00:29:26,260 --> 00:29:28,970 og dette er, hvad der nu kaldes pointer aritmetik - 549 00:29:28,970 --> 00:29:30,375 Jeg kan fjerne denne linje. 550 00:29:30,375 --> 00:29:33,550 Hvilket er, helt ærligt, jeg tror klarere og lidt mere brugervenlig at læse. 551 00:29:33,550 --> 00:29:35,970 Men det er ikke mindre korrekt. 552 00:29:35,970 --> 00:29:38,570 >> Denne linje kode nu bruger pointer aritmetik. 553 00:29:38,570 --> 00:29:40,920 Det siger gå til efter adresse - 554 00:29:40,920 --> 00:29:44,670 uanset starten af ​​t er, som er t plus jeg, som i første omgang 555 00:29:44,670 --> 00:29:45,730 er 0, hvilket er fantastisk. 556 00:29:45,730 --> 00:29:49,280 Fordi det betyder starten på t plus 1 plus 2, plus 3, og så videre. 557 00:29:49,280 --> 00:29:51,030 Og den samme aftale med s. 558 00:29:51,030 --> 00:29:52,750 >> Så syntaktisk sukker til dette. 559 00:29:52,750 --> 00:29:55,900 Men at forstå, hvad der virkelig foregår under hætten, vil jeg hævde, 560 00:29:55,900 --> 00:29:57,410 er faktisk nyttige i sig selv. 561 00:29:57,410 --> 00:30:00,620 Fordi det betyder nu er der ikke meget mere magic foregår 562 00:30:00,620 --> 00:30:01,620 under hætten. 563 00:30:01,620 --> 00:30:03,920 Der vil ikke være mange flere lag, som vi kan skrælle for dig. 564 00:30:03,920 --> 00:30:04,810 Dette er ca. 565 00:30:04,810 --> 00:30:06,410 Og det er programmering. 566 00:30:06,410 --> 00:30:08,002 Virkelig godt spørgsmål. 567 00:30:08,002 --> 00:30:11,570 >> Okay, så dette var, at buggy program jeg henviste til tidligere. 568 00:30:11,570 --> 00:30:12,650 swap var behæftet med fejl. 569 00:30:12,650 --> 00:30:14,070 Hvis synes at arbejde. 570 00:30:14,070 --> 00:30:17,390 Husk på, at ligesom med mælk og appelsinsaft - som jeg startede 571 00:30:17,390 --> 00:30:18,660 drikker dagens demonstration. 572 00:30:18,660 --> 00:30:22,220 Så ligesom med appelsinsaft og mælken, vi nødt til at bruge en 573 00:30:22,220 --> 00:30:26,200 midlertidig variabel tmp, at holde en midlertidigt, så vi kunne derefter 574 00:30:26,200 --> 00:30:28,820 ændre værdien og derefter opdatere b. 575 00:30:28,820 --> 00:30:32,870 >> Men denne funktion, sagde vi, eller det program, hvor denne funktion blev 576 00:30:32,870 --> 00:30:35,670 skrevet var forkert og mangelfuld, hvorfor? 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 >> PUBLIKUM: [uhørlig]. 580 00:30:42,471 --> 00:30:44,940 >> SPEAKER 1: Præcis, når du kalder swap - 581 00:30:44,940 --> 00:30:47,820 eller mere generelt, når man kalde de fleste enhver funktion - 582 00:30:47,820 --> 00:30:51,210 Hvis argumenterne til denne funktion er primitive, så at sige, ints og chars 583 00:30:51,210 --> 00:30:56,740 og double og flåd, ting uden stjerner, er du passerer en kopi af 584 00:30:56,740 --> 00:30:57,540 argumentet. 585 00:30:57,540 --> 00:31:01,580 Så hvis x var 1 og y var 2 er en going at være 1 og b vil være 2. 586 00:31:01,580 --> 00:31:05,250 Men de kommer til at være forskellige bidder af bits, forskellige bidder af 587 00:31:05,250 --> 00:31:07,540 hukommelse, som tilfældigvis opbevaring identiske værdier. 588 00:31:07,540 --> 00:31:12,160 >> Så denne kode er super perfekt at bytte a og b. 589 00:31:12,160 --> 00:31:13,850 Det er ikke god til at bytte - 590 00:31:13,850 --> 00:31:15,290 i sidste uges eksempel - 591 00:31:15,290 --> 00:31:16,390 x og y. 592 00:31:16,390 --> 00:31:18,780 Fordi igen, de er i den forkerte rækkevidde. 593 00:31:18,780 --> 00:31:21,310 >> Nu, hvordan gik vi gå om fastsættelse det? 594 00:31:21,310 --> 00:31:23,140 Vi havde at gøre funktionen ser lidt grimmere. 595 00:31:23,140 --> 00:31:25,250 Men igen, overveje, hvad dette blot betyder. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> Og faktisk, lad mig, for konsistens, ændre én ting, så det er identisk med 598 00:31:31,500 --> 00:31:33,200 hvad vi lige gjorde. 599 00:31:33,200 --> 00:31:35,690 Som jeg nævnte i sidste uge, er det ikke noget, hvor det går. 600 00:31:35,690 --> 00:31:38,120 Faktisk du typisk ville sætte stjerne ud for variabelnavnet. 601 00:31:38,120 --> 00:31:40,750 Men jeg tror, ​​det ville være lidt lettere at overveje * ved siden af 602 00:31:40,750 --> 00:31:44,910 datatype således, det er en pegepind til en int i dette tilfælde. 603 00:31:44,910 --> 00:31:46,270 >> Så hvad laver jeg her? 604 00:31:46,270 --> 00:31:49,590 Jeg siger ikke at give mig en int efterfulgt af en anden int, 605 00:31:49,590 --> 00:31:50,810 kalde dem a og b. 606 00:31:50,810 --> 00:31:52,460 Giv mig adressen på en int. 607 00:31:52,460 --> 00:31:53,960 Giv mig adressen på en anden int. 608 00:31:53,960 --> 00:31:56,330 Ring disse adresser a og b. 609 00:31:56,330 --> 00:32:00,860 >> Og derefter bruge * notation ned nedenfor, gå til hver af disse adresser 610 00:32:00,860 --> 00:32:05,290 som nødvendigt til enten at få eller indstille sin værdi. 611 00:32:05,290 --> 00:32:07,400 Men der er en undtagelse her. 612 00:32:07,400 --> 00:32:11,130 Hvorfor har jeg ikke en * ved siden tmp? 613 00:32:11,130 --> 00:32:15,070 Hvorfor skal jeg ikke gøre det, for eksempel? 614 00:32:15,070 --> 00:32:19,370 Det føles som om jeg bare skulle gå hele ud og korrigere det hele. 615 00:32:19,370 --> 00:32:19,752 Ja? 616 00:32:19,752 --> 00:32:21,002 >> PUBLIKUM: [uhørlig]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> SPEAKER 1: Jeg har ikke erklæret tmp som en streng. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Så det ville erklære, i dette tilfælde, en tmp til at være adressen på en int. 621 00:32:34,950 --> 00:32:37,380 Men det er ikke helt, hvad jeg vil, for et par grunde. 622 00:32:37,380 --> 00:32:38,616 >> PUBLIKUM: Du ønsker ikke at bytte dem. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Præcis, jeg ønsker ikke at bytte noget med tmp. tmp er bare 624 00:32:41,800 --> 00:32:42,790 uge én ting. 625 00:32:42,790 --> 00:32:45,150 Alt hvad jeg ønsker, er en variabel at gemme nogle tal. 626 00:32:45,150 --> 00:32:47,330 Jeg kan ikke engang bekymre sig om adresser på dette tidspunkt. 627 00:32:47,330 --> 00:32:50,530 >> Jeg har bare brug 32 bit så for at gemme en int. 628 00:32:50,530 --> 00:32:56,690 Og jeg ønsker at sætte i disse 32 bits hvad er ikke i en, så at sige, men 629 00:32:56,690 --> 00:33:01,260 hvad der er en, bare for at være mere præcis. 630 00:33:01,260 --> 00:33:06,420 For hvis en er en adresse, * et middel gå der og få værdien 1.. 631 00:33:06,420 --> 00:33:10,560 For eksempel i sidste uges eksempel eller b vedkommende få værdien af ​​2.. 632 00:33:10,560 --> 00:33:11,750 >> Så hvad der virkelig foregår? 633 00:33:11,750 --> 00:33:15,070 Lad mig tegne et billede her, der vil kun drille hinanden en del af i dag. 634 00:33:15,070 --> 00:33:18,580 Men det vil fortsætte med at blive vist i temmelig lang tid. 635 00:33:18,580 --> 00:33:22,430 >> Det jeg hævder, er, hvad din computers hukommelse ser ud, når du kører en 636 00:33:22,430 --> 00:33:24,060 program, et program. 637 00:33:24,060 --> 00:33:28,340 Når du kører et program øverst af din computers RAM - så tænk på 638 00:33:28,340 --> 00:33:33,530 denne rektangel, virkelig, som din computerens RAM eller hukommelse, alle 101 639 00:33:33,530 --> 00:33:36,920 milliard bytes af det, alt to milliarder bytes, alle to gigabyte det, 640 00:33:36,920 --> 00:33:39,910 uanset mængde, du har, er, lad os tegne den som en firkant. 641 00:33:39,910 --> 00:33:43,260 Og jeg påstå, at når du kører et program som Microsoft Word eller Chrome 642 00:33:43,260 --> 00:33:49,220 eller noget lignende, de bit, Microsoft eller at Google skrev - 643 00:33:49,220 --> 00:33:50,910 i tilfælde af disse programmer - 644 00:33:50,910 --> 00:33:54,490 er indlæst i computerens hukommelse hvor de kan udføres mere 645 00:33:54,490 --> 00:33:57,520 hurtigt og føres ind i CPU'en, som er hjerner af computeren. 646 00:33:57,520 --> 00:34:00,940 >> Og i TAM de er gemt i det toppen af ​​dit program, så at sige. 647 00:34:00,940 --> 00:34:03,300 Med andre ord, det, hvis er en bid af hukommelse, når du dobbeltklikker på 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, de bits kommer off harddisken. 649 00:34:05,740 --> 00:34:06,680 De bliver indlæst i RAM. 650 00:34:06,680 --> 00:34:10,330 Og vi vil skubbe dem op på toppen af denne rektangel konceptuelt. 651 00:34:10,330 --> 00:34:13,010 >> Nå, resten af ​​din hukommelse er bruges til forskellige ting. 652 00:34:13,010 --> 00:34:16,460 På toppen kan du se initialisere data og uninitialize data. 653 00:34:16,460 --> 00:34:20,500 Dette har at gøre, for det meste, med konstanter eller globale variabler 654 00:34:20,500 --> 00:34:21,340 der har værdier. 655 00:34:21,340 --> 00:34:22,980 Men mere om dem en anden gang. 656 00:34:22,980 --> 00:34:25,150 >> Så har du den bunke, der vi vil komme tilbage til. 657 00:34:25,150 --> 00:34:28,420 Men på bunden er den del, der er især Germane lige nu. 658 00:34:28,420 --> 00:34:30,210 Det er den såkaldte stack. 659 00:34:30,210 --> 00:34:33,850 Så ligesom i de fleste helst D hal her på campus, du har disse bakker, 660 00:34:33,850 --> 00:34:37,210 bare stables oven på hinanden, som kan du sætte mad og whatnot. 661 00:34:37,210 --> 00:34:40,139 Stakken i et edb-system er meget ens. 662 00:34:40,139 --> 00:34:42,679 Undtagen mens bakken, da vi bruger i spisesal, selvfølgelig, betød er 663 00:34:42,679 --> 00:34:45,710 at bære ting bakkerne eller rammer - 664 00:34:45,710 --> 00:34:49,469 som vi kalder dem - på en computers hukommelse bruges til at holde 665 00:34:49,469 --> 00:34:51,610 variabler og værdier. 666 00:34:51,610 --> 00:34:53,929 >> Så hvad der virkelig foregår under hætten? 667 00:34:53,929 --> 00:34:55,820 Nå, lad mig flipover til skærmen her. 668 00:34:55,820 --> 00:34:58,370 Og lad os nøjes med at fokusere på nederste del et øjeblik. 669 00:34:58,370 --> 00:35:02,770 Hvis dette er den nederste del af min computerens hukommelse det viser sig, når jeg 670 00:35:02,770 --> 00:35:05,350 kalder funktionen main - hvilket sker, helt ærligt, 671 00:35:05,350 --> 00:35:06,950 automatisk for mig - 672 00:35:06,950 --> 00:35:10,510 Jeg får en luns af hukommelsen på bunden af ​​mit RAM, så at sige. 673 00:35:10,510 --> 00:35:13,390 Og det er her main er lokale variable går. 674 00:35:13,390 --> 00:35:16,770 Det er hvor argc og argv måske hen, og eventuelle variable I 675 00:35:16,770 --> 00:35:18,170 erklære inde i main. 676 00:35:18,170 --> 00:35:20,260 De ender i bunden af min computers RAM. 677 00:35:20,260 --> 00:35:25,040 >> Antag nu, at de vigtigste opkald om funktion Ligesom swap, kunne lide det i sidste uge? 678 00:35:25,040 --> 00:35:30,620 Nå, vi hovedsagelig sætte en ny bakke, en ny ramme, på min luns af hukommelse. 679 00:35:30,620 --> 00:35:34,160 Og jeg har tænkt mig at betegne det som tilhører swap-funktion. 680 00:35:34,160 --> 00:35:35,770 >> Nu, hvad der er inde i swap? 681 00:35:35,770 --> 00:35:39,240 Nå, baseret på sidste uges program, og den, vi lige har set et uddrag fra, 682 00:35:39,240 --> 00:35:46,590 indersiden af ​​swaps ramme på eller swappens bakke, hvad er variabler? 683 00:35:46,590 --> 00:35:47,970 Nå, a og b. 684 00:35:47,970 --> 00:35:51,850 Fordi det var dens lokale argumenter plus en tredje tmp. 685 00:35:51,850 --> 00:35:54,470 Så virkelig, jeg kunne tegne det lidt mere rent. 686 00:35:54,470 --> 00:35:56,680 Lad mig gå videre og fortryde etiketten. 687 00:35:56,680 --> 00:35:58,520 Og lad mig påstå, at du ved, hvad? 688 00:35:58,520 --> 00:36:00,560 >> en er sandsynligvis kommer til at ende her. 689 00:36:00,560 --> 00:36:02,160 B kommer til at ende op her. 690 00:36:02,160 --> 00:36:03,810 Og tmp kommer til at ende op her. 691 00:36:03,810 --> 00:36:05,160 Nu bestilling måske være lidt anderledes. 692 00:36:05,160 --> 00:36:06,840 Men begrebsmæssigt det er ideen. 693 00:36:06,840 --> 00:36:11,490 >> Og netop kollektivt, dette er hvad vi vil kalde swappens ramme eller 694 00:36:11,490 --> 00:36:12,136 spisesalen bakken. 695 00:36:12,136 --> 00:36:13,150 Og den samme aftale med de vigtigste. 696 00:36:13,150 --> 00:36:14,040 Men jeg vil ikke gentegne det. 697 00:36:14,040 --> 00:36:17,810 Men det er der argc og argv og enhver sine lokale variabler som x og y 698 00:36:17,810 --> 00:36:18,940 kunne være så godt. 699 00:36:18,940 --> 00:36:22,170 >> Så nu overveje, hvad der virkelig sker når du kalder swap. 700 00:36:22,170 --> 00:36:26,370 Når du ringer til swap, udførelse kode som dette, er du passerer i 701 00:36:26,370 --> 00:36:30,670 buggy version a og b kopier af x og y. 702 00:36:30,670 --> 00:36:34,300 Så hvis jeg gør nu trækker denne på skærmen - 703 00:36:34,300 --> 00:36:36,700 fik at blive bedre til det - 704 00:36:36,700 --> 00:36:40,850 så historien jeg fortalte til mig selv var i denne fejlbehæftet udgave, når vi 705 00:36:40,850 --> 00:36:46,130 ringe swap passerer bogstaveligt a og b som heltal, hvad der virkelig sker? 706 00:36:46,130 --> 00:36:48,250 >> Nå, hvad der virkelig sker, er dette. 707 00:36:48,250 --> 00:36:52,850 Lad mig gå videre og fortryde bare for at rydde noget plads her. 708 00:36:52,850 --> 00:36:54,720 Så dette er min computers hukommelse. 709 00:36:54,720 --> 00:36:57,510 >> Så hvis jeg har, for eksempel - 710 00:36:57,510 --> 00:36:58,910 faktisk lad os gøre det på denne måde - 711 00:36:58,910 --> 00:37:02,690 hvis jeg hævder, at det er x, lagring værdien 1, ligesom i sidste uge. 712 00:37:02,690 --> 00:37:05,930 Og dette er y, lagring værdien 2 ligesom i sidste uge. 713 00:37:05,930 --> 00:37:11,370 Og det er vigtigste, når jeg kalder swap, derved give mig adgang til en og 714 00:37:11,370 --> 00:37:15,150 b og tmp, vil jeg hævde, at dette er en og dette er 1.. 715 00:37:15,150 --> 00:37:16,080 >> Dette er b.. 716 00:37:16,080 --> 00:37:17,010 Det er 2.. 717 00:37:17,010 --> 00:37:18,370 Dette kaldes tmp. 718 00:37:18,370 --> 00:37:23,360 >> Og i første omgang, det har nogle skrald værdi indtil jeg faktisk gemme i det, 719 00:37:23,360 --> 00:37:24,450 hvilket er 1. 720 00:37:24,450 --> 00:37:28,320 Så jeg gå videre og ændre en at være, hvad? 721 00:37:28,320 --> 00:37:29,720 B værdi. 722 00:37:29,720 --> 00:37:31,980 >> Og så nu har jeg to her. 723 00:37:31,980 --> 00:37:34,050 Og så sagde vi b. får tmp. 724 00:37:34,050 --> 00:37:37,670 Igen, ligesom en tilregnelighed kontrollere, den tredje linje kode her er simpelthen dette 725 00:37:37,670 --> 00:37:39,440 en, b får tmp. 726 00:37:39,440 --> 00:37:41,730 >> Og så endelig, hvad gør jeg? 727 00:37:41,730 --> 00:37:46,800 Jeg går videre og ændre på b for at være, hvad værdien af ​​TMP er, hvilket er 1. 728 00:37:46,800 --> 00:37:48,390 Jeg ikke røre tmp igen. 729 00:37:48,390 --> 00:37:54,100 >> Men nu er problemet så hurtigt som swap afkast, fordi det ikke er uddele 730 00:37:54,100 --> 00:37:57,540 tilbage vis værdi, er der ingen vej tilbage erklæring eksplicit i det. 731 00:37:57,540 --> 00:37:59,080 Hvad er der egentlig? 732 00:37:59,080 --> 00:38:03,480 Nå, hovedsagelig al denne hukommelse - 733 00:38:03,480 --> 00:38:07,410 OK, tilsyneladende viskelæderet lide kun én finger ad gangen - 734 00:38:07,410 --> 00:38:08,180 bare forsvinder. 735 00:38:08,180 --> 00:38:10,070 >> Nu i virkeligheden er det ikke steder. 736 00:38:10,070 --> 00:38:11,810 Men du kan tænke på det nu som spørgsmålstegn. 737 00:38:11,810 --> 00:38:14,040 Fordi det er ikke længere faktisk er i brug. 738 00:38:14,040 --> 00:38:17,470 Og intet sker med disse værdier. 739 00:38:17,470 --> 00:38:21,920 >> Så i tilfælde af grøn version af denne kode, hvad der i stedet blive 740 00:38:21,920 --> 00:38:24,640 ledes ind swap? 741 00:38:24,640 --> 00:38:25,770 Så henvender. 742 00:38:25,770 --> 00:38:28,520 Så adressen på x og adressen af ​​y. 743 00:38:28,520 --> 00:38:35,790 Så hvis vi re-fortæller denne historie en sidste tid, og jeg faktisk drage swap igen, 744 00:38:35,790 --> 00:38:44,620 men med pointere, bliver dette en, dette være b, og dette er tmp, hvad der er 745 00:38:44,620 --> 00:38:49,080 faktisk gemt i en i denne grønne version af min kode, hvor jeg passerer 746 00:38:49,080 --> 00:38:52,110 i adresser? 747 00:38:52,110 --> 00:38:53,780 >> Det kommer til at være en pegepind til x. 748 00:38:53,780 --> 00:38:54,890 Så jeg kunne tegne en pil. 749 00:38:54,890 --> 00:38:57,310 Men lad os bruge den samme vilkårlige eksempel som før. 750 00:38:57,310 --> 00:39:01,220 Lad os sige, at dette er noget som Ox123. 751 00:39:01,220 --> 00:39:04,970 Og det kommer til at være Ox127 fordi Det er fire bytes væk, fordi det er en 752 00:39:04,970 --> 00:39:07,370 int, så Ox127. 753 00:39:07,370 --> 00:39:09,080 >> Og igen, jeg tager nogle friheder med tallene. 754 00:39:09,080 --> 00:39:11,430 De er meget mindre, end de ville faktisk være og i en anden rækkefølge. 755 00:39:11,430 --> 00:39:14,350 Men det er, hvordan billedet er nu anderledes. 756 00:39:14,350 --> 00:39:19,060 >> Men når jeg bruger denne grønne kode og jeg int tmp får * et. 757 00:39:19,060 --> 00:39:25,010 * Et middel til at gøre følgende, tage tage der er i en og gå til den, 758 00:39:25,010 --> 00:39:26,190 hvilket er 1. 759 00:39:26,190 --> 00:39:28,480 Og det er hvad jeg derefter sat i tmp. 760 00:39:28,480 --> 00:39:32,480 I mellemtiden, i den næste linje kode her * a får b, hvad betyder det? 761 00:39:32,480 --> 00:39:36,910 >> Nå, * en, så gå her får * b, hvilket betyder derned. 762 00:39:36,910 --> 00:39:39,310 Og det betyder at sætte værdien til der. 763 00:39:39,310 --> 00:39:43,670 Endelig er den sidste linje kode sagde blot * b får tmp. 764 00:39:43,670 --> 00:39:48,900 >> Så b siger derned og overskrive det med tmp som i dette tilfælde, vil 765 00:39:48,900 --> 00:39:51,520 at være, igen, 1.. 766 00:39:51,520 --> 00:39:54,920 Og dette er grunden til, at grønne version af vores kode virker, mens den røde 767 00:39:54,920 --> 00:39:56,010 versionen aldrig gjorde. 768 00:39:56,010 --> 00:39:59,020 Det hele bare koges ned til, hvordan hukommelse er lykkedes, og hvor det er 769 00:39:59,020 --> 00:40:02,580 faktisk placeret i din computerens RAM. 770 00:40:02,580 --> 00:40:07,270 Og for nu, er, at en af ​​de ting, at stakken bliver brugt til. 771 00:40:07,270 --> 00:40:09,225 >> Spørgsmål om layout? 772 00:40:09,225 --> 00:40:10,380 På pointers? 773 00:40:10,380 --> 00:40:11,630 Eller på swap? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Okay, så malloc, tilbagekaldelse, gjorde noget som dette. 776 00:40:17,043 --> 00:40:18,260 Dette var en super simpelt eksempel. 777 00:40:18,260 --> 00:40:20,550 Og det var den ene, der Binky introducerede os til, omend helt 778 00:40:20,550 --> 00:40:21,870 hurtigt i slutningen af ​​klassen. 779 00:40:21,870 --> 00:40:24,480 Dammit, der går vi igen. 780 00:40:24,480 --> 00:40:28,780 >> Så minde om, at dette var det eksempel, Binky introducerede os til, omend 781 00:40:28,780 --> 00:40:30,360 noget hurtigt i slutningen af ​​klassen. 782 00:40:30,360 --> 00:40:33,640 Og her har vi brugt malloc virkelig for anden gang. 783 00:40:33,640 --> 00:40:37,330 Fordi den første gang vi brugte det til at skabe nok RAM, afsætte tilstrækkelig RAM 784 00:40:37,330 --> 00:40:38,340 at gemme en streng. 785 00:40:38,340 --> 00:40:40,250 >> Denne gang Binky holdt det simpelt. 786 00:40:40,250 --> 00:40:42,465 Så det er til at gemme bare en int, tilsyneladende. 787 00:40:42,465 --> 00:40:43,510 Og det er helt fint. 788 00:40:43,510 --> 00:40:46,560 Det er lidt underligt, helt ærligt, at bruge malloc at tildele én int. 789 00:40:46,560 --> 00:40:50,650 Men pointen i Nicks claymation var egentlig bare fortælle historien om, hvad 790 00:40:50,650 --> 00:40:53,830 sker eller ikke sker, når du mishandler hukommelse. 791 00:40:53,830 --> 00:40:56,520 >> Så i dette tilfælde, program dette gjorde et par ting. 792 00:40:56,520 --> 00:41:01,580 I det første tilfælde her, erklærer det en pointer kaldet x til en int. 793 00:41:01,580 --> 00:41:04,480 Derefter erklærer en pointer kaldet y til en int. 794 00:41:04,480 --> 00:41:06,150 Derefter gemmer i x, hvad? 795 00:41:06,150 --> 00:41:07,110 En anden nu. 796 00:41:07,110 --> 00:41:09,685 Hvad bliver gemt i x ifølge den tredje linje i dette program? 797 00:41:09,685 --> 00:41:12,380 >> PUBLIKUM: [uhørlig]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: Nå, ikke helt bytes, pr sige. 799 00:41:14,130 --> 00:41:16,760 Være mere præcis nu. 800 00:41:16,760 --> 00:41:18,325 Hvad bliver gemt i x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 En adresse, jeg tror jeg hørte det. 803 00:41:22,060 --> 00:41:23,570 >> Så hvad betyder malloc tilbage? 804 00:41:23,570 --> 00:41:26,030 malloc behaviorally allokerer en luns af hukommelse. 805 00:41:26,030 --> 00:41:27,850 Men hvordan ser det giver dig adgang til det? 806 00:41:27,850 --> 00:41:29,460 Den returnerer hvad? 807 00:41:29,460 --> 00:41:32,000 Adressen på den første byte i luns af hukommelsen. 808 00:41:32,000 --> 00:41:33,020 >> Nu, dette er super enkel. 809 00:41:33,020 --> 00:41:35,380 Det er bare én byte, hvilket betyder, at løse vi får tilbage er 810 00:41:35,380 --> 00:41:37,300 adresse af det hele. 811 00:41:37,300 --> 00:41:42,070 Så er lagret i x derefter, er adressen af denne luns af hukommelse. 812 00:41:42,070 --> 00:41:43,400 I mellemtiden, hvad der sker næste? 813 00:41:43,400 --> 00:41:45,890 Så egentlig, lad os gå videre og trække det ud virkelig hurtigt. 814 00:41:45,890 --> 00:41:52,490 >> Så hvis vi går over til skærmen her og vi spiller det ud int * x og int * y 815 00:41:52,490 --> 00:41:53,740 kommer til at gøre, hvad for mig? 816 00:41:53,740 --> 00:41:58,280 Jeg hævder, at det bare kommer til at gøre noget som dette og kalder det x, og 817 00:41:58,280 --> 00:42:00,010 dette og kalder det y. 818 00:42:00,010 --> 00:42:03,110 I mellemtiden, den tredje linje i koden er kommer til at allokere størrelsen af ​​en int, 819 00:42:03,110 --> 00:42:06,160 hvilket sker for at være - undskyld hvis jeg sagde en før jeg mente en int - 820 00:42:06,160 --> 00:42:08,280 fire byte på en typisk computer. 821 00:42:08,280 --> 00:42:09,720 Mindst med CS50 apparatet. 822 00:42:09,720 --> 00:42:11,490 >> Så dette kommer til at afsætte det, hvem ved? 823 00:42:11,490 --> 00:42:12,800 Somewhere herude. 824 00:42:12,800 --> 00:42:15,780 Og dette er gemt på nogle adresse Ox, hvem ved? 825 00:42:15,780 --> 00:42:18,330 Men hvad der kommer til at få returneret er denne adresse. 826 00:42:18,330 --> 00:42:22,270 Men vi vil drage dette billedligt som blot en pil som. 827 00:42:22,270 --> 00:42:25,430 >> Nu i den næste linje * x får 42. 828 00:42:25,430 --> 00:42:29,400 Hvad betyder * x betyder i lægmandssprog? 829 00:42:29,400 --> 00:42:30,040 Bare gå der. 830 00:42:30,040 --> 00:42:30,960 Gå til denne adresse. 831 00:42:30,960 --> 00:42:35,900 Eller med andre ord, skal du følge pil og sætte 42 der. 832 00:42:35,900 --> 00:42:38,140 Men så noget slemt er sket til Binky, right? 833 00:42:38,140 --> 00:42:43,950 >> Husk på, at linje fem her * y får 13, ja et uheldigt tal, 834 00:42:43,950 --> 00:42:44,760 gjorde hvad for os? 835 00:42:44,760 --> 00:42:47,320 Nå, * y midler gå der. 836 00:42:47,320 --> 00:42:50,460 Nå, dette er ikke blevet givet en værdi endnu, right? 837 00:42:50,460 --> 00:42:54,090 Koden har ikke y bliver initialiseret til noget. 838 00:42:54,090 --> 00:42:56,120 Vi havde x initialiseres til en adresse. 839 00:42:56,120 --> 00:42:57,640 Men y blev erklæret op øverst. 840 00:42:57,640 --> 00:43:00,250 Men så et semikolon, ingen værdi faktisk lægge i det. 841 00:43:00,250 --> 00:43:02,330 Så det er fair at kalde dette en skraldespand værdi. 842 00:43:02,330 --> 00:43:03,430 Hvem ved, hvad er der? 843 00:43:03,430 --> 00:43:07,160 Det er resterne af bits, der blev anvendt af nogle tidligere linje kode i 844 00:43:07,160 --> 00:43:08,300 mit program. 845 00:43:08,300 --> 00:43:13,250 >> Så hvis jeg siger gå der, det er ligesom, Jeg har ingen idé om, hvor denne pil er 846 00:43:13,250 --> 00:43:14,490 vil ende. 847 00:43:14,490 --> 00:43:17,720 Og det er, når du typisk få en segmentering skyld. 848 00:43:17,720 --> 00:43:22,430 Hvis du ved et uheld dereference, så at tale, eller gå til en adresse, der ikke er 849 00:43:22,430 --> 00:43:25,400 faktisk en legitim adresse, dårlige ting ske. 850 00:43:25,400 --> 00:43:27,550 >> Og det er præcis, hvad der skete at tænke Binky. 851 00:43:27,550 --> 00:43:31,060 Så minde om, at den historie, som Nick var fortæller her var den samme idé som hvad 852 00:43:31,060 --> 00:43:34,050 Jeg har tegnet med en illusion af kridt på tavlen der. 853 00:43:34,050 --> 00:43:35,960 X og Y er deklareret. 854 00:43:35,960 --> 00:43:39,690 >> Derefter vi tildelt størrelsen af en int og gemt det i x. 855 00:43:39,690 --> 00:43:42,130 Derefter den næste linje, vi gjorde * x. 856 00:43:42,130 --> 00:43:46,070 Dette var Nicks tryllestav af dereferere. 857 00:43:46,070 --> 00:43:49,780 At sætte 42 i hukommelsen påpeget af x. 858 00:43:49,780 --> 00:43:51,600 >> Men det er, hvor tingene gik grueligt galt. 859 00:43:51,600 --> 00:43:51,820 Right? 860 00:43:51,820 --> 00:43:53,550 Vi forsøgte at dereference y. 861 00:43:53,550 --> 00:43:55,620 Men y havde nogle falske værdi, right? 862 00:43:55,620 --> 00:43:57,720 >> At pilen i nederste venstre hjørne, er ikke 863 00:43:57,720 --> 00:43:58,950 faktisk peger på noget. 864 00:43:58,950 --> 00:44:01,520 Det er slags at gøre, hvad jeg gjorde her på tavlen. 865 00:44:01,520 --> 00:44:05,900 Så dårlige ting ske, segmentering fejl eller Binky fejl i dette tilfælde. 866 00:44:05,900 --> 00:44:10,800 >> Men hvis vi så løse, ved at gøre x får y hvordan gør historien forandring? 867 00:44:10,800 --> 00:44:15,760 Tja, hvis jeg gør x får y, der er i virkeligheden det samme som at sige 868 00:44:15,760 --> 00:44:19,235 hvad det er, Ox-noget vil være det samme her, 869 00:44:19,235 --> 00:44:20,080 Ox-noget. 870 00:44:20,080 --> 00:44:22,970 Eller billedligt vi tegne en pil. 871 00:44:22,970 --> 00:44:25,530 >> Så her på brættet med Binky, med den næste linje af 872 00:44:25,530 --> 00:44:28,350 kode, * y betyder derned. 873 00:44:28,350 --> 00:44:29,400 Hvor er der? 874 00:44:29,400 --> 00:44:30,820 Det betyder herovre. 875 00:44:30,820 --> 00:44:36,050 >> Og når vi opdaterer at for at være 13 det bare indebærer at gå og 876 00:44:36,050 --> 00:44:39,470 skriver 13 her nu. 877 00:44:39,470 --> 00:44:44,130 Så måske ikke er helt ligetil ved første øjekast. 878 00:44:44,130 --> 00:44:47,740 Men at opsummere og anvende samme jargon der Binky var ved hjælp her, så 879 00:44:47,740 --> 00:44:50,485 de to første fordeler de pejlemærker, x og y, men ikke de pointees. 880 00:44:50,485 --> 00:44:54,750 Og pointees er ikke en generelt anvendte udtryk. 881 00:44:54,750 --> 00:44:56,120 Men pointer er absolut. 882 00:44:56,120 --> 00:44:59,200 Men det er, hvad der bliver gjort på i Binkys nomenklatur. 883 00:44:59,200 --> 00:45:01,660 >> Denne næste linie, selvfølgelig, allokerer en int pointee. 884 00:45:01,660 --> 00:45:04,840 Så en luns af hukommelse - som jeg trak over på den højre side der - og sæt 885 00:45:04,840 --> 00:45:06,470 x svarer til at pege på den. 886 00:45:06,470 --> 00:45:11,350 Dette dereferences x for at gemme 42 i den hukommelse, det er at pege på. 887 00:45:11,350 --> 00:45:13,380 Og så er dette, selvfølgelig, var en dårlig ting. 888 00:45:13,380 --> 00:45:15,600 Fordi y ikke pegede på noget endnu. 889 00:45:15,600 --> 00:45:16,530 Dette løser det. 890 00:45:16,530 --> 00:45:18,240 Så dette er stadig buggy program. 891 00:45:18,240 --> 00:45:21,580 Bare fordi vi blæser gennem kode linje for linje og sige, åh ja, 892 00:45:21,580 --> 00:45:22,690 lad det gå ned der. 893 00:45:22,690 --> 00:45:23,420 Det er en dårlig ting. 894 00:45:23,420 --> 00:45:26,790 Odds er programmet er bare at afbryde helt på denne linje. 895 00:45:26,790 --> 00:45:30,550 Men hvis du skulle fjerne styrtede Line og erstatte den med de to sidste 896 00:45:30,550 --> 00:45:32,470 linier der du tildeler - 897 00:45:32,470 --> 00:45:35,310 hjælp pointer opgave - y at pege på x som litra t. 898 00:45:35,310 --> 00:45:39,280 Og så dereference y på en meget sikker måde. 899 00:45:39,280 --> 00:45:41,520 >> Så hvor efterlader det os? 900 00:45:41,520 --> 00:45:45,350 Nå, viser sig, at under hætten i CS50 bibliotek, er henvisninger 901 00:45:45,350 --> 00:45:46,320 anvendes overalt. 902 00:45:46,320 --> 00:45:48,910 Og vi vil faktisk begynde at skrælle tilbage, at laget inden længe. 903 00:45:48,910 --> 00:45:51,740 Men det viser også, et udtryk, der nogle af jer måske være bekendt med, 904 00:45:51,740 --> 00:45:54,580 især dem mere komfortable, er faktisk, at en meget populær 905 00:45:54,580 --> 00:45:56,390 website, eller stak overflow, disse dage. 906 00:45:56,390 --> 00:45:58,720 >> Men dette har faktisk meget tekniske betydning. 907 00:45:58,720 --> 00:46:00,160 Vi ved nu, hvad en stak er. 908 00:46:00,160 --> 00:46:02,550 Det er ligesom en stak af bakker indersiden af ​​en spisesal. 909 00:46:02,550 --> 00:46:05,140 >> Eller inde i computerens hukommelse Dens disse rammer 910 00:46:05,140 --> 00:46:06,900 som anvendes af funktioner. 911 00:46:06,900 --> 00:46:10,760 Tja, det viser sig, at på grund af det meget simpel implementering af 912 00:46:10,760 --> 00:46:14,970 hukommelse, og rammerne på den såkaldte stak, kan du faktisk tage kontrol 913 00:46:14,970 --> 00:46:17,050 af et edb-system forholdsvis let. 914 00:46:17,050 --> 00:46:22,180 Du kan hacke ind i et system, hvis folk som os ikke har skrevet vores kode 915 00:46:22,180 --> 00:46:23,300 særlig godt. 916 00:46:23,300 --> 00:46:26,670 >> Hvis folk som os bruger bidder af memory eller anvendelse arrays - 917 00:46:26,670 --> 00:46:27,810 endnu mere almindeligt - 918 00:46:27,810 --> 00:46:31,800 men nogle gange glemmer at kontrollere grænserne for vores array som du måske 919 00:46:31,800 --> 00:46:38,470 har selv nogle gange, og gentog alt for langt forbi enden et array. 920 00:46:38,470 --> 00:46:40,520 I bedste fald dit program måske bare ned. 921 00:46:40,520 --> 00:46:42,280 Segmenteringsfejl, kind pinligt. 922 00:46:42,280 --> 00:46:45,480 Ikke stor, men det er ikke nødvendigvis en enormt dårlig ting. 923 00:46:45,480 --> 00:46:49,480 >> Men hvis dit program er faktisk på virkelige brugernes computere, hvis det kører 924 00:46:49,480 --> 00:46:53,070 på en hjemmeside, at de faktiske tilfældige mennesker på internettet er ramt, lade 925 00:46:53,070 --> 00:46:56,690 mennesker fremkalde dårlige ting på din kode er generelt ikke en god ting, fordi 926 00:46:56,690 --> 00:46:59,930 Det betyder en mulighed for at tage kontrol af computeren. 927 00:46:59,930 --> 00:47:01,350 Og det kommer til at se lidt kryptisk. 928 00:47:01,350 --> 00:47:04,570 Men jeg troede, jeg ville skræmme dig med det sidste eksempel her. 929 00:47:04,570 --> 00:47:05,650 >> Her er et eksempel på kode. 930 00:47:05,650 --> 00:47:07,370 Og der er en god Wikipedia artikel, der går gennem 931 00:47:07,370 --> 00:47:08,530 dette nærmere. 932 00:47:08,530 --> 00:47:13,890 Jeg har main på bunden calling foo, der passerer i argv 1.. 933 00:47:13,890 --> 00:47:15,750 Og det er bare så du kan køre programmet, og videregive 934 00:47:15,750 --> 00:47:17,080 en vilkårlig indgang. 935 00:47:17,080 --> 00:47:20,180 >> Og så foo er erklæret op øverst som at acceptere en streng, eller mere 936 00:47:20,180 --> 00:47:21,700 præcist en char *. 937 00:47:21,700 --> 00:47:23,860 Derefter erklærer en vifte af tegn. 938 00:47:23,860 --> 00:47:27,130 Kald det en buffer, mere generelt, af størrelse 12. 939 00:47:27,130 --> 00:47:30,900 Så 12 chars kan passe inde i af den pågældende matrix kaldet ca. 940 00:47:30,900 --> 00:47:33,510 >> Og derefter anvender denne nye funktion, som er nyt, men ikke svært at 941 00:47:33,510 --> 00:47:34,930 forstå, hukommelse kopi. 942 00:47:34,930 --> 00:47:39,290 Den kopierer den hukommelse, bar, hvilket var den variable fortid n, uanset 943 00:47:39,290 --> 00:47:42,080 brugeren har indtastet i argv 1 ind ca. 944 00:47:42,080 --> 00:47:43,090 Hvor mange bytes? 945 00:47:43,090 --> 00:47:44,260 Strengen Længden af ​​baren. 946 00:47:44,260 --> 00:47:48,380 >> Så med andre ord, hvis brugeren skriver i h-e-l-l-o enter, strengen længden 947 00:47:48,380 --> 00:47:49,260 af hej er fem. 948 00:47:49,260 --> 00:47:52,790 Så fem af disse bytes vil få kopieres ind array kaldet C, som 949 00:47:52,790 --> 00:47:54,110 er af størrelse 12. 950 00:47:54,110 --> 00:47:58,710 Men hvad bruger typer i en meget længere ord, der er 13 tegn eller 14 951 00:47:58,710 --> 00:48:01,250 tegn eller 100 tegn eller mere? 952 00:48:01,250 --> 00:48:02,660 >> Hvor vil de hen? 953 00:48:02,660 --> 00:48:06,090 Nå, det stel, der bakke i spisesalen stack, 954 00:48:06,090 --> 00:48:06,930 de kommer til at gå der. 955 00:48:06,930 --> 00:48:10,080 Og det er bare at begynde at overskrive andre ting, der allerede er 956 00:48:10,080 --> 00:48:12,880 på denne stakken, overfyldte stakken, så at sige. 957 00:48:12,880 --> 00:48:14,780 >> Så billedligt, så tænk på det på denne måde. 958 00:48:14,780 --> 00:48:17,970 Dette er blot en farverig udgave af det billede, vi har været tegning. 959 00:48:17,970 --> 00:48:20,060 Nederst, lad os sige, er vigtigste. 960 00:48:20,060 --> 00:48:24,690 Og på toppen, hvad du ser nu er rammen, farvekodede nu, for en 961 00:48:24,690 --> 00:48:26,090 funktion kaldet foo. 962 00:48:26,090 --> 00:48:30,170 Men hvad er interessant her om foo er, at her er dens ramme. 963 00:48:30,170 --> 00:48:32,860 Så det er trukket ligesom jeg gjorde, men i lyseblå. 964 00:48:32,860 --> 00:48:35,220 Og nu er det her c beslag 0 går. 965 00:48:35,220 --> 00:48:37,410 Og det er her c beslag 11 kommer til at ende. 966 00:48:37,410 --> 00:48:39,670 >> Med andre ord, sker det at være repræsenteret som en firkant. 967 00:48:39,670 --> 00:48:42,320 Men hvis du bare holde plopping bytes ned - eller tegn - de kommer til at ende 968 00:48:42,320 --> 00:48:46,070 op på placering 0 hele vejen op til 11, fordi det er 0 indekseret. 969 00:48:46,070 --> 00:48:49,170 >> Men hvor er den 13. tegn kommer til at ende? 970 00:48:49,170 --> 00:48:50,310 Hvor er det 14.? 971 00:48:50,310 --> 00:48:52,430 Hvor er den 50. tegn kommer til at ende? 972 00:48:52,430 --> 00:48:54,070 >> Det kommer til at holde på vej ned. 973 00:48:54,070 --> 00:48:57,350 For selvom vi har trukket billede med stakken vokser op, de 974 00:48:57,350 --> 00:48:59,920 adresser, viser det sig, gå fra små adresser, små 975 00:48:59,920 --> 00:49:01,830 pegepinde, til store adresser. 976 00:49:01,830 --> 00:49:03,540 Så det bare holder går op og op. 977 00:49:03,540 --> 00:49:05,660 >> Så hvis brugeren skriver i hej, det er fantastisk. 978 00:49:05,660 --> 00:49:08,650 Ingen bug, ikke noget problem, alles sikkerhed. 979 00:49:08,650 --> 00:49:11,940 Men hvis brugeren skriver i, hvad vi vil kalde kontradiktorisk kode, repræsenterede 980 00:49:11,940 --> 00:49:16,040 generisk som en, angreb, angreb, angreb, angreb, hvad kan ske? 981 00:49:16,040 --> 00:49:19,760 >> Tja, hvis alle de input, som brugeren indtastet er ikke bare nogle venlige 982 00:49:19,760 --> 00:49:21,540 eller stødende tegnstreng. 983 00:49:21,540 --> 00:49:24,050 Det er faktisk en sekvens af tegn at hvis du har kompileret den, 984 00:49:24,050 --> 00:49:26,050 det faktisk er kode. 985 00:49:26,050 --> 00:49:29,570 Måske er det kode, der sletter alle de filer på din harddisk eller sender spam 986 00:49:29,570 --> 00:49:30,810 eller noget lignende. 987 00:49:30,810 --> 00:49:35,110 Bemærk, at hvad der er nøglen her, er, at Hvis den dårlige fyr fik heldig nok til at 988 00:49:35,110 --> 00:49:37,830 overskrive den røde luns af hukommelse - 989 00:49:37,830 --> 00:49:41,080 som jeg ikke trække på min billede, men denne Wikipedia billede her har - 990 00:49:41,080 --> 00:49:42,890 sin såkaldte returadresse. 991 00:49:42,890 --> 00:49:47,470 >> Når fødevarer tilbage, når swap afkast, hvordan computeren ved at gå fra 992 00:49:47,470 --> 00:49:49,790 herop for at hernede? 993 00:49:49,790 --> 00:49:52,920 Eller i tech segment op over, hvordan betyder det kender til at gå fra swappen 994 00:49:52,920 --> 00:49:54,870 kode - den 0'er og 1'er der komponerer swap - 995 00:49:54,870 --> 00:49:56,020 tilbage til main? 996 00:49:56,020 --> 00:50:00,450 Der er en såkaldt returadresse opbevares i det samme stakramme, om 997 00:50:00,450 --> 00:50:02,140 det samme cafeteria bakken. 998 00:50:02,140 --> 00:50:06,080 >> Så hvis den dårlige fyr er klog nok til at sætte angreb kode, angreb kode, angreb 999 00:50:06,080 --> 00:50:07,960 kode og få heldige nok - 1000 00:50:07,960 --> 00:50:11,630 ofte gennem trial and error - for at overskrive at rød returadresse 1001 00:50:11,630 --> 00:50:14,360 med adressen og meddelelsen helt i top. 1002 00:50:14,360 --> 00:50:16,830 Bemærk 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Det er skrevet baglæns op øverst for grunde vil vi måske revidere. 1004 00:50:20,650 --> 00:50:22,050 Dette er det nummer. 1005 00:50:22,050 --> 00:50:25,790 >> Så hvis den dårlige fyr bliver heldig nok eller er smart nok til at overskrive den røde 1006 00:50:25,790 --> 00:50:29,480 fratage hukommelse med adressen på kode, som han eller hun har en eller anden måde 1007 00:50:29,480 --> 00:50:34,980 sprøjtes ind i din computer, gæt hvis kode vil blive returneret til 1008 00:50:34,980 --> 00:50:38,260 så snart foo sker udførelse? 1009 00:50:38,260 --> 00:50:39,440 >> Den dårlige fyr kode. 1010 00:50:39,440 --> 00:50:43,610 Så dette angreb kode, AAA igen, måske sende spam, kan slette alle de filer 1011 00:50:43,610 --> 00:50:44,500 på din harddisk. 1012 00:50:44,500 --> 00:50:48,740 Men det er hvad der virkelig en stak overflow er, eller et bufferoverløb eller et 1013 00:50:48,740 --> 00:50:51,060 buffer overflow angreb. 1014 00:50:51,060 --> 00:50:54,400 >> Og det er utroligt, utroligt almindelig til denne dag med programmer skrevet i 1015 00:50:54,400 --> 00:50:58,220 C, C + +, og endda nogle andre sprog. 1016 00:50:58,220 --> 00:51:02,275 På det skræmmende note, vil vi slutte med en vittighed. 1017 00:51:02,275 --> 00:51:03,230 >> [Latter] 1018 00:51:03,230 --> 00:51:04,550 >> Se dig på onsdag. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Ved næste CS50 - 1021 00:51:10,310 --> 00:51:15,920 Så jeg er alle ude af disk lamper i dag, men vente, fedtfri mælk, halv telefonen 1022 00:51:15,920 --> 00:51:17,850 bog, appelsinsaft at jeg drak i dag. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB-kabel, en skruenøgle. 1025 00:51:22,780 --> 00:51:24,800 >> [MUSIC Playing]