1 00:00:00,000 --> 00:00:11,242 >> [Musikk spilles] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. MALAN: Ok dette er CS50 og dette er begynnelsen av uke fem. 3 00:00:16,630 --> 00:00:21,480 Så i dag, under dine sitteputer, du vil ikke finne noe. 4 00:00:21,480 --> 00:00:24,790 Men ovenfor, bør du finne disse, en lite tegn på vår takknemlighet for 5 00:00:24,790 --> 00:00:26,970 alt arbeidet som du putter inn i Game of Fifteen. 6 00:00:26,970 --> 00:00:30,290 Bare fjerne den lille sirkelen på bunnen for å begynne å spille for 7 00:00:30,290 --> 00:00:31,680 resten av klassen. 8 00:00:31,680 --> 00:00:38,930 >> Så husker det, eller vet at problemet satt fire, som gikk ut denne helgen, 9 00:00:38,930 --> 00:00:40,340 innebærer å skrive et annet spill. 10 00:00:40,340 --> 00:00:43,740 Men denne gangen er det innebærer å bruke en Selve grafisk brukergrensesnitt, ikke en 11 00:00:43,740 --> 00:00:46,310 tekstgrensesnittet som Game of Fifteen var. 12 00:00:46,310 --> 00:00:50,210 Og spillet som ligger foran deg, Hvis du ennå ikke har sett denne siden, 13 00:00:50,210 --> 00:00:52,310 ser litt noe sånt som dette. 14 00:00:52,310 --> 00:00:55,170 Jeg kommer til å gå inn i terminalen min vinduet her i GDB. 15 00:00:55,170 --> 00:00:58,600 Og jeg kommer til å gå foran og kjør Personalet løsning, som du kan få tilgang til 16 00:00:58,600 --> 00:01:01,010 etter å ha kjørt update 50 som vanlig. 17 00:01:01,010 --> 00:01:04,090 >> Men jeg kommer til å sette den inn i en liten hemmelig modus, litt påskeegg, 18 00:01:04,090 --> 00:01:08,480 såkalte Gud modus, ved sette Gud i argv1. 19 00:01:08,480 --> 00:01:12,920 Og jeg må følge mine egne retninger, kjører det i min egen 20 00:01:12,920 --> 00:01:14,220 Problemet satt katalogen. 21 00:01:14,220 --> 00:01:19,190 Så nå kan du se en fullstendig versjon av spillet Breakout. 22 00:01:19,190 --> 00:01:21,090 Faktisk er dette no-hands-modus. 23 00:01:21,090 --> 00:01:24,850 Så det er faktisk - 24 00:01:24,850 --> 00:01:26,470 imponert om du kan være - 25 00:01:26,470 --> 00:01:30,850 ganske trivielt å implementere Gud modus i Breakout, i motsetning til Game of Fifteen, 26 00:01:30,850 --> 00:01:33,590 som noen av dere kanskje har taklet for hacker-utgaven. 27 00:01:33,590 --> 00:01:37,890 >> I Breakout er det nok på Gud modus for å rett og slett gjøre hva, 28 00:01:37,890 --> 00:01:41,220 intuitivt med padle? 29 00:01:41,220 --> 00:01:45,630 Bare gjøre den lik uansett horisontal posisjon er denne omgangen. 30 00:01:45,630 --> 00:01:49,220 Og så lenge du gjør dette i lockstep med ballen beveger dette spillet vil 31 00:01:49,220 --> 00:01:53,100 aldri, aldri, aldri glipp ballen og du vil vinne hver gang. 32 00:01:53,100 --> 00:01:55,430 >> Men i denne ukens hacker utgave det er mer enn bare Gud modus. 33 00:01:55,430 --> 00:01:56,720 Det er en rekke andre funksjoner. 34 00:01:56,720 --> 00:01:58,140 Blant dem, lasere. 35 00:01:58,140 --> 00:02:01,070 Slik at hvis du virkelig bli utålmodig deg kan begynne å skyte ned mursteinene 36 00:02:01,070 --> 00:02:02,120 og noen få andre. 37 00:02:02,120 --> 00:02:04,560 Og for de av dere som ønsker å kalibrere standard versus hacker 38 00:02:04,560 --> 00:02:08,750 utgave, kan jeg se at denne ukens hacker utgaven er bevisst en 39 00:02:08,750 --> 00:02:12,830 litt mer gjennomførbart, sier, enn Gud modus var med Game of Fifteen. 40 00:02:12,830 --> 00:02:15,300 >> Så hvis du leter etter en strekk og du leter etter noen ekstra moro 41 00:02:15,300 --> 00:02:18,400 funksjonene gjør dykk i hvis interesse. 42 00:02:18,400 --> 00:02:21,280 Nå mer praktisk, la meg peke ut en ting i tillegg. 43 00:02:21,280 --> 00:02:24,780 GDB, som noen av dere kanskje ikke har ennå rørte personlig, noe som er fint. 44 00:02:24,780 --> 00:02:28,530 Men er nå virkelig på tide å venne til dette og komfortabel med dette verktøyet 45 00:02:28,530 --> 00:02:31,510 fordi det vil gjøre livet mye enklere, virkelig. 46 00:02:31,510 --> 00:02:34,900 >> Per Rob foredrag på GDB et par uker 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 verktøy som lar deg kjøre din programmet, men kjøre det steg for steg, linje 49 00:02:41,230 --> 00:02:45,680 for linje, slik at du kan rote rundt, slik at du ser ting skjer, så 50 00:02:45,680 --> 00:02:47,310 som du kan skrive ut verdiene av variablene. 51 00:02:47,310 --> 00:02:50,580 Kort sagt, det gir deg så mye mer strøm enn printDef gjør. 52 00:02:50,580 --> 00:02:52,900 >> Nå riktignok, grensesnittet er ganske uforståelige. 53 00:02:52,900 --> 00:02:55,180 Svart og hvitt tekstgrensesnittet for det meste. 54 00:02:55,180 --> 00:02:57,400 Kommandoene er litt tøff å huske på først. 55 00:02:57,400 --> 00:03:01,230 Men selv om det kan ta deg en halv en time, en time, for å sette det på forhånd 56 00:03:01,230 --> 00:03:02,940 investering av tid til det, stole på meg. 57 00:03:02,940 --> 00:03:06,440 Gjerne ved semesterets slutt vil det spare du en størrelsesorden mer 58 00:03:06,440 --> 00:03:07,600 tid enn. 59 00:03:07,600 --> 00:03:09,200 >> Så tidlig i uken dykke i. 60 00:03:09,200 --> 00:03:13,200 Og når det gjelder Breakout, vet at du kan gjøre dette så lenge du har 61 00:03:13,200 --> 00:03:18,230 fordelingen kode eller din egen kode pågår i din Pst4 katalogen. 62 00:03:18,230 --> 00:03:21,680 Vit at du kan kjøre gdb. / Avslapnings. 63 00:03:21,680 --> 00:03:23,490 >> Dette kommer til å åpne opp et vindu som dette. 64 00:03:23,490 --> 00:03:25,530 La meg gi meg selv mer av en terminal vindu. 65 00:03:25,530 --> 00:03:27,770 Og så hva jeg kommer til å gå videre og gjøre, det er ikke bare kjøre den. 66 00:03:27,770 --> 00:03:30,690 Jeg kommer til å først sette et knekkpunkt tilbakekalling, som lar deg pause 67 00:03:30,690 --> 00:03:32,500 utførelse på et bestemt sted. 68 00:03:32,500 --> 00:03:35,750 >> Bare for å holde ting enkelt jeg kommer å bryte på linjen man bare ved å skrive 69 00:03:35,750 --> 00:03:37,000 nummer én. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 La meg faktisk re-åpne dette vinduet fordi det blir en 72 00:03:43,250 --> 00:03:45,700 litt liten der. 73 00:03:45,700 --> 00:03:53,270 Så hva jeg nå skal gjøre her er hvis jeg åpner opp min terminal-vinduet. 74 00:03:53,270 --> 00:03:53,910 Kom igjen, det vi går. 75 00:03:53,910 --> 00:03:59,850 >> Så nå hvis jeg går tilbake til dropbox, Pst4 og kjøre gdb. / breakout inn, merker 76 00:03:59,850 --> 00:04:02,600 Jeg kommer til å bryte en å sette en pause poeng på én. 77 00:04:02,600 --> 00:04:04,840 Og nå skal jeg til å gå fremover og type kjøre. 78 00:04:04,840 --> 00:04:07,370 Og når jeg gjør det, merker ingenting synes å skje. 79 00:04:07,370 --> 00:04:08,120 >> Det er ingen pop up. 80 00:04:08,120 --> 00:04:09,790 Det er ikke noe grafisk brukergrensesnitt ennå. 81 00:04:09,790 --> 00:04:13,340 Men det er forståelig fordi jeg er bokstavelig talt på linjen en i mitt program. 82 00:04:13,340 --> 00:04:17,110 Og legg merke til at jeg har fast videresendt, spesielt nå til 62, fordi alle 83 00:04:17,110 --> 00:04:20,600 ting på toppen av denne filen er ting som kommentarer og konstanter og 84 00:04:20,600 --> 00:04:22,460 uinteressant ting for nå. 85 00:04:22,460 --> 00:04:25,840 >> Så nå er jeg inne i main, det virker, på linje 62 år. 86 00:04:25,840 --> 00:04:27,960 Og dette er bare fordelingen kode, tilbakekalling. 87 00:04:27,960 --> 00:04:33,810 Hvis jeg åpner dette opp ved å gå, på samme måte, inn i min slippe boksen til katalogen Pst4, 88 00:04:33,810 --> 00:04:35,450 inn breakout.c. 89 00:04:35,450 --> 00:04:40,670 Og hvis jeg ruller ned og ned og ned, og la meg gå videre og slå på 90 00:04:40,670 --> 00:04:44,990 mine linjenummer. 91 00:04:44,990 --> 00:04:50,300 >> Hva jeg vil se, hvis jeg blar ned til linje 62, er nøyaktig den linje som 92 00:04:50,300 --> 00:04:50,910 vi har stoppet på. 93 00:04:50,910 --> 00:04:53,720 Så denne linjen her, 62, er hvor vi er i ferd med å bli. 94 00:04:53,720 --> 00:04:57,470 Så nå i GDB, hvis jeg går videre og skriver nå neste, skriv det kommer til å 95 00:04:57,470 --> 00:04:58,450 kjøre den linjen. 96 00:04:58,450 --> 00:05:00,610 Og voila, har vi såkalte g-vinduet. 97 00:05:00,610 --> 00:05:02,800 Hvis kjent med hva en GWindow er, for ikke å bekymre deg. 98 00:05:02,800 --> 00:05:05,740 Den spec vil introdusere deg til den, som samt en rekke walkthrough videoer 99 00:05:05,740 --> 00:05:06,830 innebygd i spec. 100 00:05:06,830 --> 00:05:08,610 >> Men nå la oss gjøre dette til en litt mer interessant. 101 00:05:08,610 --> 00:05:10,960 La meg flytte dette vinduet over til siden litt. 102 00:05:10,960 --> 00:05:13,480 La meg gjøre vinduet litt større, slik at jeg kan se mer. 103 00:05:13,480 --> 00:05:16,140 >> Og nå la meg gå videre og gjøre neste gang. 104 00:05:16,140 --> 00:05:17,550 Og det er mine murstein. 105 00:05:17,550 --> 00:05:20,490 Hvis jeg skriver neste gang nå ser jeg på ballen. 106 00:05:20,490 --> 00:05:23,520 Og hvis jeg skriver neste gang nå ser jeg padle. 107 00:05:23,520 --> 00:05:26,690 >> Og heldigvis dette gedit er ikke virkelig samarbeide ved å vise meg 108 00:05:26,690 --> 00:05:27,660 alt jeg vil. 109 00:05:27,660 --> 00:05:30,820 Men nå hvis jeg gjør neste gang, neste gang, jeg er bare 110 00:05:30,820 --> 00:05:32,260 erklære noen variabler. 111 00:05:32,260 --> 00:05:34,750 Og jeg kan skrive ut en av disse gutta ut. 112 00:05:34,750 --> 00:05:37,170 Skriv ut murstein, utskrifter liv. 113 00:05:37,170 --> 00:05:39,910 >> Og nå hvis jeg fortsetter å gjøre neste, merker at jeg vil være 114 00:05:39,910 --> 00:05:40,870 innsiden av det loop. 115 00:05:40,870 --> 00:05:43,380 Men koden kommer til å utføre akkurat som jeg forventer. 116 00:05:43,380 --> 00:05:45,810 Så når jeg treffer denne funksjonen, Vent for klikk, det kommer til å gjøre 117 00:05:45,810 --> 00:05:46,830 det bokstavelig talt det. 118 00:05:46,830 --> 00:05:48,870 Så jeg syntes å ha mistet kontrollen over programmet. 119 00:05:48,870 --> 00:05:50,480 >> GDB er ikke å gi meg et annet spørsmål. 120 00:05:50,480 --> 00:05:51,500 Men ikke å bekymre deg. 121 00:05:51,500 --> 00:05:53,720 Gå til spillet mitt, klikker du et sted. 122 00:05:53,720 --> 00:05:56,270 >> Og voila, nå fortsetter til linje 86. 123 00:05:56,270 --> 00:05:59,460 Så igjen, det er uvurderlig, til slutt, for debugging problemer. 124 00:05:59,460 --> 00:06:03,050 Fordi du kan bokstavelig talt gå gjennom koden, print ut ting og mye, 125 00:06:03,050 --> 00:06:03,640 mye, mye mer. 126 00:06:03,640 --> 00:06:07,210 Men for nå, disse verktøyene alene bør få deg ganske langt. 127 00:06:07,210 --> 00:06:10,050 >> Så vi er, selvfølgelig, å ta en titt på Graphics nå, plutselig. 128 00:06:10,050 --> 00:06:12,350 Og nå vår verden blir litt mer interessant. 129 00:06:12,350 --> 00:06:15,680 Og du vet, kanskje, fra noen av de videoer på nettet at vi har disse 130 00:06:15,680 --> 00:06:18,280 shorts som du har vært å se som en del av oppgavesett. 131 00:06:18,280 --> 00:06:20,460 >> Og de har blitt skutt, bevisst, mot en hvit bakgrunn. 132 00:06:20,460 --> 00:06:23,380 , Og noen av dem har læren Fellows tegning litt tekst på 133 00:06:23,380 --> 00:06:25,490 skjerm som er kledde på siden av dem. 134 00:06:25,490 --> 00:06:27,760 Men selvfølgelig, dette er ikke alt som interessant i den virkelige verden. 135 00:06:27,760 --> 00:06:30,520 Dette er bare en forelesningssal med en stor hvit skjerm og et bakteppe. 136 00:06:30,520 --> 00:06:33,330 Og vår fantastiske produksjonsteamet slags av gjør alt ser vakker 137 00:06:33,330 --> 00:06:36,620 i ettertid ved beskjæring ut eller overliggende noe 138 00:06:36,620 --> 00:06:37,840 vi gjør eller ikke vil ha. 139 00:06:37,840 --> 00:06:41,560 >> Nå bare for å motivere denne uken og egentlig, hvor du kan gå, til slutt, 140 00:06:41,560 --> 00:06:42,560 med informatikk. 141 00:06:42,560 --> 00:06:44,260 Ikke like etter problem satt fire. 142 00:06:44,260 --> 00:06:48,240 Men etter et annet kurs eller en hel læreplanen er det utrolig hva du kan 143 00:06:48,240 --> 00:06:51,090 gjøre for tiden når det gjelder grafikk spesielt. 144 00:06:51,090 --> 00:06:53,440 >> Noen av dere har kanskje sett dette flyter rundt på nettet. 145 00:06:53,440 --> 00:06:56,240 Men jeg tenkte jeg skulle vise dere, for bare en par minutter, et glimt av hva 146 00:06:56,240 --> 00:07:01,890 datateknologi og hva CGI, datagrafikk kan gjøre i disse dager 147 00:07:01,890 --> 00:07:04,510 med en kjent sang og kanskje film. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LANA DEL RAY, "Ung og vakker] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: Det er bare en liten bit fantastisk, kanskje, hvor 151 00:10:52,470 --> 00:10:52,857 allestedsnærværende - 152 00:10:52,857 --> 00:10:57,040 >> [APPLAUSE] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Jeg har nettopp lastet det ned. 154 00:10:59,230 --> 00:11:02,920 Men det er virkelig fantastisk, tror jeg, bare hvor allestedsnærværende programvare og kode og 155 00:11:02,920 --> 00:11:04,230 verktøy som dette egentlig er. 156 00:11:04,230 --> 00:11:07,685 Så det er en smak av retning hvor du kan gå. 157 00:11:07,685 --> 00:11:10,620 Å, ikke mer Appliance i dag. 158 00:11:10,620 --> 00:11:14,640 Vel, det er faktisk tragisk timing gitt det punktet jeg bare prøvde å gjøre. 159 00:11:14,640 --> 00:11:18,670 >> Ok, så la oss starte Fusion igjen. 160 00:11:18,670 --> 00:11:20,800 Minn meg senere. 161 00:11:20,800 --> 00:11:24,190 Greit, og du bør ha fått en e-post som en side hvis du fikk en 162 00:11:24,190 --> 00:11:25,460 legge merke til sånt. 163 00:11:25,460 --> 00:11:29,940 All right, så husker at forrige uke vi begynte å skrelle tilbake 164 00:11:29,940 --> 00:11:31,380 senere kjent som streng. 165 00:11:31,380 --> 00:11:34,700 >> string minnes en datatype som er deklarert i CS50 biblioteket. 166 00:11:34,700 --> 00:11:37,740 Og det er en del av trening hjul som nå begynner å ta av. 167 00:11:37,740 --> 00:11:41,280 Det var et nyttig begrep tidlig. 168 00:11:41,280 --> 00:11:43,750 Men nå kommer det til å få mer interessant og kraftigere til 169 00:11:43,750 --> 00:11:48,330 faktisk se at under panseret, en streng er akkurat det, vi sa? 170 00:11:48,330 --> 00:11:50,500 >> Ja, så det er en såkalt røye *. 171 00:11:50,500 --> 00:11:53,860 Og * det indikerer at det ikke er en slags adresse involvert. 172 00:11:53,860 --> 00:11:58,690 Og så når du sier røye * du bare bety en variabel med datatype er en 173 00:11:58,690 --> 00:11:59,290 pekeren nå. 174 00:11:59,290 --> 00:12:01,770 Det faktum at det er stjernen det betyr bare at du er erklære en 175 00:12:01,770 --> 00:12:03,020 såkalt pekeren. 176 00:12:03,020 --> 00:12:06,220 Og at pekeren skal tilsynelatende lagre adressen, av 177 00:12:06,220 --> 00:12:07,810 Selvfølgelig, en røye. 178 00:12:07,810 --> 00:12:08,960 >> Nå hvorfor dette fornuftig? 179 00:12:08,960 --> 00:12:11,200 Vel, hva er en streng under panseret? 180 00:12:11,200 --> 00:12:15,130 Vel, i noen tid har vi vært å si at en streng under panseret er 181 00:12:15,130 --> 00:12:18,460 bare h-e-l-l-O, for eksempel. 182 00:12:18,460 --> 00:12:21,585 >> Men vi har snakket om dette som være, i hovedsak, en matrise. 183 00:12:21,585 --> 00:12:25,410 Og en rekke ville da se litt mer som dette, med hver av disse 184 00:12:25,410 --> 00:12:26,460 tar opp en bit. 185 00:12:26,460 --> 00:12:28,710 Og så har vi sagt at det er noe spesielt tilbake hit, det 186 00:12:28,710 --> 00:12:31,270 0 backslash, eller null terminator. 187 00:12:31,270 --> 00:12:35,230 >> Så hele denne tiden, dette her har vært en streng. 188 00:12:35,230 --> 00:12:38,320 Men egentlig, er en streng faktisk en adresse. 189 00:12:38,320 --> 00:12:43,210 Og adresser, som vi skal se, er ofte prefiks med 0x av konvensjonen. 190 00:12:43,210 --> 00:12:44,540 Hva betegne 0x? 191 00:12:44,540 --> 00:12:45,970 Vet noen? 192 00:12:45,970 --> 00:12:47,320 >> Så det betyr bare heksadesimal. 193 00:12:47,320 --> 00:12:52,360 Så du kanskje husker, faktisk, fra PST 1, tror jeg, en av de varme opp 194 00:12:52,360 --> 00:12:55,740 spørsmål spurte faktisk om heksadesimal notasjon i tillegg til 195 00:12:55,740 --> 00:12:57,100 binær og desimal. 196 00:12:57,100 --> 00:13:00,460 Og motivasjonen her er at med heksadesimal har du 16 197 00:13:00,460 --> 00:13:01,770 sifre til din disposisjon. 198 00:13:01,770 --> 00:13:07,900 0, etterfulgt 1, 2, 3, 4, 5, 6, 7, 8, 9, ved a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> Og hvis du teller alle dem opp, du får til sammen 16 år. 200 00:13:10,430 --> 00:13:13,200 Så dette er i kontrast med desimal, hvor vi har 10 201 00:13:13,200 --> 00:13:14,690 sifre, 0 til ni. 202 00:13:14,690 --> 00:13:17,750 Det er i kontrast med binære hvor vi må bare 0 og 1. 203 00:13:17,750 --> 00:13:21,450 >> Men på slutten av dagen kan du bare representerer de samme tallene, men 204 00:13:21,450 --> 00:13:22,500 noe annerledes. 205 00:13:22,500 --> 00:13:25,840 Og heksadesimal er vanlig fordi som det viser seg - og vi vil se dette 206 00:13:25,840 --> 00:13:28,790 senere i kurset - selv når vi får til web-programmering i sammenheng med 207 00:13:28,790 --> 00:13:32,100 HTML og fargekoder, heksadesimal er fint. 208 00:13:32,100 --> 00:13:36,390 Fordi hvert siffer, viser seg, representerer fire biter perfekt. 209 00:13:36,390 --> 00:13:39,280 Så det bare slags linjer opp pent som vi vil til slutt se. 210 00:13:39,280 --> 00:13:44,720 Så dette kan være Ox123 eller noe sånn, betegner adresse 123 211 00:13:44,720 --> 00:13:47,050 et sted inne i min datamaskinens minne. 212 00:13:47,050 --> 00:13:50,600 >> Men selvfølgelig, noen problemer oppstår på grunn av dette underliggende 213 00:13:50,600 --> 00:13:51,520 gjennomføring. 214 00:13:51,520 --> 00:13:55,930 Og husker at jeg tok en stikke på implementere en funksjon som dette - 215 00:13:55,930 --> 00:14:00,260 sammenligne dash 0 dot c forrige uke, at selv om det så ut som det var 216 00:14:00,260 --> 00:14:04,270 rett, det rett og slett ikke sammenligne to strenger korrekt. 217 00:14:04,270 --> 00:14:07,470 >> Jeg har kastet bort viktigste, og jeg har kastet bort kommentarene bare for å fokusere på 218 00:14:07,470 --> 00:14:08,970 koden som er av 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 For hvilken grunn? 221 00:14:11,670 --> 00:14:15,890 >> Vel, på toppen der da jeg erklærte en streng, var det som virkelig skjer 222 00:14:15,890 --> 00:14:17,260 under panseret? 223 00:14:17,260 --> 00:14:19,530 Vel, la meg gå over til skjermen her og tegne det. 224 00:14:19,530 --> 00:14:23,230 Så jeg erklærte, igjen, string s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Så jeg kommer til å gå videre nå og tegne s for hva det egentlig er. 226 00:14:26,640 --> 00:14:28,590 Det kommer til å være et kvadrat her. 227 00:14:28,590 --> 00:14:30,490 Og jeg kommer til å kreve at det er 32 bits. 228 00:14:30,490 --> 00:14:32,890 I det minste er det vanligvis, minst på CS50 den 229 00:14:32,890 --> 00:14:34,520 apparatet i en rekke datamaskiner. 230 00:14:34,520 --> 00:14:35,980 Jeg kommer til å kalle det s. 231 00:14:35,980 --> 00:14:39,070 >> Men nå husker at vi kalt GetString. 232 00:14:39,070 --> 00:14:41,430 Så GetString avkastning, selvfølgelig en streng. 233 00:14:41,430 --> 00:14:45,790 Hvis brukeren skriver i h-e-l-l-o inn strengen hallo blir returnert. 234 00:14:45,790 --> 00:14:51,010 Og at strengen, som vi sa, ender opp et sted i datamaskinens minne 235 00:14:51,010 --> 00:14:53,240 med en omvendt skråstrek 0 på slutten. 236 00:14:53,240 --> 00:14:56,650 Jeg vil trekke dette som array - eller sammenhengende blokk tegn - 237 00:14:56,650 --> 00:14:58,330 at det faktisk er. 238 00:14:58,330 --> 00:15:01,790 >> Og nå, er hva GetString faktisk tilbake? 239 00:15:01,790 --> 00:15:04,340 Hva har GetString vært tilbake hele denne tiden? 240 00:15:04,340 --> 00:15:07,520 Vel, vi sier, i uker før, den returnerer en streng. 241 00:15:07,520 --> 00:15:10,250 Men mer teknisk, hva gjør GetString retur tilsynelatende? 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 Spesielt er det returnerer adressen av den aller første bitt, uansett hva det er. 245 00:15:16,630 --> 00:15:18,830 Jeg bare fortsette å bruke en, to, tre fordi det er praktisk. 246 00:15:18,830 --> 00:15:21,380 >> Den returnerer adressen til den første tegnet i strengen. 247 00:15:21,380 --> 00:15:23,510 Og vi sa forrige uke at som er tilstrekkelig. 248 00:15:23,510 --> 00:15:26,710 Fordi vi kan alltid finne ut hvor enden av strengen bare ved 249 00:15:26,710 --> 00:15:30,150 iterating over det, kanskje, med en for loop eller en while-loop eller noe sånt 250 00:15:30,150 --> 00:15:34,990 det, bare på jakt etter "backslash 0", den spesielle sentinel karakter. 251 00:15:34,990 --> 00:15:37,220 >> Og da vet vi at strengen skjer for å være av lengde - 252 00:15:37,220 --> 00:15:37,980 i dette tilfellet - 253 00:15:37,980 --> 00:15:38,670 fem. 254 00:15:38,670 --> 00:15:43,800 Så teknisk sett hva GetString gjør er den returnerer Ox123 i dette tilfellet. 255 00:15:43,800 --> 00:15:53,670 Og teknisk hva som da skjer er at vi lagrer, innsiden av s, Ox123. 256 00:15:53,670 --> 00:15:56,460 På slutten av dagen, selv om denne er nytt konsept, pekere, de er 257 00:15:56,460 --> 00:15:57,350 bare variabler. 258 00:15:57,350 --> 00:16:00,440 Men de måtte lagre biter som kollektivt representerer en adresse. 259 00:16:00,440 --> 00:16:03,700 Så teknisk sett alt de får lagret 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 inkludert dag og framover - 262 00:16:06,020 --> 00:16:09,290 er egentlig ikke kommer til å bry seg, typisk, hva den faktiske adressen er 263 00:16:09,290 --> 00:16:10,520 av noen del av minnet. 264 00:16:10,520 --> 00:16:14,040 Det er bare å lavt detaljnivå til være intellektuelt interessant. 265 00:16:14,040 --> 00:16:15,440 Så jeg kommer til å angre dette. 266 00:16:15,440 --> 00:16:19,810 Og i stedet, mer høyt nivå, bare si at når vi snakker om pekere 267 00:16:19,810 --> 00:16:22,170 Jeg skal bare trekke mer brukervennlig pil som formidler 268 00:16:22,170 --> 00:16:26,060 samme idé og abstracts unna de opplysninger om hva den faktiske 269 00:16:26,060 --> 00:16:27,700 underliggende adresse er. 270 00:16:27,700 --> 00:16:33,290 >> Nå hvis vi går tilbake til koden, hva skjedde sist uke om vi har streng t 271 00:16:33,290 --> 00:16:34,510 tilsvarer GetString? 272 00:16:34,510 --> 00:16:38,630 Vel, hvis jeg igjen, skriver hallo denne gangen skal jeg få 273 00:16:38,630 --> 00:16:40,460 en annen del av minnet. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o 0 skråstrek. 275 00:16:44,820 --> 00:16:48,320 >> Men fordi jeg ringte GetString en andre gang - 276 00:16:48,320 --> 00:16:51,100 og jeg vet dette fra å se på kildekoden for GetString - selv 277 00:16:51,100 --> 00:16:54,350 om det er tilfeldig at hallo var skrevet inn to ganger, er GetString ikke 278 00:16:54,350 --> 00:16:55,890 kommer til å forsøke å optimalisere og være flink. 279 00:16:55,890 --> 00:16:58,550 Det er bare kommer til å få en annen del av minne fra datamaskinen, noe som er 280 00:16:58,550 --> 00:16:59,640 kommer til å være på en annen adresse. 281 00:16:59,640 --> 00:17:02,330 La oss vilkårlig bare si 456. 282 00:17:02,330 --> 00:17:04,079 >> Og hva går det å komme tilbake? 283 00:17:04,079 --> 00:17:08,030 Det kommer til å gå tilbake 456 og lagre den i t. 284 00:17:08,030 --> 00:17:12,010 Så hva som egentlig skjer, på venstre side er at jeg har en annen del 285 00:17:12,010 --> 00:17:14,260 minne, 32 bits typisk. 286 00:17:14,260 --> 00:17:16,720 Og det kommer til å gå Ox456. 287 00:17:16,720 --> 00:17:20,140 Men igjen, jeg er ikke interessert i disse spesielle numre lenger. 288 00:17:20,140 --> 00:17:23,069 Jeg skal bare abstrakt tegne det som en pil. 289 00:17:23,069 --> 00:17:25,202 >> Så dette er nå en ny forklaring. 290 00:17:25,202 --> 00:17:28,735 Men det er de samme idé som er skjedd hele denne tiden. 291 00:17:28,735 --> 00:17:33,150 Og så den grunn, så, at denne først versjon av sammenligne var buggy 292 00:17:33,150 --> 00:17:34,480 forrige uke er hvorfor? 293 00:17:34,480 --> 00:17:38,000 Når du gjør hvis s er lik lik t hva er du virkelig 294 00:17:38,000 --> 00:17:40,550 under panseret sammenligne? 295 00:17:40,550 --> 00:17:41,910 >> Du sammenligner adressene. 296 00:17:41,910 --> 00:17:47,950 Og akkurat intuitivt, tydelig, Ox123 ikke kommer til å like Ox456. 297 00:17:47,950 --> 00:17:49,380 Disse tallene, de biter er bare annerledes. 298 00:17:49,380 --> 00:17:53,220 >> Og så konsekvent, i forrige uke det sagt du skriver forskjellige ting, selv om 299 00:17:53,220 --> 00:17:55,360 Ordene var ordrett det samme. 300 00:17:55,360 --> 00:17:58,770 Så vi fikse dette. 301 00:17:58,770 --> 00:18:00,120 I lekmann vilkår, hva var fix? 302 00:18:00,120 --> 00:18:02,110 >> PUBLIKUM: Bruk en funksjon. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: Bruk en funksjon. 304 00:18:02,870 --> 00:18:05,190 Eller stjerner er definitivt involvert, men bruker en funksjon for å gjøre hva? 305 00:18:05,190 --> 00:18:05,962 >> PUBLIKUM: Å sammenligne strengene. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: Å sammenligne strengene. 307 00:18:07,390 --> 00:18:11,030 Så det grunnleggende problemet her var at jeg bare vurderer 308 00:18:11,030 --> 00:18:15,870 Kvaliteten av strenger som skal defineres av sammenligning av deres adresser. 309 00:18:15,870 --> 00:18:18,540 Og selvsagt det er bare dumt nå en gang du forstår hva som skjer 310 00:18:18,540 --> 00:18:19,510 under hetten. 311 00:18:19,510 --> 00:18:23,270 For virkelig å sammenligne strenger å se om de er like på den måten at et menneske 312 00:18:23,270 --> 00:18:26,680 ville vurdere to strenger å være lik vi trenger å sammenligne dem karakter for 313 00:18:26,680 --> 00:18:28,070 tegn for tegn. 314 00:18:28,070 --> 00:18:30,020 >> Nå kunne jeg ha gjort dette veldig ordinært. 315 00:18:30,020 --> 00:18:32,240 Men familiarly, vi ved hjelp av en for-løkke. 316 00:18:32,240 --> 00:18:36,050 Og bare sammenligne s brakett jeg mot t brakett jeg. 317 00:18:36,050 --> 00:18:39,590 s brakett i pluss en mot t brakett I pluss en, og så videre, inne 318 00:18:39,590 --> 00:18:40,580 en slags løkke. 319 00:18:40,580 --> 00:18:44,950 Og hvis jeg øye på to tegn som forskjellig, eller om jeg innser at ooh, er s 320 00:18:44,950 --> 00:18:48,410 kortere enn t eller lengre enn t Jeg kan umiddelbart si falskt, 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 får gjennom s og t og si samme, samme, samme, samme, samme, slutten av 323 00:18:55,370 --> 00:18:58,520 begge strenger, kan jeg si sann, er de like. 324 00:18:58,520 --> 00:19:01,040 Vel, heldigvis, år siden noen skrev at koden for oss. 325 00:19:01,040 --> 00:19:03,790 >> Og de kalte det StrComp for streng sammenligne. 326 00:19:03,790 --> 00:19:11,900 Og selv om det er en liten counter intuitive, returnerer StrComp 0 hvis de 327 00:19:11,900 --> 00:19:14,520 to strenger, s og t er like. 328 00:19:14,520 --> 00:19:18,090 Men den returnerer negativ verdi hvis s bør komme før t alfabetisk eller 329 00:19:18,090 --> 00:19:20,610 positiv verdi dersom det skulle komme etter t alfabetisk. 330 00:19:20,610 --> 00:19:24,030 >> Så hvis du noen gang ønsker å sortere noe, det viser seg at StrComp er nyttig. 331 00:19:24,030 --> 00:19:26,660 Fordi den ikke bare si ja eller nei, lik eller ikke. 332 00:19:26,660 --> 00:19:30,440 Det gir deg en følelse av bestilling liker en ordbok makt. 333 00:19:30,440 --> 00:19:33,770 Så StrComp, lik s komma t lik 0 betyr at den 334 00:19:33,770 --> 00:19:35,200 strenger er virkelig like. 335 00:19:35,200 --> 00:19:38,680 Fordi den som skrev denne funksjonen år siden antagelig brukt en for loop 336 00:19:38,680 --> 00:19:42,840 eller en while-loop eller noe sånt å integrere over karakterene igjen 337 00:19:42,840 --> 00:19:45,270 og igjen og igjen. 338 00:19:45,270 --> 00:19:47,300 >> Men problemet to oppsto 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ødt er fordi det er feil. 341 00:19:51,680 --> 00:19:52,800 Og hva gjorde vi gjøre her? 342 00:19:52,800 --> 00:19:54,310 Vel, første jeg ringte GetString. 343 00:19:54,310 --> 00:19:56,255 Og jeg lagret avkastningen verdien i s. 344 00:19:56,255 --> 00:20:00,260 Så det er ganske mye det samme som denne øverste delen av bildet. 345 00:20:00,260 --> 00:20:01,490 >> Men hva kommer etter det? 346 00:20:01,490 --> 00:20:04,980 Vel, la meg gå videre og bli kvitt av en hel haug med dette. 347 00:20:04,980 --> 00:20:09,650 Vi vil spole tilbake i tid til der vi bare har s, som nå er i samsvar med 348 00:20:09,650 --> 00:20:10,940 linjen der oppe. 349 00:20:10,940 --> 00:20:11,400 >> Jeg sjekke. 350 00:20:11,400 --> 00:20:13,450 Hvis s er lik lik 0. 351 00:20:13,450 --> 00:20:18,670 Nå, en rask side note, når kan GetString returnere 0? 352 00:20:18,670 --> 00:20:19,580 Det er ikke nok minne. 353 00:20:19,580 --> 00:20:19,880 Høyre? 354 00:20:19,880 --> 00:20:22,310 >> Det er sjelden at dette kommer til å skje, sikkert på en datamaskin som er 355 00:20:22,310 --> 00:20:24,740 fikk hundrevis av megs eller selv gigabyte RAM. 356 00:20:24,740 --> 00:20:27,080 Men det kan, i teorien, returnere 0, særlig hvis den 357 00:20:27,080 --> 00:20:28,080 bruker ikke samarbeider. 358 00:20:28,080 --> 00:20:31,640 Det er måter å late som om du ikke har Angitt noe og triks 359 00:20:31,640 --> 00:20:34,100 GetString i retur 0 effektivt. 360 00:20:34,100 --> 00:20:35,470 >> Så det kommer til å se etter det. 361 00:20:35,470 --> 00:20:39,430 Fordi hvis noen av dere har begynt å få, allerede, segmentering feil - 362 00:20:39,430 --> 00:20:42,280 som trolig har vært en kilde av litt frustrasjon - 363 00:20:42,280 --> 00:20:46,150 de er nesten alltid resultatet av feil i minne. 364 00:20:46,150 --> 00:20:50,440 Somehow du søl opp med hensyn til en pekeren, selv om du ikke visste 365 00:20:50,440 --> 00:20:51,530 Det var en peker. 366 00:20:51,530 --> 00:20:55,260 Så du kan ha indusert segmentering feil så tidlig som uke en bruker 367 00:20:55,260 --> 00:21:02,100 noe som en for løkke eller en stund sløyfe og en rekke ved å gå for langt 368 00:21:02,100 --> 00:21:05,900 forbi grensene av noen matrise som du erklært, i uke to i 369 00:21:05,900 --> 00:21:06,690 særlig. 370 00:21:06,690 --> 00:21:09,220 >> Du har kanskje gjort det selv i problemet satt fire med Breakout. 371 00:21:09,220 --> 00:21:12,910 Selv om du sannsynligvis ikke har sett noen stjerner i fordelingen koden for 372 00:21:12,910 --> 00:21:17,410 Breakout, viser det seg at de GRect og Goval og andre slike ting, 373 00:21:17,410 --> 00:21:19,650 de er faktisk pekere under hetten. 374 00:21:19,650 --> 00:21:23,430 >> Men Stanford, som oss, liksom skjuler at detaljer i hvert fall for bibliotekene 375 00:21:23,430 --> 00:21:26,540 formål, mye som vi gjør for streng og røye *. 376 00:21:26,540 --> 00:21:30,060 Men GRect og Goval og alle de ting dere er eller skal bruke 377 00:21:30,060 --> 00:21:32,630 denne uken er slutt minneadresser. 378 00:21:32,630 --> 00:21:33,650 Du vet bare ikke det. 379 00:21:33,650 --> 00:21:37,240 >> Så det er ikke overraskende da, kanskje, som du kanskje turen over noen 380 00:21:37,240 --> 00:21:38,580 segmentering feil. 381 00:21:38,580 --> 00:21:41,290 Men det som er interessant her nå, hvis etter vi se etter 0 vi gjør 382 00:21:41,290 --> 00:21:43,460 string t får s. 383 00:21:43,460 --> 00:21:44,690 Vel, la meg erklære t. 384 00:21:44,690 --> 00:21:47,730 Jeg kommer til å trekke det som en firkant, 32 biter, kall det t. 385 00:21:47,730 --> 00:21:49,740 Og så skal jeg gjøre får s. 386 00:21:49,740 --> 00:21:51,130 >> Vel, hva betyr det? 387 00:21:51,130 --> 00:21:53,280 Vel, det er litt vanskelig å tenke om det bildet klok. 388 00:21:53,280 --> 00:21:55,025 Men la oss tenke på hva som er inni av x? 389 00:21:55,025 --> 00:21:59,430 Hva er bokstavelig talt inne i denne variabelen? 390 00:21:59,430 --> 00:22:01,500 Verdien Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Så når jeg sier streng t får s, som bare bokstavelig talt betyr ta nummeret 392 00:22:05,815 --> 00:22:10,070 i s, som er Ox123 og sette den Ox123. 393 00:22:10,070 --> 00:22:13,740 Eller billedlig, hvis jeg slags abstrakt bort fra at detaljer den har 394 00:22:13,740 --> 00:22:16,600 Effekten av bokstavelig talt å gjøre dette også. 395 00:22:16,600 --> 00:22:22,110 >> Så nå tenker tilbake til forrige uke da vi gikk videre til kapitalistiske T. Jeg 396 00:22:22,110 --> 00:22:23,800 gjorde T brakett 0. 397 00:22:23,800 --> 00:22:27,150 Vel, T brakett 0, selv om det er en pekeren, kan du behandle det som om 398 00:22:27,150 --> 00:22:29,220 det er en matrise, med en firkantet brakett notasjon. 399 00:22:29,220 --> 00:22:31,550 >> Så hvor er T brakett 0? 400 00:22:31,550 --> 00:22:32,990 Vel, det er h. 401 00:22:32,990 --> 00:22:36,800 Og så når vi bruker den linjen med kode, to øvre, som er i det c type.h 402 00:22:36,800 --> 00:22:38,460 header-fil, det er der den er deklarert. 403 00:22:38,460 --> 00:22:44,410 Du utnytte denne H. Men av Selvfølgelig, det er nøyaktig samme h som er 404 00:22:44,410 --> 00:22:46,540 innsiden av s, så å si. 405 00:22:46,540 --> 00:22:51,930 Og så nå har du endret eller kapitalisert både den opprinnelige og den 406 00:22:51,930 --> 00:22:53,120 så-kalte kopi. 407 00:22:53,120 --> 00:22:56,620 Fordi du ikke lage en kopi i måte som et menneske ønsker den skal være. 408 00:22:56,620 --> 00:22:59,710 >> Så hva var fix her, i copy1.c forrige uke? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funksjoner, slik at vi kunne faktisk kopier strengen. 411 00:23:05,580 --> 00:23:08,700 Og fundamentalt, hva vi trenger for å gjøre for å kopiere strengen? 412 00:23:08,700 --> 00:23:12,070 >> Vel, i denne grønne versjonen her er jeg kommer til å gjøre det ganske lavt nivå. 413 00:23:12,070 --> 00:23:14,260 Det er faktisk funksjoner de kunne hjelpe med dette. 414 00:23:14,260 --> 00:23:17,710 Men det mest grunnleggende, og den mest kjent en, i det minste, vil snart være 415 00:23:17,710 --> 00:23:19,600 kjent for oss, er følgende - 416 00:23:19,600 --> 00:23:21,910 slik at en på den første linje av koden i grønt nå. 417 00:23:21,910 --> 00:23:23,970 >> Jeg bare skrev s som røye *. 418 00:23:23,970 --> 00:23:25,250 Det er ingen funksjonell forskjell der. 419 00:23:25,250 --> 00:23:28,790 Jeg bare kastet bort CS50 bibliotek og Jeg kaller det hva det er, en røye *. 420 00:23:28,790 --> 00:23:31,640 >> Nå prikk, prikk, prikk, fordi det var noen feilkontroll det er ikke 421 00:23:31,640 --> 00:23:33,200 interessant å snakke om igjen. 422 00:23:33,200 --> 00:23:34,710 Så nå t er deklarert. 423 00:23:34,710 --> 00:23:35,780 Det er også en røye *. 424 00:23:35,780 --> 00:23:38,280 Så jeg trakk opp en liten kvadrat skjermen som før. 425 00:23:38,280 --> 00:23:41,870 >> Men på høyre side, malloc, vi sa er minne fordele. 426 00:23:41,870 --> 00:23:44,130 Så tildele noen del av minnet. 427 00:23:44,130 --> 00:23:48,830 Og hvor mange byte gjør vi faktisk ønsker å fordele, virker det? 428 00:23:48,830 --> 00:23:50,340 >> Vel, strengen lengden på s. 429 00:23:50,340 --> 00:23:52,310 Så hvis det er hallo det er kommer til å være fem. 430 00:23:52,310 --> 00:23:53,950 Vi vil si 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å pluss en, hvorfor en? 433 00:23:57,960 --> 00:23:58,830 Den 0 karakter. 434 00:23:58,830 --> 00:24:03,640 Hvis vi ikke gir rom for denne fyren vi kunne tilfeldigvis skape en situasjon 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å neste gang GetString er kalt og jeg skriver inn, for eksempel, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, at maskinen kommer å tenke at s er faktisk 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-D-a-v-i-d fordi det er ingen pause i mellom disse ordene. 439 00:24:18,900 --> 00:24:19,810 >> Så vi trenger det 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 si. 443 00:24:23,110 --> 00:24:25,220 Men det er virkelig på tide størrelse på røye. 444 00:24:25,220 --> 00:24:28,040 Teknisk røye er nesten alltid en enkelt byte. 445 00:24:28,040 --> 00:24:31,030 >> Men bare for å gjøre vår kode bærbar, så å si, slik at det fungerer på 446 00:24:31,030 --> 00:24:33,750 forskjellige datamaskiner selv om de kanskje være noe forskjellig under 447 00:24:33,750 --> 00:24:36,590 hette, jeg kommer til generisk si størrelsen på røye, slik at 448 00:24:36,590 --> 00:24:37,660 koden min alltid fungerer. 449 00:24:37,660 --> 00:24:40,610 Og jeg trenger ikke å rekompilere det bare fordi jeg oppgradere min datamaskin eller bruke 450 00:24:40,610 --> 00:24:42,140 noen annen plattform. 451 00:24:42,140 --> 00:24:45,300 >> Så jeg har fått seks ganger størrelsen på en røye, som skjer for å være en. 452 00:24:45,300 --> 00:24:47,440 Så det betyr malloc kunne gi meg seks bytes. 453 00:24:47,440 --> 00:24:49,140 Hva er det egentlig gjør? 454 00:24:49,140 --> 00:24:52,810 Vel, la meg rulle tilbake i tid her til der vi er i historien. 455 00:24:52,810 --> 00:24:57,620 >> Så hvis jeg går tilbake hit, har jeg erklært en røye * heter t. 456 00:24:57,620 --> 00:25:00,280 Jeg har nå kalt malloc for seks bytes. 457 00:25:00,280 --> 00:25:06,400 Og nå skal jeg trekke de seks bytes akkurat som matrisen tidligere. 458 00:25:06,400 --> 00:25:10,570 Men jeg faktisk ikke vet hva som er inne i denne matrisen. 459 00:25:10,570 --> 00:25:14,640 >> Hvis du allokere minne det viser seg at du kan ikke stole på at det er noen 460 00:25:14,640 --> 00:25:15,810 kjent verdi der. 461 00:25:15,810 --> 00:25:18,400 Det kunne ha blitt brukt av noe annet, en annen funksjon, noen andre 462 00:25:18,400 --> 00:25:19,630 linje med kode som du skrev. 463 00:25:19,630 --> 00:25:22,870 Så får vi vanligvis kaller disse søppel verdier og tegne dem, kanskje, som 464 00:25:22,870 --> 00:25:26,170 spørsmålstegn, bare indikerer at vi vet ikke hva som er faktisk der. 465 00:25:26,170 --> 00:25:30,390 Og det er ingen big deal så lenge vi er smart nok til å overskrive de 466 00:25:30,390 --> 00:25:34,550 søppel verdier med tall eller tegn på at vi bryr oss om. 467 00:25:34,550 --> 00:25:36,340 >> Så i dette tilfellet hva skal jeg gjøre? 468 00:25:36,340 --> 00:25:38,670 Vel, min linje av koden neste, jeg har fire. 469 00:25:38,670 --> 00:25:41,350 int jeg får 0, får n hyssinglengde på s. 470 00:25:41,350 --> 00:25:42,750 Så en kjent for loop. 471 00:25:42,750 --> 00:25:45,875 I er mindre enn eller lik n, som vanligvis er over. 472 00:25:45,875 --> 00:25:47,500 >> Men denne gangen er det bevisst. 473 00:25:47,500 --> 00:25:51,890 I + +, og da jeg rett og slett gjøre t brakett jeg får s. 474 00:25:51,890 --> 00:25:56,320 Fordi bildet mitt ser slik ut på dette øyeblikk, som er lagret i t er 475 00:25:56,320 --> 00:25:59,530 Adressen til at tilfeldig mengde minne der verdiene er ukjent. 476 00:25:59,530 --> 00:26:03,030 Men så snart jeg gjør t brakett 0 som setter meg her. 477 00:26:03,030 --> 00:26:07,430 >> Og hva som ender opp med å bli trukket dit? 478 00:26:07,430 --> 00:26:08,740 Vi ender opp med å sette h. 479 00:26:08,740 --> 00:26:11,170 Fordi det er hva som står på s brakett 0. 480 00:26:11,170 --> 00:26:14,300 Og deretter det samme for e, og L, og L, og o. 481 00:26:14,300 --> 00:26:17,930 >> n, hvorfor jeg går opp gjennom en lik n? 482 00:26:17,930 --> 00:26:19,200 På grunn av den 0 karakter. 483 00:26:19,200 --> 00:26:23,580 Så bare for å være klar, da, hvis jeg faktisk fjerner alt disse søppel 484 00:26:23,580 --> 00:26:28,870 verdier er og deretter faktisk trekke i hva jeg forventer, er dette s en brakett, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, pluss det er etterfølgende ny karakter. 486 00:26:32,440 --> 00:26:36,080 >> Og så nå hvis vi fortsatte forbi prikk, prikk, prikk i dette korrekt versjon 487 00:26:36,080 --> 00:26:41,930 og aktiverte t brakett 0 jeg ville, av Selvfølgelig skal utnytte nettopp dette 488 00:26:41,930 --> 00:26:47,050 fyren her, som konseptuelt, ble til slutt målet. 489 00:26:47,050 --> 00:26:48,040 Så det er all pekeren er. 490 00:26:48,040 --> 00:26:51,430 >> Og du har brukt dem i flere uker nå i forbindelse med strenger. 491 00:26:51,430 --> 00:26:53,530 Men under panseret er de litt mer komplisert. 492 00:26:53,530 --> 00:26:57,520 Men hvis du tenker på dem i denne billedlige formen jeg foreslå at de er 493 00:26:57,520 --> 00:27:01,720 sannsynligvis ikke alle som skremmende som de kan først virke ved første øyekast, 494 00:27:01,720 --> 00:27:04,730 spesielt med en slik ny syntaks. 495 00:27:04,730 --> 00:27:07,290 Eventuelle spørsmål om pekere, strenger, eller chars? 496 00:27:07,290 --> 00:27:07,580 Yeah? 497 00:27:07,580 --> 00:27:09,252 >> PUBLIKUM: Kan du gå tilbake til [uhørlig]? 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 aller siste linje, trenger du ikke en * t linjen 501 00:27:19,525 --> 00:27:21,513 og a * s i linjen? 502 00:27:21,513 --> 00:27:23,004 Har du ikke referansen til - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ah, et virkelig godt spørsmål. 504 00:27:24,640 --> 00:27:26,800 Hvorfor har jeg ikke en * t og a * s? 505 00:27:26,800 --> 00:27:30,340 Fordi kort, forrige uke, som i vår swap funksjon, gjorde jeg si at når 506 00:27:30,340 --> 00:27:33,350 du har fått en peker de midler som du går det som vi gjorde 507 00:27:33,350 --> 00:27:36,590 fysisk på scenen, var å faktisk bruke stjernen operatør. 508 00:27:36,590 --> 00:27:40,570 >> Det viser seg at denne plassen-brakett notasjon er hva vi kaller syntaktisk 509 00:27:40,570 --> 00:27:44,190 sukker, som er bare en sexy måte sier det er korte notasjonen for 510 00:27:44,190 --> 00:27:45,950 akkurat det du beskriver. 511 00:27:45,950 --> 00:27:49,385 Men det er litt mer intuitivt. 512 00:27:49,385 --> 00:27:53,510 Og med fare for å gjøre dette virke mer komplisert enn den trenger å være, 513 00:27:53,510 --> 00:27:56,990 hva som egentlig skjer her er følgende - 514 00:27:56,990 --> 00:28:01,450 Hvis jeg sier * t som betyr å gå til adressen som er lagret i t. 515 00:28:01,450 --> 00:28:04,350 >> Så bokstavelig talt, hvis t er lagring adressen til denne h 516 00:28:04,350 --> 00:28:07,300 utgangspunktet, * t betyr gå her. 517 00:28:07,300 --> 00:28:10,730 Nå, hva t brakett 0 betyr? 518 00:28:10,730 --> 00:28:11,560 Samme ting. 519 00:28:11,560 --> 00:28:13,510 Det er bare litt mer brukervennlig vennlig å skrive. 520 00:28:13,510 --> 00:28:14,430 >> Men jeg er ikke ferdig ennå. 521 00:28:14,430 --> 00:28:17,800 Jeg kan ikke bare si * t får * s. 522 00:28:17,800 --> 00:28:19,440 For hva ville jeg gjøre da? 523 00:28:19,440 --> 00:28:22,950 Jeg vil være å sette h, h, h, h, h gjennom hele greia. 524 00:28:22,950 --> 00:28:22,995 Høyre? 525 00:28:22,995 --> 00:28:26,020 >> Fordi * t er å gå til adressen i t. 526 00:28:26,020 --> 00:28:27,580 Men vi er inne i en løkke. 527 00:28:27,580 --> 00:28:32,150 Og hvilken verdi jeg inkrementering, selvfølgelig på hver iterasjon? 528 00:28:32,150 --> 00:28:32,690 jeg. 529 00:28:32,690 --> 00:28:34,590 >> Men det er en mulighet her, ikke sant? 530 00:28:34,590 --> 00:28:37,870 Selv om dette føles som det blir litt mer sofistikert 531 00:28:37,870 --> 00:28:40,730 enn kvadrat-brakett notasjon vi har brukt på en stund - 532 00:28:40,730 --> 00:28:43,840 la meg angre mitt h endring der - 533 00:28:43,840 --> 00:28:48,870 selv om dette er nå å få litt mer avansert, den grunnleggende ideen, hvis * t 534 00:28:48,870 --> 00:28:53,630 betyr her og * t er bare gå til adressen i t. 535 00:28:53,630 --> 00:28:54,990 >> Men hva var adressen i t? 536 00:28:54,990 --> 00:28:56,850 Tallet vi fortsette å bruke? 537 00:28:56,850 --> 00:29:00,540 Som Ox456, la oss ta det tilbake bare for moro skyld for diskusjon. 538 00:29:00,540 --> 00:29:05,380 Vel, hvis jeg ønsker å få på e i t streng, jeg bare ønsker å gå til, 539 00:29:05,380 --> 00:29:06,460 hovedsak, 456. 540 00:29:06,460 --> 00:29:09,230 >> Eller rettere sagt, 457. 541 00:29:09,230 --> 00:29:10,590 Jeg trenger bare å legge en. 542 00:29:10,590 --> 00:29:11,790 Men jeg kan gjøre det, ikke sant? 543 00:29:11,790 --> 00:29:14,680 Fordi t, selv om jeg holder tegning det nå som en pil, det er bare en 544 00:29:14,680 --> 00:29:16,570 nummer, Ox456. 545 00:29:16,570 --> 00:29:21,400 Og hvis jeg legger man til det, eller mer generelt, hvis jeg legger jeg til at jeg kan 546 00:29:21,400 --> 00:29:24,350 faktisk får akkurat der jeg vil. 547 00:29:24,350 --> 00:29:26,260 Så hvis jeg faktisk gjør dette - 548 00:29:26,260 --> 00:29:28,970 og dette er hva som nå kalles pekeren aritmetiske - 549 00:29:28,970 --> 00:29:30,375 Jeg kan fjerne denne linjen. 550 00:29:30,375 --> 00:29:33,550 Som er ærlig, tror jeg klarere og litt mer brukervennlig å lese. 551 00:29:33,550 --> 00:29:35,970 Men dette er ikke mindre korrekt. 552 00:29:35,970 --> 00:29:38,570 >> Dette kodelinje nå bruker pekeren aritmetikk. 553 00:29:38,570 --> 00:29:40,920 Det sier gå til følgende adresse - 554 00:29:40,920 --> 00:29:44,670 uansett starten av t er, hvilken er t pluss I, som i utgangspunktet 555 00:29:44,670 --> 00:29:45,730 er 0, som er flott. 556 00:29:45,730 --> 00:29:49,280 Fordi det betyr begynnelsen på t 1 pluss pluss 2, 3 pluss, og så videre. 557 00:29:49,280 --> 00:29:51,030 Og samme avtale med s. 558 00:29:51,030 --> 00:29:52,750 >> Så syntaktisk sukker for dette. 559 00:29:52,750 --> 00:29:55,900 Men å forstå hva som egentlig skjer under panseret, vil jeg hevde, 560 00:29:55,900 --> 00:29:57,410 faktisk er nyttig i seg selv. 561 00:29:57,410 --> 00:30:00,620 Fordi det betyr at nå er det ikke mye mer magi skjer 562 00:30:00,620 --> 00:30:01,620 under hetten. 563 00:30:01,620 --> 00:30:03,920 Det kommer ikke til å være mange flere lag som vi kan skrelle tilbake etter deg. 564 00:30:03,920 --> 00:30:04,810 Dette er ca. 565 00:30:04,810 --> 00:30:06,410 Og dette er programmering. 566 00:30:06,410 --> 00:30:08,002 Virkelig godt spørsmål. 567 00:30:08,002 --> 00:30:11,570 >> Ok, så dette var at buggy programmet jeg refererte til tidligere. 568 00:30:11,570 --> 00:30:12,650 swap var feil. 569 00:30:12,650 --> 00:30:14,070 Hvis synes å fungere. 570 00:30:14,070 --> 00:30:17,390 Husk at akkurat som med melk og appelsinjuice - som jeg startet 571 00:30:17,390 --> 00:30:18,660 drikking dagens demonstrasjon. 572 00:30:18,660 --> 00:30:22,220 Så akkurat som med appelsinjuice og melken, vi må bruke en 573 00:30:22,220 --> 00:30:26,200 midlertidig variabel, tmp, for å holde en midlertidig slik at vi kunne da 574 00:30:26,200 --> 00:30:28,820 endre sin verdi og deretter oppdatere b. 575 00:30:28,820 --> 00:30:32,870 >> Men denne funksjonen, sa vi, eller dette program som denne funksjonen var 576 00:30:32,870 --> 00:30:35,670 skrevet var galt og feil, 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: Akkurat, da du kaller swap - 581 00:30:44,940 --> 00:30:47,820 eller mer generelt, når du kalle de fleste noen funksjon - 582 00:30:47,820 --> 00:30:51,210 hvis argumentene til at funksjonen er primitive, så å si, ints og chars 583 00:30:51,210 --> 00:30:56,740 og dobbeltrom og flyter, ting uten stjerner, er du passerer i en kopi av 584 00:30:56,740 --> 00:30:57,540 argumentet. 585 00:30:57,540 --> 00:31:01,580 Så hvis x og y var en var 2, er en kommer å være en og b kommer til å være to. 586 00:31:01,580 --> 00:31:05,250 Men de kommer til å være forskjellige biter av bits, ulike biter av 587 00:31:05,250 --> 00:31:07,540 minne som tilfeldigvis lagring identiske verdier. 588 00:31:07,540 --> 00:31:12,160 >> Så denne koden er super perfekt ved å bytte en og b. 589 00:31:12,160 --> 00:31:13,850 Det er ikke bra i bytte - 590 00:31:13,850 --> 00:31:15,290 i forrige ukes eksempel - 591 00:31:15,290 --> 00:31:16,390 x og y. 592 00:31:16,390 --> 00:31:18,780 Fordi igjen, de er i feil omfang. 593 00:31:18,780 --> 00:31:21,310 >> Nå, hvordan vi går om å fikse dette? 594 00:31:21,310 --> 00:31:23,140 Vi måtte gjøre funksjonen ser litt styggere. 595 00:31:23,140 --> 00:31:25,250 Men igjen, vurdere hva Dette betyr bare. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> Og faktisk, la meg, for konsistens, endre én ting, så det er identisk med 598 00:31:31,500 --> 00:31:33,200 hva vi nettopp gjorde. 599 00:31:33,200 --> 00:31:35,690 Som jeg nevnte i forrige uke, det gjør det ikke uansett hvor den går. 600 00:31:35,690 --> 00:31:38,120 Faktisk, du vanligvis ville sette stjerne ved siden av variabelnavnet. 601 00:31:38,120 --> 00:31:40,750 Men jeg tror det ville være litt lettere for å vurdere de * ved siden av 602 00:31:40,750 --> 00:31:44,910 datatype som betyr at det er en peker til en int i dette tilfellet. 603 00:31:44,910 --> 00:31:46,270 >> Så hva gjør jeg her? 604 00:31:46,270 --> 00:31:49,590 Jeg sier ikke gi meg en int etterfulgt av en annen int, 605 00:31:49,590 --> 00:31:50,810 kaller dem a og b. 606 00:31:50,810 --> 00:31:52,460 Gi meg adressen til en int. 607 00:31:52,460 --> 00:31:53,960 Gi meg adressen til en annen int. 608 00:31:53,960 --> 00:31:56,330 Ring disse adressene a og b. 609 00:31:56,330 --> 00:32:00,860 >> Og deretter bruke * notasjon ned nedenfor, kan du gå til hver av disse adressene 610 00:32:00,860 --> 00:32:05,290 etter behov for å få enten eller angi verdien. 611 00:32:05,290 --> 00:32:07,400 Men det er et unntak 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 gjør jeg ikke dette, for eksempel? 614 00:32:15,070 --> 00:32:19,370 Det føles som om jeg skal bare gå alt ut og korrigere hele greia. 615 00:32:19,370 --> 00:32:19,752 Yeah? 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ært tmp som en streng. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Så dette ville erklære, i dette tilfellet, en tmp å være adressen til en int. 621 00:32:34,950 --> 00:32:37,380 Men det er ikke helt hva jeg vil, for et par grunner. 622 00:32:37,380 --> 00:32:38,616 >> PUBLIKUM: Du ønsker ikke å bytte dem. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Akkurat, jeg ønsker ikke å bytte noe med tmp. tmp er bare 624 00:32:41,800 --> 00:32:42,790 uke-én ting. 625 00:32:42,790 --> 00:32:45,150 Alt jeg ønsker er en variabel å lagre noen nummer. 626 00:32:45,150 --> 00:32:47,330 Jeg vet ikke engang bryr seg om adresser i dette øyeblikk. 627 00:32:47,330 --> 00:32:50,530 >> Jeg trenger bare 32 bits eller så å lagre en int. 628 00:32:50,530 --> 00:32:56,690 Og jeg ønsker å sette i disse 32 bits hva er ikke i en, så å si, men 629 00:32:56,690 --> 00:33:01,260 det som er ved en, bare for å være mer presis. 630 00:33:01,260 --> 00:33:06,420 Fordi hvis en er en adresse, * et middel gå dit og få verdien 1. 631 00:33:06,420 --> 00:33:10,560 For eksempel, i forrige ukes eksempel eller b sak, få verdien av to. 632 00:33:10,560 --> 00:33:11,750 >> Så hva er det egentlig som skjer? 633 00:33:11,750 --> 00:33:15,070 La meg tegne et bilde her som vil bare erte hverandre en del av i dag. 634 00:33:15,070 --> 00:33:18,580 Men dette vil fortsette å dukke opp for en stund. 635 00:33:18,580 --> 00:33:22,430 >> Dette, jeg hevder, er det datamaskinens minne ser ut når du kjø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 kjører et program på toppen av datamaskinens RAM - så tenk på 638 00:33:28,340 --> 00:33:33,530 dette rektangelet, virkelig, som din datamaskinens RAM eller minne, alt 101 639 00:33:33,530 --> 00:33:36,920 milliard byte av det, alt to milliarder bytes, alle to gigabyte det, 640 00:33:36,920 --> 00:33:39,910 uansett hvor mange du har er, la oss trekke det som et rektangel. 641 00:33:39,910 --> 00:33:43,260 Og jeg hevder at når du kjører et program som Microsoft Word eller Chrome 642 00:33:43,260 --> 00:33:49,220 eller noe sånt, de biter som Microsoft eller at Google skrev - 643 00:33:49,220 --> 00:33:50,910 i tilfeller av disse programmene - 644 00:33:50,910 --> 00:33:54,490 er lastet inn i datamaskinens minne hvor de kan utføres mer 645 00:33:54,490 --> 00:33:57,520 raskt og matet inn i prosessoren, hvilken er hjernene av datamaskinen. 646 00:33:57,520 --> 00:34:00,940 >> Og i TAM de er lagret i det toppen av programmet, så å si. 647 00:34:00,940 --> 00:34:03,300 Med andre ord, hvis dette er en del av minne, når du dobbeltklikker på 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, bitene kommer av harddisken. 649 00:34:05,740 --> 00:34:06,680 De blir lastet inn i RAM. 650 00:34:06,680 --> 00:34:10,330 Og vi vil dytte dem opp på toppen av dette rektangelet konseptuelt. 651 00:34:10,330 --> 00:34:13,010 >> Vel, er resten av minnet ditt brukes til forskjellige ting. 652 00:34:13,010 --> 00:34:16,460 På toppen ser du initialisere data og uninitialize data. 653 00:34:16,460 --> 00:34:20,500 Dette har å gjøre, for det meste, med konstanter eller globale variabler 654 00:34:20,500 --> 00:34:21,340 som har verdier. 655 00:34:21,340 --> 00:34:22,980 Men mer om dem en annen gang. 656 00:34:22,980 --> 00:34:25,150 >> Da har du heap, som vi vil komme tilbake til. 657 00:34:25,150 --> 00:34:28,420 Men på bunnen er den delen som er spesielt Germane akkurat nå. 658 00:34:28,420 --> 00:34:30,210 Det er den såkalte stabelen. 659 00:34:30,210 --> 00:34:33,850 Så akkurat som i de fleste noen D hall her på campus, har du de skuffene som 660 00:34:33,850 --> 00:34:37,210 bare stables over hverandre på hvilken du kan sette mat og whatnot. 661 00:34:37,210 --> 00:34:40,139 Stabelen i et datasystem er svært lik. 662 00:34:40,139 --> 00:34:42,679 Unntatt mens skuffen, som vi bruker i matsalen, selvfølgelig, er ment 663 00:34:42,679 --> 00:34:45,710 å bære ting magasinene eller rammene - 664 00:34:45,710 --> 00:34:49,469 som vi kaller dem - i en datamaskins brukes til å holde 665 00:34:49,469 --> 00:34:51,610 variabler og verdier. 666 00:34:51,610 --> 00:34:53,929 >> Så hva går egentlig på under panseret? 667 00:34:53,929 --> 00:34:55,820 Vel, la meg snu til skjermen her. 668 00:34:55,820 --> 00:34:58,370 Og la oss fokusere bare på nederste delen for et øyeblikk. 669 00:34:58,370 --> 00:35:02,770 Hvis dette er den nederste del av mine datamaskinens minne det viser seg når jeg 670 00:35:02,770 --> 00:35:05,350 kaller funksjonen main - som skjer, ærlig, 671 00:35:05,350 --> 00:35:06,950 automatisk for meg - 672 00:35:06,950 --> 00:35:10,510 Jeg får en del av minnet på bunnen av RAM min så å si. 673 00:35:10,510 --> 00:35:13,390 Og det er her viktigste er lokale variabler gå. 674 00:35:13,390 --> 00:35:16,770 Det er der argc og argv kanskje gå, og eventuelle variabler I 675 00:35:16,770 --> 00:35:18,170 erklære innsiden av main. 676 00:35:18,170 --> 00:35:20,260 De ender opp på bunnen av datamaskinens RAM. 677 00:35:20,260 --> 00:35:25,040 >> Nå antar at viktigste samtalene en funksjon som swap, som det gjorde i forrige uke? 678 00:35:25,040 --> 00:35:30,620 Vel, vi i hovedsak sette en ny skuff, en ny ramme, på min del av minnet. 679 00:35:30,620 --> 00:35:34,160 Og jeg kommer til å beskrive dette som tilhørighet til swap-funksjonen. 680 00:35:34,160 --> 00:35:35,770 >> Nå hva som er inni swap? 681 00:35:35,770 --> 00:35:39,240 Vel, basert på forrige ukes program og den vi nettopp så et utdrag fra, 682 00:35:39,240 --> 00:35:46,590 innsiden av swap er ramme, eller på swap er skuffen, er hva variabler? 683 00:35:46,590 --> 00:35:47,970 Vel, a og b. 684 00:35:47,970 --> 00:35:51,850 Fordi de var de lokale argumenter, pluss en tredje, tmp. 685 00:35:51,850 --> 00:35:54,470 Så egentlig kunne jeg trekke dette litt mer renslig. 686 00:35:54,470 --> 00:35:56,680 La meg gå videre og angre på etiketten. 687 00:35:56,680 --> 00:35:58,520 Og la meg si at du vet hva? 688 00:35:58,520 --> 00:36:00,560 >> en er trolig kommer til å ende opp her. 689 00:36:00,560 --> 00:36:02,160 B kommer til å ende opp her. 690 00:36:02,160 --> 00:36:03,810 Og tmp kommer til å ende opp her. 691 00:36:03,810 --> 00:36:05,160 Nå, de bestiller kanskje være litt annerledes. 692 00:36:05,160 --> 00:36:06,840 Men konseptuelt dette er ideen. 693 00:36:06,840 --> 00:36:11,490 >> Og bare kollektivt, dette er hva vi kaller swap er ramme, eller 694 00:36:11,490 --> 00:36:12,136 spisesalen skuffen. 695 00:36:12,136 --> 00:36:13,150 Og samme avtale med main. 696 00:36:13,150 --> 00:36:14,040 Men jeg vil ikke tegne det. 697 00:36:14,040 --> 00:36:17,810 Men det er der argc og argv og eventuelle av sine lokale variabler som x og y 698 00:36:17,810 --> 00:36:18,940 kan være så godt. 699 00:36:18,940 --> 00:36:22,170 >> Så nå vurdere hva som virkelig skjer når du ringer swap. 700 00:36:22,170 --> 00:36:26,370 Når du ringer swap, gjennomføre kode som dette, er du passerer, i 701 00:36:26,370 --> 00:36:30,670 buggy versjon, a og b som kopier av x og y. 702 00:36:30,670 --> 00:36:34,300 Så hvis jeg nå trekke dette på skjermen - 703 00:36:34,300 --> 00:36:36,700 må bli bedre på dette - 704 00:36:36,700 --> 00:36:40,850 slik at historien jeg fortalte til meg selv var i denne buggy versjonen, når vi 705 00:36:40,850 --> 00:36:46,130 ringe bytte passerer bokstavelig a og b som heltall, hva er det egentlig som skjer? 706 00:36:46,130 --> 00:36:48,250 >> Vel, det som egentlig skjer er dette. 707 00:36:48,250 --> 00:36:52,850 La meg gå videre og angre bare å rydde litt plass her. 708 00:36:52,850 --> 00:36:54,720 Så dette er min datamaskinens minne. 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 la oss gjøre det på denne måten - 711 00:36:58,910 --> 00:37:02,690 hvis jeg påstår at dette er x, lagring verdien 1, akkurat som i forrige uke. 712 00:37:02,690 --> 00:37:05,930 Og dette er y, lagring verdien 2 akkurat som forrige uke. 713 00:37:05,930 --> 00:37:11,370 Og dette er det viktigste, når jeg ringer swap, og dermed gi meg selv tilgang til en og 714 00:37:11,370 --> 00:37:15,150 b og tmp, kommer jeg til å hevde at Dette er en, og dette er en. 715 00:37:15,150 --> 00:37:16,080 >> Dette er b. 716 00:37:16,080 --> 00:37:17,010 Dette er to. 717 00:37:17,010 --> 00:37:18,370 Dette kalles tmp. 718 00:37:18,370 --> 00:37:23,360 >> Og i utgangspunktet, har det noen søppel verdi før jeg faktisk lagre i det, 719 00:37:23,360 --> 00:37:24,450 som er 1. 720 00:37:24,450 --> 00:37:28,320 Så jeg går videre og endre en å være det? 721 00:37:28,320 --> 00:37:29,720 B verdi. 722 00:37:29,720 --> 00:37:31,980 >> Og så nå har jeg to her. 723 00:37:31,980 --> 00:37:34,050 Og da vi sa b får tmp. 724 00:37:34,050 --> 00:37:37,670 Igjen, akkurat som en mental helse sjekk, den tredje kodelinje her er ganske enkelt dette 725 00:37:37,670 --> 00:37:39,440 en, får b tmp. 726 00:37:39,440 --> 00:37:41,730 >> Og så til slutt, hva gjør jeg? 727 00:37:41,730 --> 00:37:46,800 Jeg går videre og endre b for å være hva verdien av TMP er, som er en. 728 00:37:46,800 --> 00:37:48,390 Jeg vet ikke røre tmp igjen. 729 00:37:48,390 --> 00:37:54,100 >> Men nå er problemet så snart som swap avkastning, fordi det ikke overlate 730 00:37:54,100 --> 00:37:57,540 sikkerhetskopiere noen verdi, er det ingen vei tilbake uttalelse eksplisitt i den. 731 00:37:57,540 --> 00:37:59,080 Hva er det som egentlig skjer? 732 00:37:59,080 --> 00:38:03,480 Vel, egentlig alt dette minnet - 733 00:38:03,480 --> 00:38:07,410 OK, tilsynelatende viskelær liker bare én finger om gangen - 734 00:38:07,410 --> 00:38:08,180 bare forsvinner. 735 00:38:08,180 --> 00:38:10,070 >> Nå i virkeligheten er det ikke noe sted. 736 00:38:10,070 --> 00:38:11,810 Men du kan tenke på det nå som spørsmålstegn. 737 00:38:11,810 --> 00:38:14,040 Fordi det er ikke lenger faktisk er i bruk. 738 00:38:14,040 --> 00:38:17,470 Og ingenting blir gjort med disse verdiene. 739 00:38:17,470 --> 00:38:21,920 >> Så i tilfelle av den grønne versjonen av denne koden, er det i stedet være 740 00:38:21,920 --> 00:38:24,640 gått inn swap? 741 00:38:24,640 --> 00:38:25,770 Så adresser. 742 00:38:25,770 --> 00:38:28,520 Så adressen til x og adressen til y. 743 00:38:28,520 --> 00:38:35,790 Så hvis vi re-fortelle denne historien en siste tid, og jeg faktisk trekke bytte igjen, 744 00:38:35,790 --> 00:38:44,620 men med pekere, dette blir en, dette være b, og dette blir tmp, hva er 745 00:38:44,620 --> 00:38:49,080 faktisk er lagret i en i denne grønne versjon av koden min der jeg har bestått 746 00:38:49,080 --> 00:38:52,110 i-adresser? 747 00:38:52,110 --> 00:38:53,780 >> Det kommer til å være en peker 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 la oss bruke den samme vilkårlig eksempel som før. 750 00:38:57,310 --> 00:39:01,220 La oss si at dette er noe som Ox123. 751 00:39:01,220 --> 00:39:04,970 Og dette kommer til å være Ox127 fordi det er fire byte bort 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 igjen, jeg tar noen friheter med tallene. 754 00:39:09,080 --> 00:39:11,430 De er mye mindre enn de ville faktisk være og i en annen rekkefølge. 755 00:39:11,430 --> 00:39:14,350 Men det er hvordan bildet Nå er annerledes. 756 00:39:14,350 --> 00:39:19,060 >> Men når jeg bruker denne grønne koden og jeg får int tmp ikke * en. 757 00:39:19,060 --> 00:39:25,010 * Et middel til å gjøre følgende, ta adressen som er i en og gå til det, 758 00:39:25,010 --> 00:39:26,190 som er 1. 759 00:39:26,190 --> 00:39:28,480 Og det er det jeg da satt i tmp. 760 00:39:28,480 --> 00:39:32,480 I mellomtiden, i den neste linje med kode her, * en får b, hva betyr det? 761 00:39:32,480 --> 00:39:36,910 >> Vel, * en, så gå her får * b, som betyr gå dit. 762 00:39:36,910 --> 00:39:39,310 Og det betyr sette verdien til der. 763 00:39:39,310 --> 00:39:43,670 Til slutt, den siste linje av koden bare sa * b får tmp. 764 00:39:43,670 --> 00:39:48,900 >> Så b sier gå dit og overskrive den med tmp som, i dette tilfellet, går 765 00:39:48,900 --> 00:39:51,520 å være igjen, en. 766 00:39:51,520 --> 00:39:54,920 Og dette er grunnen til den grønne versjonen av våre koden fungerer, mens den røde 767 00:39:54,920 --> 00:39:56,010 versjon aldri gjorde. 768 00:39:56,010 --> 00:39:59,020 Det alle bare koker ned til hvordan minne styres og hvor det er 769 00:39:59,020 --> 00:40:02,580 faktisk plasseres i datamaskinens RAM. 770 00:40:02,580 --> 00:40:07,270 Og for nå, er at en av de tingene at stabelen blir brukt til. 771 00:40:07,270 --> 00:40:09,225 >> Spørsmål om oppsettet? 772 00:40:09,225 --> 00:40:10,380 På pekere? 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 >> Greit, så malloc, husker, gjorde noe sånt som dette. 776 00:40:17,043 --> 00:40:18,260 Dette var en super enkelt eksempel. 777 00:40:18,260 --> 00:40:20,550 Og dette var den som Binky introduserte oss til, om enn ganske 778 00:40:20,550 --> 00:40:21,870 raskt, ved slutten av klasse. 779 00:40:21,870 --> 00:40:24,480 Dammit, der vi går igjen. 780 00:40:24,480 --> 00:40:28,780 >> Så husker at dette var et eksempel på at Binky introduserte oss til, om enn 781 00:40:28,780 --> 00:40:30,360 noe raskere ved slutten av klasse. 782 00:40:30,360 --> 00:40:33,640 Og her har vi brukt malloc virkelig for andre gang. 783 00:40:33,640 --> 00:40:37,330 Fordi den første gang brukes det funnet å skape nok RAM, allokere nok RAM 784 00:40:37,330 --> 00:40:38,340 å lagre en streng. 785 00:40:38,340 --> 00:40:40,250 >> Denne gangen Binky holdt det enkelt. 786 00:40:40,250 --> 00:40:42,465 Så det er å lagre bare en int, tilsynelatende. 787 00:40:42,465 --> 00:40:43,510 Og det er helt greit. 788 00:40:43,510 --> 00:40:46,560 Det er litt rart, ærlig, til bruke malloc å tildele en int. 789 00:40:46,560 --> 00:40:50,650 Men poenget med Nick claymation var egentlig bare fortelle historien om hva 790 00:40:50,650 --> 00:40:53,830 skjer eller ikke skjer når du mishandle minne. 791 00:40:53,830 --> 00:40:56,520 >> Så i dette tilfelle dette programmet gjorde et par ting. 792 00:40:56,520 --> 00:41:01,580 I det første tilfellet her, erklærer det en peker som heter x til en int. 793 00:41:01,580 --> 00:41:04,480 Det erklærer deretter en peker kalt y til en int. 794 00:41:04,480 --> 00:41:06,150 Den lagrer deretter i x, hva? 795 00:41:06,150 --> 00:41:07,110 Noen andre nå. 796 00:41:07,110 --> 00:41:09,685 Hva blir lagret i x henhold til den tredje linjen i dette programmet? 797 00:41:09,685 --> 00:41:12,380 >> PUBLIKUM: [uhørlig]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: Vel, ikke helt bytes, per si. 799 00:41:14,130 --> 00:41:16,760 Være mer presis nå. 800 00:41:16,760 --> 00:41:18,325 Hva blir lagret i x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 En adresse, tror jeg jeg hørte det. 803 00:41:22,060 --> 00:41:23,570 >> Så hva kommer ikke tilbake malloc? 804 00:41:23,570 --> 00:41:26,030 malloc atferdsmessig tildeler en del av minnet. 805 00:41:26,030 --> 00:41:27,850 Men hvordan gjør det gi deg tilgang til det? 806 00:41:27,850 --> 00:41:29,460 Den returnerer hva? 807 00:41:29,460 --> 00:41:32,000 Adressen til den første byte i mengde minne. 808 00:41:32,000 --> 00:41:33,020 >> Nå, dette er super enkelt. 809 00:41:33,020 --> 00:41:35,380 Det er bare én byte, noe som betyr at adressere vi får tilbake er 810 00:41:35,380 --> 00:41:37,300 adressen til hele greia. 811 00:41:37,300 --> 00:41:42,070 Så lagret i x da, er adressen av at mengde minne. 812 00:41:42,070 --> 00:41:43,400 I mellomtiden, hva skjer videre? 813 00:41:43,400 --> 00:41:45,890 Så egentlig, la oss gå videre og trekke dette ut virkelig rask. 814 00:41:45,890 --> 00:41:52,490 >> Så hvis vi går over til skjermen her og vi spiller dette ut int * x og int * y 815 00:41:52,490 --> 00:41:53,740 kommer til å gjøre det for meg? 816 00:41:53,740 --> 00:41:58,280 Jeg hevder at det bare kommer til å gjøre noe som dette og kaller det x, og 817 00:41:58,280 --> 00:42:00,010 dette og kaller det y. 818 00:42:00,010 --> 00:42:03,110 I mellomtiden er den tredje linjen med kode kommer til å fordele på størrelse med en int, 819 00:42:03,110 --> 00:42:06,160 som skjer for å være - beklager hvis jeg sa ett før jeg betydde en int - 820 00:42:06,160 --> 00:42:08,280 fire byte på en vanlig datamaskin. 821 00:42:08,280 --> 00:42:09,720 Minst med CS50 apparatet. 822 00:42:09,720 --> 00:42:11,490 >> Så dette kommer til å allokere det, hvem vet? 823 00:42:11,490 --> 00:42:12,800 Et eller annet sted her. 824 00:42:12,800 --> 00:42:15,780 Og dette er lagret på et eller annet adresse Ox, hvem vet? 825 00:42:15,780 --> 00:42:18,330 Men hva kommer til å bli returnert er denne adressen. 826 00:42:18,330 --> 00:42:22,270 Men vi skal trekke dette pictorially som bare en pil sånn. 827 00:42:22,270 --> 00:42:25,430 >> Nå i neste linje * x blir 42. 828 00:42:25,430 --> 00:42:29,400 Hva * x betyr i lekmann vilkår? 829 00:42:29,400 --> 00:42:30,040 Bare gå dit. 830 00:42:30,040 --> 00:42:30,960 Gå til denne adressen. 831 00:42:30,960 --> 00:42:35,900 Eller med andre ord, følg pil og sette 42 der. 832 00:42:35,900 --> 00:42:38,140 Men så skjedde noe dårlig skjedde til Binky, ikke sant? 833 00:42:38,140 --> 00:42:43,950 >> Husker at linje fem her, får * y 13, faktisk et uheldig tall, 834 00:42:43,950 --> 00:42:44,760 gjorde det for oss? 835 00:42:44,760 --> 00:42:47,320 Vel, * y del gå dit. 836 00:42:47,320 --> 00:42:50,460 Vel, dette har ikke vært gitt en verdi ennå, ikke sant? 837 00:42:50,460 --> 00:42:54,090 Koden trenger ikke være y initialisert til noe. 838 00:42:54,090 --> 00:42:56,120 Vi hadde x initialiseres til en adresse. 839 00:42:56,120 --> 00:42:57,640 Men y ble erklært opp toppen. 840 00:42:57,640 --> 00:43:00,250 Men så et semikolon, ingen verdi ble faktisk satt i den. 841 00:43:00,250 --> 00:43:02,330 Så det er rimelig å kalle dette en søppel verdi. 842 00:43:02,330 --> 00:43:03,430 Hvem vet hva som er der? 843 00:43:03,430 --> 00:43:07,160 Det er restene av biter som ble brukt ved noen tidligere linje med kode i 844 00:43:07,160 --> 00:43:08,300 mitt program. 845 00:43:08,300 --> 00:43:13,250 >> Så hvis jeg sier gå dit, dette er som, Jeg aner ikke hvor denne pilen er 846 00:43:13,250 --> 00:43:14,490 kommer til å ende opp. 847 00:43:14,490 --> 00:43:17,720 Og det er da du vanligvis få en segmentering feil. 848 00:43:17,720 --> 00:43:22,430 Hvis du ved et uhell dereference, så å snakke, eller gå til en adresse som ikke er 849 00:43:22,430 --> 00:43:25,400 faktisk en legitim adresse, dårlige ting skje. 850 00:43:25,400 --> 00:43:27,550 >> Og det er akkurat hva som skjedde å tenke Binky. 851 00:43:27,550 --> 00:43:31,060 Så husker at historien at Nick var forteller her var den samme ideen som hva 852 00:43:31,060 --> 00:43:34,050 Jeg har tegnet med en illusjon av kritt på bordet der. 853 00:43:34,050 --> 00:43:35,960 X og Y er deklarert. 854 00:43:35,960 --> 00:43:39,690 >> Da vi tildelt størrelsen på en int og lagret den i x. 855 00:43:39,690 --> 00:43:42,130 Så neste linjen vi gjorde * x. 856 00:43:42,130 --> 00:43:46,070 Dette var nicks tryllestav av dereferencing. 857 00:43:46,070 --> 00:43:49,780 Som satt 42 i minnet påpekt av x. 858 00:43:49,780 --> 00:43:51,600 >> Men det er der ting gikk fryktelig galt. 859 00:43:51,600 --> 00:43:51,820 Høyre? 860 00:43:51,820 --> 00:43:53,550 Vi prøvde å dereference y. 861 00:43:53,550 --> 00:43:55,620 Men y hadde noen falsk verdi, ikke sant? 862 00:43:55,620 --> 00:43:57,720 >> At pilen nederst til venstre hjørne, er ikke 863 00:43:57,720 --> 00:43:58,950 faktisk peker til noe. 864 00:43:58,950 --> 00:44:01,520 Det er på en måte å gjøre det jeg gjorde her på brettet. 865 00:44:01,520 --> 00:44:05,900 Så dårlige ting skje, segmentering skyld, eller Binky skyld, i dette tilfellet. 866 00:44:05,900 --> 00:44:10,800 >> Men hvis vi da fikse det ved å gjøre x får y hvordan historien seg? 867 00:44:10,800 --> 00:44:15,760 Vel, hvis jeg gjør x blir y, det er effektivt det samme som å si 868 00:44:15,760 --> 00:44:19,235 hva dette er, Ox-noe kommer til å være det samme her, 869 00:44:19,235 --> 00:44:20,080 Ox-noe. 870 00:44:20,080 --> 00:44:22,970 Eller billedlig vi vil trekke en pil. 871 00:44:22,970 --> 00:44:25,530 >> Så her på brettet med Binky, med den foregående linje i 872 00:44:25,530 --> 00:44:28,350 koden, betyr * y gå dit. 873 00:44:28,350 --> 00:44:29,400 Hvor er det? 874 00:44:29,400 --> 00:44:30,820 Det betyr over her. 875 00:44:30,820 --> 00:44:36,050 >> Og når vi oppdaterer den til å være 13 det innebærer bare går og 876 00:44:36,050 --> 00:44:39,470 skriver 13 her nå. 877 00:44:39,470 --> 00:44:44,130 Så kanskje ikke helt grei ved første øyekast. 878 00:44:44,130 --> 00:44:47,740 Men for å oppsummere og å bruke samme sjargong at Binky var bruker her, så 879 00:44:47,740 --> 00:44:50,485 de to første fordele pekere, x og y, men ikke de pointees. 880 00:44:50,485 --> 00:44:54,750 Og pointees er ikke en vanligvis brukt begrep. 881 00:44:54,750 --> 00:44:56,120 Men pekeren er absolutt. 882 00:44:56,120 --> 00:44:59,200 Men det er hva som blir påpekt på i Binky sin nomenklatur. 883 00:44:59,200 --> 00:45:01,660 >> Denne neste linje selvsagt tildeler en int pointee. 884 00:45:01,660 --> 00:45:04,840 Så en del av minnet - som jeg trakk over på høyre side der - og sett 885 00:45:04,840 --> 00:45:06,470 x lik peker på den. 886 00:45:06,470 --> 00:45:11,350 Dette dereferences x for å lagre 42 i minnet at den peker på. 887 00:45:11,350 --> 00:45:13,380 Og så dette, selvfølgelig, var en dårlig ting. 888 00:45:13,380 --> 00:45:15,600 Fordi y ikke var peker på noe ennå. 889 00:45:15,600 --> 00:45:16,530 Dette fikser det. 890 00:45:16,530 --> 00:45:18,240 Så dette er fortsatt buggy program. 891 00:45:18,240 --> 00:45:21,580 Bare fordi vi blåser gjennom koden linje for linje og si, oh well, 892 00:45:21,580 --> 00:45:22,690 la det krasje 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 bare kommer til å abortere helt på den linjen. 895 00:45:26,790 --> 00:45:30,550 Men hvis du skulle fjerne krasjet Line og erstatte den med de to siste 896 00:45:30,550 --> 00:45:32,470 linjer der du tilordner - 897 00:45:32,470 --> 00:45:35,310 bruke pekeren oppdrag - y å peke på x som punkt t. 898 00:45:35,310 --> 00:45:39,280 Og så dereference y på en svært sikker måte. 899 00:45:39,280 --> 00:45:41,520 >> Så hvor etterlater dette oss? 900 00:45:41,520 --> 00:45:45,350 Vel, det viser seg at under panseret i CS50 bibliotek, pekere er 901 00:45:45,350 --> 00:45:46,320 brukt gjennom. 902 00:45:46,320 --> 00:45:48,910 Og vi vil faktisk begynne å skrelle tilbake at lag før lenge. 903 00:45:48,910 --> 00:45:51,740 Men det viser også et uttrykk som noen av dere kan bli kjent med, 904 00:45:51,740 --> 00:45:54,580 spesielt de mer komfortable, er faktisk at av en meget populær 905 00:45:54,580 --> 00:45:56,390 hjemmeside, eller stack overflow, disse dager. 906 00:45:56,390 --> 00:45:58,720 >> Men dette har faktisk veldig tekniske betydning. 907 00:45:58,720 --> 00:46:00,160 Vi vet nå hva en stabel er. 908 00:46:00,160 --> 00:46:02,550 Det er som en bunke med skuffer innsiden av en spisesal. 909 00:46:02,550 --> 00:46:05,140 >> Eller innsiden av datamaskinens minnet de rammer 910 00:46:05,140 --> 00:46:06,900 som blir brukt av funksjoner. 911 00:46:06,900 --> 00:46:10,760 Vel, det viser seg at på grunn av at meget enkel implementering av 912 00:46:10,760 --> 00:46:14,970 hukommelse og rammene på såkalte stable, kan du faktisk ta kontroll 913 00:46:14,970 --> 00:46:17,050 av et datamaskin-system ganske enkelt. 914 00:46:17,050 --> 00:46:22,180 Du kan hacke seg inn i et system hvis folk som oss ikke har skrevet vår kode 915 00:46:22,180 --> 00:46:23,300 spesielt godt. 916 00:46:23,300 --> 00:46:26,670 >> Hvis folk liker oss bruke biter av minne eller bruk arrays - 917 00:46:26,670 --> 00:46:27,810 enda oftere - 918 00:46:27,810 --> 00:46:31,800 men noen ganger glemmer å kontrollere grenser matrise vår som du kanskje 919 00:46:31,800 --> 00:46:38,470 har selv noen ganger, og iterated altfor langt forbi slutten en matrise. 920 00:46:38,470 --> 00:46:40,520 I beste fall, ditt program kan bare krasje. 921 00:46:40,520 --> 00:46:42,280 Segmentering feil, snill for pinlige. 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 programmet er faktisk på ekte brukernes datamaskiner, hvis det kjører 924 00:46:49,480 --> 00:46:53,070 på et nettsted som faktiske tilfeldige mennesker på internett er å treffe, slik at 925 00:46:53,070 --> 00:46:56,690 folk indusere dårlige ting på koden din er generelt ikke en god ting fordi 926 00:46:56,690 --> 00:46:59,930 det betyr en mulighet til å ta kontroll av datamaskinen. 927 00:46:59,930 --> 00:47:01,350 Og dette kommer til å se litt kryptisk. 928 00:47:01,350 --> 00:47:04,570 Men jeg tenkte jeg skulle skremme deg med Dette siste eksempelet 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 det er en god Wikipedia artikkel som går gjennom 931 00:47:07,370 --> 00:47:08,530 dette i mer detalj. 932 00:47:08,530 --> 00:47:13,890 Jeg har main på bunnen kall foo, passerer i argv av en. 933 00:47:13,890 --> 00:47:15,750 Og det er bare slik at du kan kjøre programmet og pass 934 00:47:15,750 --> 00:47:17,080 en vilkårlig inngang. 935 00:47:17,080 --> 00:47:20,180 >> Og så foo er erklært toppen som å akseptere en streng, eller mer 936 00:47:20,180 --> 00:47:21,700 presist, en røye *. 937 00:47:21,700 --> 00:47:23,860 Det erklærer deretter en rekke tegn. 938 00:47:23,860 --> 00:47:27,130 Kall det en buffer, mer generelt, av størrelse 12. 939 00:47:27,130 --> 00:47:30,900 Så 12 tegn kan passe inn av denne matrisen kalles c. 940 00:47:30,900 --> 00:47:33,510 >> Og så den bruker den nye funksjonen, som er ny, men ikke vanskelig å 941 00:47:33,510 --> 00:47:34,930 forstå, minne kopi. 942 00:47:34,930 --> 00:47:39,290 Den kopierer minnet fra baren, som var den variable forbi n, uansett 943 00:47:39,290 --> 00:47:42,080 brukeren har skrevet inn argv 1 inn c. 944 00:47:42,080 --> 00:47:43,090 Hvor mange bytes? 945 00:47:43,090 --> 00:47:44,260 Strengen lengde på bar. 946 00:47:44,260 --> 00:47:48,380 >> Så med andre ord, hvis brukeren skriver inn h-e-l-l-o enter, strengen lengde 947 00:47:48,380 --> 00:47:49,260 Hallo er fem. 948 00:47:49,260 --> 00:47:52,790 Så fem av disse bytes kommer til å få kopiert inn i matrisen kalt c, som 949 00:47:52,790 --> 00:47:54,110 er av størrelse 12. 950 00:47:54,110 --> 00:47:58,710 Men hva brukeren skriver i en mye lengre ord som er 13 tegn eller 14 951 00:47:58,710 --> 00:48:01,250 tegn eller 100 tegn eller mer? 952 00:48:01,250 --> 00:48:02,660 >> Hvor de kommer til å gå? 953 00:48:02,660 --> 00:48:06,090 Vel, det ramme, denne skuffen i spisesalen stack, 954 00:48:06,090 --> 00:48:06,930 de kommer til å gå dit. 955 00:48:06,930 --> 00:48:10,080 Og det er bare kommer til å begynne å overskrive andre ting som allerede er 956 00:48:10,080 --> 00:48:12,880 på at bunken, overfylte bunken, så å si. 957 00:48:12,880 --> 00:48:14,780 >> Så billedlig, tenk på det på denne måten. 958 00:48:14,780 --> 00:48:17,970 Dette er bare en fargerik versjon av bildet vi har vært tegning. 959 00:48:17,970 --> 00:48:20,060 Nederst, la oss si, er det viktigste. 960 00:48:20,060 --> 00:48:24,690 Og på toppen, hva du ser nå blir rammen, fargekodet nå, for en 961 00:48:24,690 --> 00:48:26,090 funksjon kalt foo. 962 00:48:26,090 --> 00:48:30,170 Men det som er interessant her om foo er at her er rammen. 963 00:48:30,170 --> 00:48:32,860 Så det er trukket akkurat som jeg gjorde, men i lys blå. 964 00:48:32,860 --> 00:48:35,220 Og nå det er her c brakett 0 går. 965 00:48:35,220 --> 00:48:37,410 Og det er her c brakett 11 kommer til å ende opp. 966 00:48:37,410 --> 00:48:39,670 >> Med andre ord, det skjer representeres 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 å ende 968 00:48:42,320 --> 00:48:46,070 0 opp ved sted hele veien opp til 11 fordi det er 0 indeksert. 969 00:48:46,070 --> 00:48:49,170 >> Men hvor er det 13. tegnet kommer til å ende opp? 970 00:48:49,170 --> 00:48:50,310 Hvor er den 14.? 971 00:48:50,310 --> 00:48:52,430 Hvor er den 50. karakter kommer til å ende opp? 972 00:48:52,430 --> 00:48:54,070 >> Det kommer til å holde det gående ned. 973 00:48:54,070 --> 00:48:57,350 For selv om vi har trukket bilde med bunken vokser opp, 974 00:48:57,350 --> 00:48:59,920 adresser, viser det seg, gå fra små adresser, liten 975 00:48:59,920 --> 00:49:01,830 pekere, til store adresser. 976 00:49:01,830 --> 00:49:03,540 Så det bare fortsetter å gå opp og opp. 977 00:49:03,540 --> 00:49:05,660 >> Så hvis brukeren skriver inn hallo, det er flott. 978 00:49:05,660 --> 00:49:08,650 Ingen bug, ikke noe problem, alle er trygt. 979 00:49:08,650 --> 00:49:11,940 Men hvis brukeren skriver inn hva vi vil kaller motstandere kode, representert 980 00:49:11,940 --> 00:49:16,040 generelt som en, angrep, angrep, angrep, angrep, hva kan skje? 981 00:49:16,040 --> 00:49:19,760 >> Vel, hvis alle innspill som brukeren skrevet i er ikke bare noen vennlige 982 00:49:19,760 --> 00:49:21,540 eller støtende streng med tegn. 983 00:49:21,540 --> 00:49:24,050 Det er faktisk en sekvens av tegn at hvis du kompilert det, 984 00:49:24,050 --> 00:49:26,050 det er faktisk kode. 985 00:49:26,050 --> 00:49:29,570 Kanskje det er kode som sletter alle filer på harddisken din eller sender spam 986 00:49:29,570 --> 00:49:30,810 eller noe sånt. 987 00:49:30,810 --> 00:49:35,110 Legg merke til at det som er viktig her er at hvis skurken hadde flaks nok til å 988 00:49:35,110 --> 00:49:37,830 overskrive den røde mengde minne - 989 00:49:37,830 --> 00:49:41,080 som jeg ikke trekke på bildet mitt, men dette Wikipedia bildet her har - 990 00:49:41,080 --> 00:49:42,890 sin såkalte returadresse. 991 00:49:42,890 --> 00:49:47,470 >> Når mat avkastning, når swap returer, hvordan vet datamaskinen til å gå fra 992 00:49:47,470 --> 00:49:49,790 her oppe til her nede? 993 00:49:49,790 --> 00:49:52,920 Eller i tech segment opp ovenfor, hvor gjør det vet å gå fra swap 994 00:49:52,920 --> 00:49:54,870 koden - det 0 og 1-ere som komponere swap - 995 00:49:54,870 --> 00:49:56,020 tilbake til hovedsiden? 996 00:49:56,020 --> 00:50:00,450 Det er en såkalt returadresse lagret i den samme stabel ramme, på 997 00:50:00,450 --> 00:50:02,140 samme kafeteria skuffen. 998 00:50:02,140 --> 00:50:06,080 >> Så hvis skurken er smart nok til å sette angrep kode, angrep kode, angrep 999 00:50:06,080 --> 00:50:07,960 kode, og ha flaks nok - 1000 00:50:07,960 --> 00:50:11,630 ofte gjennom prøving og feiling - til overskrive den røde returadresse, 1001 00:50:11,630 --> 00:50:14,360 med adressen og innkalling helt til topps. 1002 00:50:14,360 --> 00:50:16,830 Legg merke 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Det er skrevet baklengs opp toppen for grunnene til at vi vil kanskje revurdere. 1004 00:50:20,650 --> 00:50:22,050 Dette er det nummeret. 1005 00:50:22,050 --> 00:50:25,790 >> Så hvis slemmingen blir heldige nok eller er smart nok til å overskrive den røde 1006 00:50:25,790 --> 00:50:29,480 stripe av minne med adressen kode som han eller hun har en eller annen måte 1007 00:50:29,480 --> 00:50:34,980 injisert inn i datamaskinen, gjett som kode kommer til å bli returnert til 1008 00:50:34,980 --> 00:50:38,260 så snart foo blir gjort utføring? 1009 00:50:38,260 --> 00:50:39,440 >> The bad guy kode. 1010 00:50:39,440 --> 00:50:43,610 Så dette angrepet kode, AAA, igjen, kanskje sende spam, kan slette alle filene 1011 00:50:43,610 --> 00:50:44,500 på harddisken. 1012 00:50:44,500 --> 00:50:48,740 Men det er det virkelig en stack overflow er, eller en buffer overkjørt, eller en 1013 00:50:48,740 --> 00:50:51,060 buffer overflow angrep. 1014 00:50:51,060 --> 00:50:54,400 >> Og det er utrolig, utrolig vanlig til denne dagen med programmer skrevet i 1015 00:50:54,400 --> 00:50:58,220 C, C + +, og enda noen andre språk. 1016 00:50:58,220 --> 00:51:02,275 På den skremmende notatet, vil vi avslutte med en vits. 1017 00:51:02,275 --> 00:51:03,230 >> [Latter] 1018 00:51:03,230 --> 00:51:04,550 >> Ser deg på onsdag. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Ved neste CS50 - 1021 00:51:10,310 --> 00:51:15,920 Så jeg er alt ute av disk lamper i dag, men vente, fettfri melk, halvparten telefonen 1022 00:51:15,920 --> 00:51:17,850 bok, appelsinjuice at jeg drakk i dag. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB-kabel, en skiftenøkkel. 1025 00:51:22,780 --> 00:51:24,800 >> [Musikk spilles]