1 00:00:00,000 --> 00:00:11,242 >> [Muziek] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. Malan: Oke dit is CS50 en dit is het begin van week vijf. 3 00:00:16,630 --> 00:00:21,480 Dus vandaag, onder uw zitkussens, je zult niets vinden. 4 00:00:21,480 --> 00:00:24,790 Maar bovenal, moet u deze, een weinig blijk van onze waardering voor 5 00:00:24,790 --> 00:00:26,970 al het werk dat je in het spel van Fifteen. 6 00:00:26,970 --> 00:00:30,290 Verwijder gewoon de kleine cirkel op de bodem om te beginnen met het spelen voor de 7 00:00:30,290 --> 00:00:31,680 rest van de klas. 8 00:00:31,680 --> 00:00:38,930 >> Zo herinneren dat, of weten dat ingesteld probleem vier, die dit weekend ging uit, 9 00:00:38,930 --> 00:00:40,340 gaat het schrijven van een ander spel. 10 00:00:40,340 --> 00:00:43,740 Maar deze keer gaat met behulp van een werkelijke grafische gebruikersinterface, geen 11 00:00:43,740 --> 00:00:46,310 tekstuele interface zoals Partijtje Vijftien was. 12 00:00:46,310 --> 00:00:50,210 En het spel dat voor je ligt, als je nog niet hebt gezien deze volgende, 13 00:00:50,210 --> 00:00:52,310 ziet er een beetje zoiets als dit. 14 00:00:52,310 --> 00:00:55,170 Ik ga om te gaan in mijn terminal raam hier in GDB. 15 00:00:55,170 --> 00:00:58,600 En ik ga om verder te gaan en uit te voeren de personeel oplossing, die u kunt openen 16 00:00:58,600 --> 00:01:01,010 nadat u update 50 zoals gewoonlijk. 17 00:01:01,010 --> 00:01:04,090 >> Maar ik ga het in een kleine geheime modus, een beetje paasei, 18 00:01:04,090 --> 00:01:08,480 zogenaamde God mode, door zetten van God in argv1. 19 00:01:08,480 --> 00:01:12,920 En ik moet mijn eigen weg te volgen, draait het in mijn eigen 20 00:01:12,920 --> 00:01:14,220 probleem set directory. 21 00:01:14,220 --> 00:01:19,190 Dus nu een volledige versie zie je van het spel van Breakout. 22 00:01:19,190 --> 00:01:21,090 In feite is dit losse handen mode. 23 00:01:21,090 --> 00:01:24,850 Dus het is eigenlijk - 24 00:01:24,850 --> 00:01:26,470 wowed al zou je wel - 25 00:01:26,470 --> 00:01:30,850 vrij triviaal om God-modus te implementeren in Breakout, in tegenstelling tot Spel van Fifteen, 26 00:01:30,850 --> 00:01:33,590 die sommigen van jullie misschien hebben aangepakt voor de hacker editie. 27 00:01:33,590 --> 00:01:37,890 >> In Breakout volstaat in God modus om gewoon te doen wat, 28 00:01:37,890 --> 00:01:41,220 intuïtief met de peddel? 29 00:01:41,220 --> 00:01:45,630 Gewoon het gelijk aan wat de horizontale positie is van de bal. 30 00:01:45,630 --> 00:01:49,220 En zolang je dit doet in lockstep de bal beweegt dit spel zal 31 00:01:49,220 --> 00:01:53,100 nooit, nooit, nooit missen de bal en je zult elke keer winnen. 32 00:01:53,100 --> 00:01:55,430 >> Maar in deze week hacker editie er is meer dan alleen God mode. 33 00:01:55,430 --> 00:01:56,720 Er is een aantal andere functies. 34 00:01:56,720 --> 00:01:58,140 Onder hen, lasers. 35 00:01:58,140 --> 00:02:01,070 Zodat als je echt ongeduldig u kan beginnen neer te schieten de stenen 36 00:02:01,070 --> 00:02:02,120 en een paar anderen. 37 00:02:02,120 --> 00:02:04,560 En voor degenen onder u die wilt kalibreren standaard versus hacker 38 00:02:04,560 --> 00:02:08,750 editie, kan ik zien dat van deze week hacker editie opzet is een 39 00:02:08,750 --> 00:02:12,830 weinig meer uitvoerbaar, zeggen, dan God mode was met Game van Vijftien. 40 00:02:12,830 --> 00:02:15,300 >> Dus als u op zoek bent naar een rek en u op zoek bent naar wat extra fun 41 00:02:15,300 --> 00:02:18,400 functies doen duik in als interessant. 42 00:02:18,400 --> 00:02:21,280 Nu meer praktisch, wil ik erop wijzen op een ding ook. 43 00:02:21,280 --> 00:02:24,780 GDB, dat sommigen van jullie misschien nog niet hebben aangeraakt persoonlijk, dat is prima. 44 00:02:24,780 --> 00:02:28,530 Maar nu is echt de tijd om te wennen om deze en comfortabel met deze tool 45 00:02:28,530 --> 00:02:31,510 omdat het je leven zal maken veel gemakkelijker, echt. 46 00:02:31,510 --> 00:02:34,900 >> Per lezing Rob's op GDB een paar van weken geleden, herinneren 47 00:02:34,900 --> 00:02:36,810 dat GDB is een debugger. 48 00:02:36,810 --> 00:02:41,230 Het is een tool waarmee je loopt uw programma, maar voer het stap voor stap, lijn 49 00:02:41,230 --> 00:02:45,680 door lijn, zodat u rond kunt snuffelen, zodat je ziet dingen gebeuren, dus 50 00:02:45,680 --> 00:02:47,310 die u kunt uitprinten waarden van variabelen. 51 00:02:47,310 --> 00:02:50,580 Kortom, het geeft je zoveel meer macht dan printDef doet. 52 00:02:50,580 --> 00:02:52,900 >> Nu toegegeven, de interface is vrij mysterieus. 53 00:02:52,900 --> 00:02:55,180 Zwart en wit tekstuele interface- voor het grootste deel. 54 00:02:55,180 --> 00:02:57,400 De commando's zijn enigszins taai te onthouden op het eerste. 55 00:02:57,400 --> 00:03:01,230 Maar ook al zou je de helft nemen een uur, een uur, om dat vooraf te zetten 56 00:03:01,230 --> 00:03:02,940 investering van tijd in het, geloof me. 57 00:03:02,940 --> 00:03:06,440 Zeker tegen het einde semester het bespaart u een orde van grootte meer 58 00:03:06,440 --> 00:03:07,600 tijd dan dat. 59 00:03:07,600 --> 00:03:09,200 >> Zo vroeg in de week duik inch 60 00:03:09,200 --> 00:03:13,200 En in termen van Breakout, weet dat je kunt dit doen zolang je hebt 61 00:03:13,200 --> 00:03:18,230 de distributie-code of uw eigen code aan de gang in je Pst4 directory. 62 00:03:18,230 --> 00:03:21,680 Weet dat je gdb kan draaien. / Breakout. 63 00:03:21,680 --> 00:03:23,490 >> Dit gaat openstellen een venster als dit. 64 00:03:23,490 --> 00:03:25,530 Laat ik geef mezelf meer van een terminal-venster. 65 00:03:25,530 --> 00:03:27,770 En dan wat ik ga om verder te gaan en te doen, het is niet alleen maar voer het uit. 66 00:03:27,770 --> 00:03:30,690 Ik ga eerst een breekpunt te stellen terugroepen, die u toestaat om te pauzeren 67 00:03:30,690 --> 00:03:32,500 uitvoering op een bepaalde plaats. 68 00:03:32,500 --> 00:03:35,750 >> Gewoon om dingen eenvoudig ik ga houden te breken op lijn een gewoon door te typen 69 00:03:35,750 --> 00:03:37,000 de nummer een. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Laat me eigenlijk heropenen dit venster want het wordt een 72 00:03:43,250 --> 00:03:45,700 beetje klein zijn. 73 00:03:45,700 --> 00:03:53,270 Dus wat ik nu ga doen hier is als ik open mijn raam terminal. 74 00:03:53,270 --> 00:03:53,910 Kom op, daar gaan we. 75 00:03:53,910 --> 00:03:59,850 >> Dus nu als ik terug naar dropbox, Pst4 en uitvoeren gdb. / breakout voeren, merken 76 00:03:59,850 --> 00:04:02,600 Ik ga om te breken een in te stellen een breekpunt op lijn een. 77 00:04:02,600 --> 00:04:04,840 En nu ga ik om te gaan gang en het type uit te voeren. 78 00:04:04,840 --> 00:04:07,370 En als ik dat doe, merk niets lijkt te gebeuren. 79 00:04:07,370 --> 00:04:08,120 >> Er is geen pop-up. 80 00:04:08,120 --> 00:04:09,790 Er is geen grafische gebruikersinterface nog. 81 00:04:09,790 --> 00:04:13,340 Maar dat is begrijpelijk, want ik ben letterlijk op regel een in mijn programma. 82 00:04:13,340 --> 00:04:17,110 En merk dat ik snel heb doorgestuurd, specifiek nu naar 62, omdat alle 83 00:04:17,110 --> 00:04:20,600 het spul aan de bovenkant van dit bestand is dingen als commentaar en constanten en 84 00:04:20,600 --> 00:04:22,460 oninteressante dingen voor nu. 85 00:04:22,460 --> 00:04:25,840 >> Dus nu ben ik de binnenkant van de belangrijkste, het schijnt, op lijn 62. 86 00:04:25,840 --> 00:04:27,960 En dit is slechts de verdeling code, terugroepen. 87 00:04:27,960 --> 00:04:33,810 Als ik dit openen door te gaan, op dezelfde wijze, in mijn dropbox map in Pst4, 88 00:04:33,810 --> 00:04:35,450 in breakout.c. 89 00:04:35,450 --> 00:04:40,670 En als ik scroll naar beneden en beneden en naar beneden, en laat mij ga je gang en zet 90 00:04:40,670 --> 00:04:44,990 mijn lijn nummers. 91 00:04:44,990 --> 00:04:50,300 >> Wat ik zal zien, als ik scroll naar beneden naar lijn 62, is precies de lijn die 92 00:04:50,300 --> 00:04:50,910 we hebben onderbroken op. 93 00:04:50,910 --> 00:04:53,720 Dus deze lijn hier, 62, is waar we staan ​​op het punt te zijn. 94 00:04:53,720 --> 00:04:57,470 Dus nu in GDB, of ik ga je gang en typ nu naast, voer het gaat 95 00:04:57,470 --> 00:04:58,450 voeren die lijn. 96 00:04:58,450 --> 00:05:00,610 En voila, we hebben de zogenaamde g venster. 97 00:05:00,610 --> 00:05:02,800 Als u niet weet wat een GWindow is, geen zorgen te maken. 98 00:05:02,800 --> 00:05:05,740 De spec zal u kennismaken met het, zoals evenals een aantal walkthrough video's 99 00:05:05,740 --> 00:05:06,830 ingebed in het spec. 100 00:05:06,830 --> 00:05:08,610 >> Maar nu laten we maken dit tot een iets interessanter. 101 00:05:08,610 --> 00:05:10,960 Laat me dit venster bewegen over aan de zijkant een beetje. 102 00:05:10,960 --> 00:05:13,480 Laat ik het raam maken een beetje groter dus ik kan meer zien. 103 00:05:13,480 --> 00:05:16,140 >> En nu laat ik ga je gang en opnieuw doen volgende. 104 00:05:16,140 --> 00:05:17,550 En daar zijn mijn bakstenen. 105 00:05:17,550 --> 00:05:20,490 Als ik typ volgende weer Nu zie ik de bal. 106 00:05:20,490 --> 00:05:23,520 En als ik typ volgende weer nu zie ik de peddel. 107 00:05:23,520 --> 00:05:26,690 >> En gelukkig is dit gedit is niet echt samen door het tonen van me 108 00:05:26,690 --> 00:05:27,660 alles wat ik wil. 109 00:05:27,660 --> 00:05:30,820 Maar nu als ik volgende keer doen, volgende nogmaals, ik ben gewoon 110 00:05:30,820 --> 00:05:32,260 verklaren wat variabelen. 111 00:05:32,260 --> 00:05:34,750 En ik kan iemand afdrukken van deze jongens uit. 112 00:05:34,750 --> 00:05:37,170 Print bakstenen, prenten leven. 113 00:05:37,170 --> 00:05:39,910 >> En nu als ik blijven doen volgende, merken dat ik kom 114 00:05:39,910 --> 00:05:40,870 binnenkant van die lus. 115 00:05:40,870 --> 00:05:43,380 Maar de code gaat voeren precies zoals ik verwacht. 116 00:05:43,380 --> 00:05:45,810 Dus toen ik deze functie geraakt, wacht voor Click, het gaat doen 117 00:05:45,810 --> 00:05:46,830 het letterlijk dat. 118 00:05:46,830 --> 00:05:48,870 Dus ik leek controle te hebben verloren op het programma. 119 00:05:48,870 --> 00:05:50,480 >> GDB is niet te geven me een andere prompt. 120 00:05:50,480 --> 00:05:51,500 Maar niet getreurd. 121 00:05:51,500 --> 00:05:53,720 Ga naar mijn spel, klik ergens. 122 00:05:53,720 --> 00:05:56,270 >> En voila, nu overgaat tot lijn 86. 123 00:05:56,270 --> 00:05:59,460 Dus nogmaals, het is van onschatbare waarde, uiteindelijk, voor debugging problemen. 124 00:05:59,460 --> 00:06:03,050 Want je kunt letterlijk stap voor stap door uw code, print dingen uit en veel, 125 00:06:03,050 --> 00:06:03,640 veel, meer. 126 00:06:03,640 --> 00:06:07,210 Maar voor nu, deze tools alleen moet krijg je vrij ver. 127 00:06:07,210 --> 00:06:10,050 >> Dus we zijn, natuurlijk, het nemen van een kijkje bij Graphics nu, ineens. 128 00:06:10,050 --> 00:06:12,350 En nu onze wereld wordt een beetje interessanter. 129 00:06:12,350 --> 00:06:15,680 En weet je, misschien, van enkele van de video's online dat we deze 130 00:06:15,680 --> 00:06:18,280 korte broek die je hebt in de gaten als onderdeel van het probleem sets. 131 00:06:18,280 --> 00:06:20,460 >> En ze zijn neergeschoten, doelbewust, tegen een witte achtergrond. 132 00:06:20,460 --> 00:06:23,380 En sommigen van hen hebben het onderwijs Fellows tekenen wat tekst op het 133 00:06:23,380 --> 00:06:25,490 scherm dat wordt bedekt aan de zijkant ervan. 134 00:06:25,490 --> 00:06:27,760 Maar natuurlijk, dit is niet zo interessant in de echte wereld. 135 00:06:27,760 --> 00:06:30,520 Dit is slechts een collegezaal met een grote witte scherm en een achtergrond. 136 00:06:30,520 --> 00:06:33,330 En onze geweldige productieteam sorteren van maakt alles er mooi 137 00:06:33,330 --> 00:06:36,620 na de feiten door het bijsnijden uit of iets overlappend 138 00:06:36,620 --> 00:06:37,840 we doen of niet willen. 139 00:06:37,840 --> 00:06:41,560 >> Nu alleen maar om deze week te motiveren en echt, waar u kunt gaan, uiteindelijk, 140 00:06:41,560 --> 00:06:42,560 met computer science. 141 00:06:42,560 --> 00:06:44,260 Niet alleen na probleem set vier. 142 00:06:44,260 --> 00:06:48,240 Maar na de andere cursus of een hele curriculum het is verbazingwekkend wat je kunt 143 00:06:48,240 --> 00:06:51,090 doen deze dagen in termen van afbeeldingen in het bijzonder. 144 00:06:51,090 --> 00:06:53,440 >> Sommigen van u misschien dit gezien hebben stroomt rond online. 145 00:06:53,440 --> 00:06:56,240 Maar ik dacht dat ik je laten zien, voor slechts een paar minuten, een glimp van wat 146 00:06:56,240 --> 00:07:01,890 computertechnologie en wat CGI, computer graphics kunnen doen deze dagen 147 00:07:01,890 --> 00:07:04,510 met een bekend liedje en misschien film. 148 00:07:04,510 --> 00:07:05,760 >> [MUZIEK - LANA DEL RAY, "JONG EN MOOI] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> LUIDSPREKER 1: Het is gewoon een klein beetje geweldig, misschien wel, maar hoe 151 00:10:52,470 --> 00:10:52,857 alomtegenwoordig - 152 00:10:52,857 --> 00:10:57,040 >> [Applaus] 153 00:10:57,040 --> 00:10:59,230 >> LUIDSPREKER 1: Ik downloadde het gewoon. 154 00:10:59,230 --> 00:11:02,920 Maar het is echt geweldig, denk ik, net hoe alomtegenwoordig software en code en 155 00:11:02,920 --> 00:11:04,230 tools zoals deze werkelijk zijn. 156 00:11:04,230 --> 00:11:07,685 Dus dat is een voorproefje van de richting waar je kunt gaan. 157 00:11:07,685 --> 00:11:10,620 Oh, niet meer Appliance vandaag. 158 00:11:10,620 --> 00:11:14,640 Nou, dat is eigenlijk tragische timing gezien het punt dat ik probeerde te maken. 159 00:11:14,640 --> 00:11:18,670 >> Oke, dus laten we het lanceren Fusion opnieuw. 160 00:11:18,670 --> 00:11:20,800 Remind me later. 161 00:11:20,800 --> 00:11:24,190 Oke, en je zou hebben gekregen van een e-mail als een terzijde als je kreeg een 162 00:11:24,190 --> 00:11:25,460 merken als dat. 163 00:11:25,460 --> 00:11:29,940 Oke, zo herinneren dat vorige week we begonnen te schillen terug deze 164 00:11:29,940 --> 00:11:31,380 later bekend als string. 165 00:11:31,380 --> 00:11:34,700 >> snaar herinnert een gegevenstype dat is gedeclareerd in de CS50 bibliotheek. 166 00:11:34,700 --> 00:11:37,740 En het is een deel van de zijwieltjes die nu zal beginnen af ​​te nemen. 167 00:11:37,740 --> 00:11:41,280 Het was een nuttig begrip vroeg op. 168 00:11:41,280 --> 00:11:43,750 Maar nu het gaat om meer te halen interessante en krachtiger te 169 00:11:43,750 --> 00:11:48,330 eigenlijk zien dat onder de motorkap, een string is net wat, hebben we gezegd? 170 00:11:48,330 --> 00:11:50,500 >> Ja, dus het is een zogenaamde char *. 171 00:11:50,500 --> 00:11:53,860 En het * er geeft aan dat er een soort adres gaat. 172 00:11:53,860 --> 00:11:58,690 En dus als je zegt char * bedoel je gewoon een variabele waarvan de data type is een 173 00:11:58,690 --> 00:11:59,290 wijzer nu. 174 00:11:59,290 --> 00:12:01,770 Het feit dat er de ster er betekent gewoon dat je bent waarbij een 175 00:12:01,770 --> 00:12:03,020 zogenaamde pointer. 176 00:12:03,020 --> 00:12:06,220 En dat aanwijzer gaat blijkbaar slaan het adres van, van 177 00:12:06,220 --> 00:12:07,810 Natuurlijk, een char. 178 00:12:07,810 --> 00:12:08,960 >> Nu waarom is dit logisch? 179 00:12:08,960 --> 00:12:11,200 Nou, wat is een string onder de motorkap? 180 00:12:11,200 --> 00:12:15,130 Nou ja, voor enige tijd hebben we gezegd dat een string onder de motorkap is 181 00:12:15,130 --> 00:12:18,460 slechts h-e-l-l-o, bijvoorbeeld. 182 00:12:18,460 --> 00:12:21,585 >> Maar we hebben gesproken over dit als die in wezen een array. 183 00:12:21,585 --> 00:12:25,410 En een scala ziet er dan een beetje meer als dit, met elk van deze 184 00:12:25,410 --> 00:12:26,460 het nemen van een hap. 185 00:12:26,460 --> 00:12:28,710 En dan hebben we gezegd dat er iets speciaals hier terug, de 186 00:12:28,710 --> 00:12:31,270 backslash 0 of null-terminator. 187 00:12:31,270 --> 00:12:35,230 >> Dus al die tijd, dit hier is een string. 188 00:12:35,230 --> 00:12:38,320 Maar echt, een string eigenlijk een adres. 189 00:12:38,320 --> 00:12:43,210 En adressen, zoals we zullen zien, zijn vaak voorafgegaan door 0x volgens afspraak. 190 00:12:43,210 --> 00:12:44,540 Wat doet 0x duiden? 191 00:12:44,540 --> 00:12:45,970 Weet iemand? 192 00:12:45,970 --> 00:12:47,320 >> Dus het betekent gewoon hexadecimaal. 193 00:12:47,320 --> 00:12:52,360 Dus je zou kunnen herinneren, eigenlijk, van Pst 1, geloof ik, een van de warm-up 194 00:12:52,360 --> 00:12:55,740 vragen eigenlijk gesteld over hexadecimale notatie naast 195 00:12:55,740 --> 00:12:57,100 binair en decimaal. 196 00:12:57,100 --> 00:13:00,460 En de motivatie is dat met hexadecimale je hebt 16 197 00:13:00,460 --> 00:13:01,770 cijfers tot uw beschikking. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, gevolgd door a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> En als je telt al die omhoog, krijg je een totaal van 16. 200 00:13:10,430 --> 00:13:13,200 Dus dit is in tegenstelling decimaal, waar we 10 201 00:13:13,200 --> 00:13:14,690 cijfers, 0 tot en met negen. 202 00:13:14,690 --> 00:13:17,750 Het is in tegenstelling binaire waar we alleen maar 0 en 1. 203 00:13:17,750 --> 00:13:21,450 >> Maar aan het eind van de dag kun je gewoon geven dezelfde nummers, maar 204 00:13:21,450 --> 00:13:22,500 enigszins anders. 205 00:13:22,500 --> 00:13:25,840 En hexadecimale komt vaak omdat als het blijkt - en we zullen dit zien 206 00:13:25,840 --> 00:13:28,790 later in de cursus - zelfs als we de programmering, in de context van 207 00:13:28,790 --> 00:13:32,100 HTML en kleurcodes, hexadecimaal is leuk. 208 00:13:32,100 --> 00:13:36,390 Omdat elk cijfer, blijkt, vertegenwoordigt vier bits perfect. 209 00:13:36,390 --> 00:13:39,280 Dus het gewoon een soort lijnen mooi als we uiteindelijk zullen zien. 210 00:13:39,280 --> 00:13:44,720 Dus dit zou kunnen zijn Ox123 ofzo als dat, dat duidt op adres 123 211 00:13:44,720 --> 00:13:47,050 ergens binnenkant van mijn het geheugen van de computer. 212 00:13:47,050 --> 00:13:50,600 >> Maar natuurlijk, een aantal problemen voordoen hierdoor onderliggende 213 00:13:50,600 --> 00:13:51,520 implementatie. 214 00:13:51,520 --> 00:13:55,930 En herinner me dat ik een gooi naar uitvoering van een functie als deze - 215 00:13:55,930 --> 00:14:00,260 vergelijk dash 0 dot c vorige week, dat hoewel het zag eruit alsof het was 216 00:14:00,260 --> 00:14:04,270 recht, het gewoon niet te vergelijken twee tekenreeksen correct. 217 00:14:04,270 --> 00:14:07,470 >> Ik heb weg belangrijkste geworpen, en ik heb gegooid weg de reacties alleen te concentreren in op 218 00:14:07,470 --> 00:14:08,970 de code dat is hier van belang. 219 00:14:08,970 --> 00:14:10,660 En het is in het rood omdat het buggy. 220 00:14:10,660 --> 00:14:11,670 Om welke reden? 221 00:14:11,670 --> 00:14:15,890 >> Nou, aan de top er toen ik verklaarde een string, wat er werkelijk aan de hand 222 00:14:15,890 --> 00:14:17,260 onder de motorkap? 223 00:14:17,260 --> 00:14:19,530 Nou, laat me over te gaan naar de screenen hier en teken dat. 224 00:14:19,530 --> 00:14:23,230 Dus verklaarde I, weer, tekenreeks s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Dus ik ga om verder te gaan nu en tekenen s voor wat het werkelijk is. 226 00:14:26,640 --> 00:14:28,590 Het gaat om een ​​vierkant hier te zijn. 227 00:14:28,590 --> 00:14:30,490 En ik ga conclusie dat is 32 bits. 228 00:14:30,490 --> 00:14:32,890 Althans het meestal is, tenminste de CS50 229 00:14:32,890 --> 00:14:34,520 apparaat in een veel computers. 230 00:14:34,520 --> 00:14:35,980 Ik ga het s noemen. 231 00:14:35,980 --> 00:14:39,070 >> Maar nu herinneren dat we riep GetString. 232 00:14:39,070 --> 00:14:41,430 Dus GetString rendement, natuurlijk een tekenreeks. 233 00:14:41,430 --> 00:14:45,790 Als de gebruiker typen in h-e-l-l-o invoeren de string hello wordt geretourneerd. 234 00:14:45,790 --> 00:14:51,010 En die string, zoals we net zeiden, eindigt ergens in het geheugen van uw computer 235 00:14:51,010 --> 00:14:53,240 met een backslash 0 eind. 236 00:14:53,240 --> 00:14:56,650 Ik zal deze tekenen als de matrix - of aaneengesloten blok tekens - 237 00:14:56,650 --> 00:14:58,330 dat het eigenlijk is. 238 00:14:58,330 --> 00:15:01,790 >> En nu, wat is getString eigenlijk terug? 239 00:15:01,790 --> 00:15:04,340 Wat is getString is terug al die tijd? 240 00:15:04,340 --> 00:15:07,520 Nou, we zeggen, in de weken voorafgaande, Het geeft een string. 241 00:15:07,520 --> 00:15:10,250 Maar meer technisch, wat doet GetString terugkeer blijkbaar? 242 00:15:10,250 --> 00:15:11,610 >> PUBLIEK: een adres. 243 00:15:11,610 --> 00:15:12,600 >> LUIDSPREKER 1: een adres. 244 00:15:12,600 --> 00:15:16,630 Concreet is het adres van het weer de eerste hap, wat het ook is. 245 00:15:16,630 --> 00:15:18,830 Ik blijf gewoon met behulp van een, twee, drie want het is handig. 246 00:15:18,830 --> 00:15:21,380 >> Het geeft het adres van de eerste teken in de reeks. 247 00:15:21,380 --> 00:15:23,510 En we vorige week gezegd dat dat volstaat. 248 00:15:23,510 --> 00:15:26,710 Omdat we altijd kunnen achterhalen waar het einde van de string alleen door 249 00:15:26,710 --> 00:15:30,150 itereren over het, misschien, met een voor lus of een tijdje lus of iets dergelijks 250 00:15:30,150 --> 00:15:34,990 dat, gewoon op zoek naar "backslash 0", de speciale sentinel karakter. 251 00:15:34,990 --> 00:15:37,220 >> En dan weten we dat de string gebeurt te zijn van de lengte - 252 00:15:37,220 --> 00:15:37,980 in dit geval - 253 00:15:37,980 --> 00:15:38,670 vijf. 254 00:15:38,670 --> 00:15:43,800 Dus technisch gezien wat GetString doet is het terugkeert Ox123 in dit geval. 255 00:15:43,800 --> 00:15:53,670 En technisch gezien wat er dan gebeurt is dat we slaan, de binnenkant van s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Aan het eind van de dag, ook al wordt nieuw concept, pointers, zijn ze 257 00:15:56,460 --> 00:15:57,350 gewoon variabelen. 258 00:15:57,350 --> 00:16:00,440 Maar ze toevallig stukjes slaan dat vertegenwoordigen samen een adres. 259 00:16:00,440 --> 00:16:03,700 Dus technisch gezien alles wat ze krijgt opgeslagen in s is Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Maar wij als mensen - 261 00:16:04,680 --> 00:16:06,020 waaronder vandaag verder - 262 00:16:06,020 --> 00:16:09,290 zijn echt niet van plan om de zorg, meestal, wat de werkelijke adres is 263 00:16:09,290 --> 00:16:10,520 van sommige brok van geheugen. 264 00:16:10,520 --> 00:16:14,040 Het is gewoon te lage niveau van detail te intellectueel interessant. 265 00:16:14,040 --> 00:16:15,440 Dus ik ga dit ongedaan te maken. 266 00:16:15,440 --> 00:16:19,810 En in plaats daarvan, meer hoog niveau, gewoon zeggen dat wanneer we praten over pointers 267 00:16:19,810 --> 00:16:22,170 Ik ga gewoon trekken meer gebruiksvriendelijke pijl dat brengt de 268 00:16:22,170 --> 00:16:26,060 hetzelfde idee en abstracts weg de bijzonderheden van wat de werkelijke 269 00:16:26,060 --> 00:16:27,700 onderliggende adres is. 270 00:16:27,700 --> 00:16:33,290 >> Nu als we terug gaan naar de code, wat gebeurde vorige week als we touwtje t 271 00:16:33,290 --> 00:16:34,510 gelijk getString? 272 00:16:34,510 --> 00:16:38,630 Nou, als ik weer, typt hello dit keer ga ik krijgen 273 00:16:38,630 --> 00:16:40,460 een ander stuk van het geheugen. 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 >> Maar omdat ik geroepen getString een tweede keer - 276 00:16:48,320 --> 00:16:51,100 en ik weet dit uit te kijken naar de broncode voor GetString - zelfs 277 00:16:51,100 --> 00:16:54,350 al is het toevallig dat hello was getypt in twee keer, GetString is niet 278 00:16:54,350 --> 00:16:55,890 gaan proberen te optimaliseren en slim zijn. 279 00:16:55,890 --> 00:16:58,550 Het gaat gewoon om een ​​ander stuk van krijgen het geheugen van de computer, dat is 280 00:16:58,550 --> 00:16:59,640 gaat worden op een ander adres. 281 00:16:59,640 --> 00:17:02,330 Laten we willekeurig maar zeggen 456. 282 00:17:02,330 --> 00:17:04,079 >> En wat gaat dat terug? 283 00:17:04,079 --> 00:17:08,030 Het gaat om 456 keren en opslaan in t. 284 00:17:08,030 --> 00:17:12,010 Dus wat er werkelijk aan de hand, op de linkerkant is ik heb een andere brok 285 00:17:12,010 --> 00:17:14,260 geheugen, typisch 32 bits. 286 00:17:14,260 --> 00:17:16,720 En daar zal gaan Ox456. 287 00:17:16,720 --> 00:17:20,140 Maar nogmaals, ik ben niet geïnteresseerd in deze bepaalde nummers niet meer. 288 00:17:20,140 --> 00:17:23,069 Ik ga gewoon om abstract tekenen het als een pijl. 289 00:17:23,069 --> 00:17:25,202 >> Dus dit is nu een nieuwe verklaring. 290 00:17:25,202 --> 00:17:28,735 Maar het is precies dezelfde gedachte dat is is gebeurd al die tijd. 291 00:17:28,735 --> 00:17:33,150 En dus de reden dan, dat deze eerste versie van vergelijken was buggy 292 00:17:33,150 --> 00:17:34,480 Vorige week is de reden waarom? 293 00:17:34,480 --> 00:17:38,000 Wanneer je doen als s gelijk gelijk t wat bent u werkelijk 294 00:17:38,000 --> 00:17:40,550 onder de motorkap te vergelijken? 295 00:17:40,550 --> 00:17:41,910 >> Je vergelijkt de adressen. 296 00:17:41,910 --> 00:17:47,950 En gewoon intuïtief, duidelijk, Ox123 is niet van plan om gelijke Ox456. 297 00:17:47,950 --> 00:17:49,380 Die nummers, die bits zijn gewoon anders. 298 00:17:49,380 --> 00:17:53,220 >> En zo consequent, vorige week zei het u verschillende dingen typt, zelfs indien de 299 00:17:53,220 --> 00:17:55,360 woorden waren letterlijk hetzelfde. 300 00:17:55,360 --> 00:17:58,770 Dus repareren we dit. 301 00:17:58,770 --> 00:18:00,120 In termen van de leek, wat was de oplossing? 302 00:18:00,120 --> 00:18:02,110 >> PUBLIEK: Gebruik een functie. 303 00:18:02,110 --> 00:18:02,870 >> LUIDSPREKER 1: Gebruik een functie. 304 00:18:02,870 --> 00:18:05,190 Of sterren zijn zeker betrokken, maar gebruik een functie om te doen wat? 305 00:18:05,190 --> 00:18:05,962 >> PUBLIEK: Om de snaren te vergelijken. 306 00:18:05,962 --> 00:18:07,390 >> LUIDSPREKER 1: Om de snaren te vergelijken. 307 00:18:07,390 --> 00:18:11,030 Zodat het fundamentele probleem hier was dat ik overwoog de 308 00:18:11,030 --> 00:18:15,870 kwaliteit van de snaren moet worden vastgesteld door vergelijking van hun adressen. 309 00:18:15,870 --> 00:18:18,540 En natuurlijk dat is gewoon dom nu eenmaal je begrijpt wat er gaande 310 00:18:18,540 --> 00:18:19,510 onder de motorkap. 311 00:18:19,510 --> 00:18:23,270 Om echt te vergelijken tekenreeksen om te zien of zij zijn gelijk in de manier waarop een mens 312 00:18:23,270 --> 00:18:26,680 zou overwegen twee snaren te gelijk zijn we nodig hebben om ze te vergelijken karakter voor 313 00:18:26,680 --> 00:18:28,070 karakter voor karakter. 314 00:18:28,070 --> 00:18:30,020 >> Nu kon ik heb gedaan deze zeer moeizaam. 315 00:18:30,020 --> 00:18:32,240 Maar vertrouwelijk, we zijn met behulp van een lus. 316 00:18:32,240 --> 00:18:36,050 En net vergelijken s beugel i tegen t beugel i. 317 00:18:36,050 --> 00:18:39,590 s beugel i plus 1 tegen t bracket i plus 1, enzovoort, binnen 318 00:18:39,590 --> 00:18:40,580 een soort lus. 319 00:18:40,580 --> 00:18:44,950 En als ik ter plaatse een twee personages die verschillen, of als ik besef dat ooh, s is 320 00:18:44,950 --> 00:18:48,410 t korter dan of langer dan t Ik kan meteen valse zeggen, 321 00:18:48,410 --> 00:18:49,390 ze zijn niet hetzelfde. 322 00:18:49,390 --> 00:18:55,370 >> Maar als ik via de s en t en zeggen: hetzelfde, hetzelfde, hetzelfde, hetzelfde, hetzelfde, eind 323 00:18:55,370 --> 00:18:58,520 beide strings, kan ik zeggen waar zij gelijk. 324 00:18:58,520 --> 00:19:01,040 Nou ja, gelukkig, jaren geleden iemand schreef dat de code voor ons. 325 00:19:01,040 --> 00:19:03,790 >> En ze noemden het StrComp voor strijkers vergelijken. 326 00:19:03,790 --> 00:19:11,900 En ook al is het een beetje teller intuïtief, StrComp retourneert 0 als deze 327 00:19:11,900 --> 00:19:14,520 twee strings, s en t dezelfde zijn. 328 00:19:14,520 --> 00:19:18,090 Maar het negatieve waarde geretourneerd als s moet komen voordat t alfabetisch of 329 00:19:18,090 --> 00:19:20,610 positieve waarde als het moet komen na t alfabetisch. 330 00:19:20,610 --> 00:19:24,030 >> Dus als je ooit iets wilt sorteren, het blijkt dat StrComp nuttig is. 331 00:19:24,030 --> 00:19:26,660 Omdat het niet alleen zeggen ja of nee, gelijk of niet. 332 00:19:26,660 --> 00:19:30,440 Het geeft je een gevoel van bestellen zoals een woordenboek macht. 333 00:19:30,440 --> 00:19:33,770 Dus StrComp, s komma t gelijk gelijk aan 0 betekent dat de 334 00:19:33,770 --> 00:19:35,200 strings zijn echt gelijk. 335 00:19:35,200 --> 00:19:38,680 Want wie deze functie schreef jaar geleden vermoedelijk gebruikt een lus 336 00:19:38,680 --> 00:19:42,840 of een while loop of iets dergelijks om opnieuw over de personages te integreren 337 00:19:42,840 --> 00:19:45,270 en weer. 338 00:19:45,270 --> 00:19:47,300 >> Maar probleem twee ontstond hier. 339 00:19:47,300 --> 00:19:48,750 Dit was copy0.c. 340 00:19:48,750 --> 00:19:51,680 En de twee in het rood is omdat het gebrekkig. 341 00:19:51,680 --> 00:19:52,800 En wat hebben we hier doen? 342 00:19:52,800 --> 00:19:54,310 Nou, eerst belde ik getString. 343 00:19:54,310 --> 00:19:56,255 En ik opgeslagen de return waarde in s. 344 00:19:56,255 --> 00:20:00,260 Dus dat is vrij veel het zelfde als Dit bovenste deel van het beeld. 345 00:20:00,260 --> 00:20:01,490 >> Maar wat komt daarna? 346 00:20:01,490 --> 00:20:04,980 Nou, laat me gaan en te ontdoen van een hele hoop van. 347 00:20:04,980 --> 00:20:09,650 We gaan in de tijd naar de plaats waar we gewoon terugspoelen s hebben, die nu is met 348 00:20:09,650 --> 00:20:10,940 lijn een daarboven. 349 00:20:10,940 --> 00:20:11,400 >> Ik check. 350 00:20:11,400 --> 00:20:13,450 Als s gelijk is gelijk aan 0. 351 00:20:13,450 --> 00:20:18,670 Nu, een snelle kanttekening, wanneer zou GetString terug 0? 352 00:20:18,670 --> 00:20:19,580 Er is niet genoeg geheugen. 353 00:20:19,580 --> 00:20:19,880 Rechts? 354 00:20:19,880 --> 00:20:22,310 >> Het is zeldzaam dat dit gaat gebeuren, zeker op een computer die is 355 00:20:22,310 --> 00:20:24,740 kreeg honderden meg of zelfs optredens van RAM-geheugen. 356 00:20:24,740 --> 00:20:27,080 Maar het kan, in theorie, terug 0, vooral als de 357 00:20:27,080 --> 00:20:28,080 gebruiker niet meewerken. 358 00:20:28,080 --> 00:20:31,640 Er is manieren te doen alsof je niet ingevoerde alles en trick 359 00:20:31,640 --> 00:20:34,100 GetString in terugkeer 0 effectief. 360 00:20:34,100 --> 00:20:35,470 >> Dus het gaat om te controleren dat. 361 00:20:35,470 --> 00:20:39,430 Want als iemand van jullie zijn begonnen krijgen, al, segmentatie fouten - 362 00:20:39,430 --> 00:20:42,280 die waarschijnlijk is een bron van wat frustratie - 363 00:20:42,280 --> 00:20:46,150 dat zijn bijna altijd het gevolg van geheugenfout. 364 00:20:46,150 --> 00:20:50,440 Een of andere manier je messed up met betrekking tot een wijzer, zelfs als je niet beseffen 365 00:20:50,440 --> 00:20:51,530 Er was een pointer. 366 00:20:51,530 --> 00:20:55,260 Dus zou je segmentatie hebben veroorzaakt fouten zo vroeg week een met behulp van 367 00:20:55,260 --> 00:21:02,100 iets als een lus of een tijdje lus en een array door te ver te gaan 368 00:21:02,100 --> 00:21:05,900 voorbij de grenzen van enkele array die u verklaard, in week twee in 369 00:21:05,900 --> 00:21:06,690 bijzonder. 370 00:21:06,690 --> 00:21:09,220 >> Je zou kunnen hebben het gedaan, zelfs in problemen set vier met Breakout. 371 00:21:09,220 --> 00:21:12,910 Ook al heb je waarschijnlijk niet hebt gezien alle sterren in de verdeelsleutel voor 372 00:21:12,910 --> 00:21:17,410 Breakout, het blijkt dat die GRect en Goval en andere dergelijke dingen, 373 00:21:17,410 --> 00:21:19,650 dat zijn eigenlijk pointers onder de motorkap. 374 00:21:19,650 --> 00:21:23,430 >> Maar Stanford, net als wij, soort van huiden dat detail in ieder geval voor de bibliotheken 375 00:21:23,430 --> 00:21:26,540 doeleinden, net zoals wij doen voor string en char *. 376 00:21:26,540 --> 00:21:30,060 Maar GRect en Goval en al die dingen jullie zijn of zullen worden met behulp van 377 00:21:30,060 --> 00:21:32,630 Deze week zijn uiteindelijk geheugenadressen. 378 00:21:32,630 --> 00:21:33,650 Je gewoon niet weten. 379 00:21:33,650 --> 00:21:37,240 >> Dus het is niet verwonderlijk dan, misschien, dat je zou struikelen sommige 380 00:21:37,240 --> 00:21:38,580 segmentatie fouten. 381 00:21:38,580 --> 00:21:41,290 Maar wat interessant is hier nu, Als na het controleren we voor 0 wij doen 382 00:21:41,290 --> 00:21:43,460 koord t krijgt s. 383 00:21:43,460 --> 00:21:44,690 Nou, laat me verklaren t. 384 00:21:44,690 --> 00:21:47,730 Ik ga om het te tekenen als een vierkant, 32 bits, noem het t. 385 00:21:47,730 --> 00:21:49,740 En dan ga ik doen krijgt s. 386 00:21:49,740 --> 00:21:51,130 >> Nou, wat betekent dat? 387 00:21:51,130 --> 00:21:53,280 Nou, het is een beetje moeilijk te denken over het beeld te verstandig. 388 00:21:53,280 --> 00:21:55,025 Maar laten we nadenken over wat er in x? 389 00:21:55,025 --> 00:21:59,430 Wat is letterlijk binnen deze variabele? 390 00:21:59,430 --> 00:22:01,500 De waarde Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Dus als ik zeg koord t krijgt s, die net betekent letterlijk neemt het aantal 392 00:22:05,815 --> 00:22:10,070 in s, dat is Ox123 en zet het Ox123. 393 00:22:10,070 --> 00:22:13,740 Of picturaal, als ik soort van abstracte weg van dat detail heeft de 394 00:22:13,740 --> 00:22:16,600 effect van letterlijk doen dit ook. 395 00:22:16,600 --> 00:22:22,110 >> Dus nu, denk terug aan vorige week, toen we overgegaan tot kapitalistische T. I 396 00:22:22,110 --> 00:22:23,800 deed T beugel 0. 397 00:22:23,800 --> 00:22:27,150 Nou, T beugel 0, ook al is het een pointer, kunt u het alsof behandelen 398 00:22:27,150 --> 00:22:29,220 het is een array met een vierkant haakjesnotering. 399 00:22:29,220 --> 00:22:31,550 >> Dus waar is T beugel 0? 400 00:22:31,550 --> 00:22:32,990 Nou, het is de h. 401 00:22:32,990 --> 00:22:36,800 En dus als we die lijn van code, twee bovenste, die in dat c type.h 402 00:22:36,800 --> 00:22:38,460 header-bestand, dat is waar het wordt verklaard. 403 00:22:38,460 --> 00:22:44,410 Je bent kapitaliseren dit H. Maar van Natuurlijk, dat is precies dezelfde h dat is 404 00:22:44,410 --> 00:22:46,540 binnenkant van s, om zo te zeggen. 405 00:22:46,540 --> 00:22:51,930 En dus nu zijn gewijzigd of gekapitaliseerd zowel het origineel als de 406 00:22:51,930 --> 00:22:53,120 zogenaamde copy. 407 00:22:53,120 --> 00:22:56,620 Omdat u een kopie in de niet te maken manier waarop een mens zou willen dat het is. 408 00:22:56,620 --> 00:22:59,710 >> Dus wat is hier de oplossing, in copy1.c vorige week? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Functies, dus konden we eigenlijk kopieert de string. 411 00:23:05,580 --> 00:23:08,700 En fundamenteel, wat hebben we nodig om doen om de string te kopiëren? 412 00:23:08,700 --> 00:23:12,070 >> Nou, in deze groene versie hier ben ik gaat het vrij lage niveau te doen. 413 00:23:12,070 --> 00:23:14,260 Er zijn eigenlijk functies ze kunnen helpen met dit. 414 00:23:14,260 --> 00:23:17,710 Maar de meest elementaire ene, en de meest vertrouwde een, op zijn minst, zal binnenkort 415 00:23:17,710 --> 00:23:19,600 vertrouwd voor ons, is het volgende - 416 00:23:19,600 --> 00:23:21,910 zodat men op de eerste regel van de code in het groen bedrijf. 417 00:23:21,910 --> 00:23:23,970 >> Ik herschreef s als char *. 418 00:23:23,970 --> 00:23:25,250 Er is geen functionele verschil is er. 419 00:23:25,250 --> 00:23:28,790 Ik gooide de CS50 bibliotheek weg en Ik noem het wat het is, een char *. 420 00:23:28,790 --> 00:23:31,640 >> Nu puntje, puntje, puntje, want er waren sommige foutcontrole dat is niet 421 00:23:31,640 --> 00:23:33,200 interessant om over praten weer. 422 00:23:33,200 --> 00:23:34,710 Dus nu t wordt verklaard. 423 00:23:34,710 --> 00:23:35,780 Het is ook een char *. 424 00:23:35,780 --> 00:23:38,280 Dus ik tekende een pleintje op het scherm als voorheen. 425 00:23:38,280 --> 00:23:41,870 >> Maar aan de rechterzijde, malloc, we zeiden is geheugen toe te wijzen. 426 00:23:41,870 --> 00:23:44,130 Zo wijzen sommige brok van geheugen. 427 00:23:44,130 --> 00:23:48,830 En hoeveel bytes eigenlijk doen wij wilt toewijzen, het lijkt? 428 00:23:48,830 --> 00:23:50,340 >> Nou, de string lengte van s. 429 00:23:50,340 --> 00:23:52,310 Dus als het hallo dat is gaat worden vijf. 430 00:23:52,310 --> 00:23:53,950 We zeggen h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Dus vijf bytes. 432 00:23:55,090 --> 00:23:57,960 >> Maar dan plus 1, waarom 1? 433 00:23:57,960 --> 00:23:58,830 De 0 karakter. 434 00:23:58,830 --> 00:24:03,640 Als we geen ruimte voor deze man die we misschien per ongeluk een situatie te creëren 435 00:24:03,640 --> 00:24:05,600 waarbij de string h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 En dan de volgende keer GetString is riep en ik typ in, bijvoorbeeld, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, de computer gaat om te denken dat s is eigenlijk 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d omdat er geen pauze in tussen die woorden. 439 00:24:18,900 --> 00:24:19,810 >> Dus we moeten die pauze. 440 00:24:19,810 --> 00:24:20,720 Dus we willen niet vijf. 441 00:24:20,720 --> 00:24:22,100 We willen zes bytes. 442 00:24:22,100 --> 00:24:23,110 >> En bytes ik zeg. 443 00:24:23,110 --> 00:24:25,220 Maar het is echt tijd grootte van char. 444 00:24:25,220 --> 00:24:28,040 Technisch char is bijna altijd een byte. 445 00:24:28,040 --> 00:24:31,030 >> Maar alleen om onze code draagbaar te maken, zo te zeggen, zodat het werkt op 446 00:24:31,030 --> 00:24:33,750 verschillende computers, zelfs als ze zouden kunnen enigszins anders onder de 447 00:24:33,750 --> 00:24:36,590 hood, ik ga generiek Zeg grootte van char zodat 448 00:24:36,590 --> 00:24:37,660 mijn code altijd werken. 449 00:24:37,660 --> 00:24:40,610 En ik heb niet om het te compileren gewoon omdat ik mijn computer te upgraden of gebruik 450 00:24:40,610 --> 00:24:42,140 sommige ander platform. 451 00:24:42,140 --> 00:24:45,300 >> Dus ik heb 6 keer de grootte van een char, die toevallig 1. 452 00:24:45,300 --> 00:24:47,440 Dus dat betekent malloc kon geef me zes bytes. 453 00:24:47,440 --> 00:24:49,140 Wat is dat eigenlijk doen? 454 00:24:49,140 --> 00:24:52,810 Nou, laat me roll terug in de tijd hier tot waar we zijn in het verhaal. 455 00:24:52,810 --> 00:24:57,620 >> Dus als ik ga hier terug, heb ik verklaard een char * genaamd t. 456 00:24:57,620 --> 00:25:00,280 Ik heb nu genoemd malloc voor zes bytes. 457 00:25:00,280 --> 00:25:06,400 En nu ga ik die zes trekken bytes net als de array eerder. 458 00:25:06,400 --> 00:25:10,570 Maar ik eigenlijk niet weet wat er binnen deze array. 459 00:25:10,570 --> 00:25:14,640 >> Als u geheugen toe te wijzen blijkt dat je kunt niet vertrouwen dat er een aantal 460 00:25:14,640 --> 00:25:15,810 bekende waarde daar. 461 00:25:15,810 --> 00:25:18,400 Het zou kunnen zijn gebruikt door iets anders, een andere functie, een andere 462 00:25:18,400 --> 00:25:19,630 regel code die je schrijft. 463 00:25:19,630 --> 00:25:22,870 Dus we meestal noemen deze garbage waarden en teken ze, misschien, zoals 464 00:25:22,870 --> 00:25:26,170 vraagtekens, net wat aangeeft dat we weet niet wat er eigenlijk. 465 00:25:26,170 --> 00:25:30,390 En dat is geen groot probleem, zolang we zijn slim genoeg om die te overschrijven 466 00:25:30,390 --> 00:25:34,550 garbage waarden met cijfers of chars dat we de zorg over. 467 00:25:34,550 --> 00:25:36,340 >> Dus in dit geval wat ga ik doen? 468 00:25:36,340 --> 00:25:38,670 Nou, mijn lijn van code volgende, ik heb vier. 469 00:25:38,670 --> 00:25:41,350 int krijg ik 0, n krijgt de snaarlengte van s. 470 00:25:41,350 --> 00:25:42,750 Dus een vertrouwde lus. 471 00:25:42,750 --> 00:25:45,875 I kleiner is dan of gelijk aan n, die meestal boven. 472 00:25:45,875 --> 00:25:47,500 >> Maar deze keer is het bewuste. 473 00:25:47,500 --> 00:25:51,890 I + +, en dan moet ik gewoon doen t beugel i krijgt s. 474 00:25:51,890 --> 00:25:56,320 Omdat mijn foto ziet er als volgt bij dit ogenblik, opgeslagen in t is de 475 00:25:56,320 --> 00:25:59,530 adres van die willekeurig stuk van het geheugen waarvan de waarden zijn onbekend. 476 00:25:59,530 --> 00:26:03,030 Maar zodra ik doe t bracket 0 dat ik hier zet. 477 00:26:03,030 --> 00:26:07,430 >> En wat uiteindelijk er steeds opgesteld? 478 00:26:07,430 --> 00:26:08,740 We uiteindelijk zetten h. 479 00:26:08,740 --> 00:26:11,170 Want dat is wat er op het s beugel 0. 480 00:26:11,170 --> 00:26:14,300 En dan hetzelfde voor e, en l, en l, en o. 481 00:26:14,300 --> 00:26:17,930 >> n, waarom heb ik optrekken door een gelijk aan n? 482 00:26:17,930 --> 00:26:19,200 Door de 0 karakter. 483 00:26:19,200 --> 00:26:23,580 Dus gewoon om duidelijk te zijn, dan, als ik eigenlijk wist u alles wat deze garbage 484 00:26:23,580 --> 00:26:28,870 waarden zijn en vervolgens daadwerkelijk te tekenen in verwacht ik, is s beugel 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, plus dat is trailing nieuw karakter. 486 00:26:32,440 --> 00:26:36,080 >> En dus nu als we verder langs de stip, dot, dot in deze juiste versie 487 00:26:36,080 --> 00:26:41,930 en gekapitaliseerde t beugel 0 zou ik, van Uiteraard worden kapitaliseren alleen deze 488 00:26:41,930 --> 00:26:47,050 man hier, die conceptueel, was uiteindelijk het doel. 489 00:26:47,050 --> 00:26:48,040 Dus dat is al de wijzer is. 490 00:26:48,040 --> 00:26:51,430 >> En je hebt ze te gebruiken voor weken nu in de context van de snaren. 491 00:26:51,430 --> 00:26:53,530 Maar onder de motorkap zijn ze een beetje ingewikkelder. 492 00:26:53,530 --> 00:26:57,520 Maar als je denkt over hen in deze picturale vorm Ik stel voor dat ze 493 00:26:57,520 --> 00:27:01,720 waarschijnlijk niet zo eng als ze misschien eerst lijken op het eerste gezicht, 494 00:27:01,720 --> 00:27:04,730 met name dergelijke nieuwe syntax. 495 00:27:04,730 --> 00:27:07,290 Heeft u vragen over pointers, strings of chars? 496 00:27:07,290 --> 00:27:07,580 Yeah? 497 00:27:07,580 --> 00:27:09,252 >> PUBLIEK: Kunt u terug te gaan aan de [onverstaanbaar]? 498 00:27:09,252 --> 00:27:10,502 >> LUIDSPREKER 1: Tuurlijk. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> PUBLIEK: Hoe komt het in je allerlaatste lijn, heb je niet een * t lijn 501 00:27:19,525 --> 00:27:21,513 en a * s in de lijn? 502 00:27:21,513 --> 00:27:23,004 Heb je niet de verwijzing naar de - 503 00:27:23,004 --> 00:27:24,640 >> LUIDSPREKER 1: Ah, een heel goede vraag. 504 00:27:24,640 --> 00:27:26,800 Waarom heb ik geen * t en a * s? 505 00:27:26,800 --> 00:27:30,340 Omdat kort, vorige week, net als in onze swap functie, heb ik gezegd dat als 506 00:27:30,340 --> 00:27:33,350 je hebt een pointer de middelen gekregen die je er zoals wij deden 507 00:27:33,350 --> 00:27:36,590 fysiek op het podium, zou eigenlijk Gebruik de ster operator. 508 00:27:36,590 --> 00:27:40,570 >> Het blijkt dat dit plein-bracket notatie is wat we syntactische zullen noemen 509 00:27:40,570 --> 00:27:44,190 suiker, dat is gewoon een sexy manier van zeggen dat het verkorte schrijfwijze voor 510 00:27:44,190 --> 00:27:45,950 precies wat je beschrijft. 511 00:27:45,950 --> 00:27:49,385 Maar het is een beetje meer intuïtief. 512 00:27:49,385 --> 00:27:53,510 En op het gevaar af van het maken van dit meer lijken ingewikkelder dan het moet zijn, 513 00:27:53,510 --> 00:27:56,990 wat er werkelijk aan de hand hier is de volgende - 514 00:27:56,990 --> 00:28:01,450 Als ik zeg * t dat betekent ga naar het adres opgeslagen in t. 515 00:28:01,450 --> 00:28:04,350 >> Dus letterlijk, als t wordt het opslaan het adres van die h 516 00:28:04,350 --> 00:28:07,300 aanvankelijk, * t middel gaan hier. 517 00:28:07,300 --> 00:28:10,730 Nu, wat doet t beugel 0 betekenen? 518 00:28:10,730 --> 00:28:11,560 Precies dezelfde dingen. 519 00:28:11,560 --> 00:28:13,510 Het is gewoon een beetje meer gebruikersvriendelijk vriendelijk te schrijven. 520 00:28:13,510 --> 00:28:14,430 >> Maar ik ben nog niet klaar. 521 00:28:14,430 --> 00:28:17,800 Ik kan niet zomaar zeggen * t krijgt * s. 522 00:28:17,800 --> 00:28:19,440 Want wat zou ik dan moeten doen? 523 00:28:19,440 --> 00:28:22,950 Ik zou zetten h, h, h, h, h gedurende de hele zaak. 524 00:28:22,950 --> 00:28:22,995 Rechts? 525 00:28:22,995 --> 00:28:26,020 >> Omdat * t is naar het adres in t. 526 00:28:26,020 --> 00:28:27,580 Maar we zijn binnen van een lus. 527 00:28:27,580 --> 00:28:32,150 En welke waarde moet ik verhogen, natuurlijk op elke iteratie? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Maar er is een kans hier, toch? 530 00:28:34,590 --> 00:28:37,870 Hoewel dit voelt alsof het wordt steeds wat verfijndere 531 00:28:37,870 --> 00:28:40,730 dan de vierkante-haakjesnotering we hebben gebruikt voor enige tijd - 532 00:28:40,730 --> 00:28:43,840 laat me ongedaan mijn h verandering daar - 533 00:28:43,840 --> 00:28:48,870 ook al is dit nu een beetje krijgen liefhebber, het basisidee, indien * t 534 00:28:48,870 --> 00:28:53,630 betekent hier en * t is gewoon ga naar het adres in t. 535 00:28:53,630 --> 00:28:54,990 >> Maar wat was het adres in t? 536 00:28:54,990 --> 00:28:56,850 Het nummer dat we blijven gebruiken? 537 00:28:56,850 --> 00:29:00,540 Zoals Ox456, laten we brengen die terug alleen omwille van de discussie. 538 00:29:00,540 --> 00:29:05,380 Nou, als ik wil krijgen op de e in t touwtje, ik wil gewoon om te gaan, 539 00:29:05,380 --> 00:29:06,460 wezen, 456. 540 00:29:06,460 --> 00:29:09,230 >> Of liever gezegd, 457. 541 00:29:09,230 --> 00:29:10,590 Ik moet alleen een toe te voegen. 542 00:29:10,590 --> 00:29:11,790 Maar ik kan dat doen, toch? 543 00:29:11,790 --> 00:29:14,680 Omdat t, hoewel ik houd tekening Nu als een pijl, het is gewoon een 544 00:29:14,680 --> 00:29:16,570 nummer, Ox456. 545 00:29:16,570 --> 00:29:21,400 En als ik er een aan toevoegen, of meer over het algemeen, als ik voeg ik aan dat ik kan 546 00:29:21,400 --> 00:29:24,350 eigenlijk precies waar ik wil. 547 00:29:24,350 --> 00:29:26,260 Dus als ik dit eigenlijk doen - 548 00:29:26,260 --> 00:29:28,970 en dit is wat heet nu pointers - 549 00:29:28,970 --> 00:29:30,375 Ik kan deze lijn te verwijderen. 550 00:29:30,375 --> 00:29:33,550 Dat is, eerlijk gezegd, denk ik duidelijker en een beetje meer gebruikersvriendelijk te lezen. 551 00:29:33,550 --> 00:29:35,970 Maar dit is niet minder correct. 552 00:29:35,970 --> 00:29:38,570 >> Deze regel code nu is het gebruik van pointers. 553 00:29:38,570 --> 00:29:40,920 Het zegt naar de volgende adres - 554 00:29:40,920 --> 00:29:44,670 ongeacht de start van t, welke is t plus i, aanvankelijk 555 00:29:44,670 --> 00:29:45,730 is 0, wat geweldig is. 556 00:29:45,730 --> 00:29:49,280 Want dat betekent begin t plus 1, plus 2, plus 3, enzovoort. 557 00:29:49,280 --> 00:29:51,030 En dezelfde deal met s. 558 00:29:51,030 --> 00:29:52,750 >> Dus syntactische suiker voor. 559 00:29:52,750 --> 00:29:55,900 Maar begrijpen wat er werkelijk aan de hand onder de motorkap, zou ik pleiten, 560 00:29:55,900 --> 00:29:57,410 eigenlijk nuttig op zich. 561 00:29:57,410 --> 00:30:00,620 Want het betekent nu is er niet veel meer magie gaande 562 00:30:00,620 --> 00:30:01,620 onder de motorkap. 563 00:30:01,620 --> 00:30:03,920 Er zijn niet van plan om veel meer te zijn lagen die we kunnen schil terug voor u. 564 00:30:03,920 --> 00:30:04,810 Dit is c. 565 00:30:04,810 --> 00:30:06,410 En dit is het programmeren. 566 00:30:06,410 --> 00:30:08,002 Echt goede vraag. 567 00:30:08,002 --> 00:30:11,570 >> Oke, dus dit was dat buggy programma dat ik verwees naar eerder. 568 00:30:11,570 --> 00:30:12,650 swap was gebrekkig. 569 00:30:12,650 --> 00:30:14,070 Als leek te werken. 570 00:30:14,070 --> 00:30:17,390 Bedenk dat net als met de melk en het sinaasappelsap - waar ik begon 571 00:30:17,390 --> 00:30:18,660 het drinken van de demonstratie van vandaag. 572 00:30:18,660 --> 00:30:22,220 Dus net zoals met het sinaasappelsap en de de melk, hadden we een te gebruiken 573 00:30:22,220 --> 00:30:26,200 tijdelijke variabele, tmp, om een ​​te houden tijdelijk zodat we konden vervolgens 574 00:30:26,200 --> 00:30:28,820 zijn waarde veranderen en dan updaten b. 575 00:30:28,820 --> 00:30:32,870 >> Maar deze functie, zeiden we, of dit programma waarin deze functie was 576 00:30:32,870 --> 00:30:35,670 geschreven was verkeerd en gebrekkig, waarom? 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 >> PUBLIEK: [onverstaanbaar]. 580 00:30:42,471 --> 00:30:44,940 >> LUIDSPREKER 1: Precies, wanneer je swap noemen - 581 00:30:44,940 --> 00:30:47,820 of meer in het algemeen, als je bel vrijwel elke functie - 582 00:30:47,820 --> 00:30:51,210 Als de argumenten om die functie zijn primitief, zo te zeggen, ints en chars 583 00:30:51,210 --> 00:30:56,740 en tweepersoonskamers en praalwagens, dingen zonder sterren, bent u passeren in een kopie van 584 00:30:56,740 --> 00:30:57,540 het argument. 585 00:30:57,540 --> 00:31:01,580 Als x 1 is en y is 2, een gaat zijn 1 en b zal worden 2. 586 00:31:01,580 --> 00:31:05,250 Maar ze gaan anders brokken bits, verschillende stukjes 587 00:31:05,250 --> 00:31:07,540 geheugen dat toevallig opslaan identieke waarden. 588 00:31:07,540 --> 00:31:12,160 >> Deze code is zo super perfect bij swapping a en b. 589 00:31:12,160 --> 00:31:13,850 Het is niet goed in te ruilen - 590 00:31:13,850 --> 00:31:15,290 in de afgelopen week bijvoorbeeld - 591 00:31:15,290 --> 00:31:16,390 x en y. 592 00:31:16,390 --> 00:31:18,780 Want nogmaals, ze zijn in de verkeerde scope. 593 00:31:18,780 --> 00:31:21,310 >> Nu, hoe zijn we gaan over de vaststelling van dit? 594 00:31:21,310 --> 00:31:23,140 We moesten om de functie te maken er een beetje lelijker. 595 00:31:23,140 --> 00:31:25,250 Maar nogmaals, overwegen wat Dit betekent gewoon. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> En eigenlijk, laat me, voor consistentie, veranderen een ding, dus het is identiek aan 598 00:31:31,500 --> 00:31:33,200 wat we net deden. 599 00:31:33,200 --> 00:31:35,690 Zoals ik al zei vorige week, is het niet uit waar het gaat. 600 00:31:35,690 --> 00:31:38,120 In feite, meestal zou je zet de ster naast de naam van de variabele. 601 00:31:38,120 --> 00:31:40,750 Maar ik denk dat het een beetje makkelijker de * overwegen naast de 602 00:31:40,750 --> 00:31:44,910 datatype die zin is het een pointer een int in dit geval. 603 00:31:44,910 --> 00:31:46,270 >> Dus wat doe ik hier? 604 00:31:46,270 --> 00:31:49,590 Ik zeg niet geef me een int gevolgd door een andere int 605 00:31:49,590 --> 00:31:50,810 ze a en b belt. 606 00:31:50,810 --> 00:31:52,460 Geef mij het adres van een int. 607 00:31:52,460 --> 00:31:53,960 Geef mij het adres van een andere int. 608 00:31:53,960 --> 00:31:56,330 Noemen deze adressen a en b. 609 00:31:56,330 --> 00:32:00,860 >> En vervolgens met behulp van de * notatie neer hieronder, naar elk van deze adressen 610 00:32:00,860 --> 00:32:05,290 als nodig is om ofwel of stel de waarde ervan. 611 00:32:05,290 --> 00:32:07,400 Maar er is een uitzondering hier. 612 00:32:07,400 --> 00:32:11,130 Waarom heb ik geen een * naast tmp? 613 00:32:11,130 --> 00:32:15,070 Waarom heb ik dit niet doen, bijvoorbeeld? 614 00:32:15,070 --> 00:32:19,370 Het voelt alsof ik moet gewoon gaan alle uit en corrigeer de hele zaak. 615 00:32:19,370 --> 00:32:19,752 Yeah? 616 00:32:19,752 --> 00:32:21,002 >> PUBLIEK: [onverstaanbaar]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> LUIDSPREKER 1: Ik heb niet verklaard tmp als een string. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Dus dit zou verklaren, in dit geval, een tmp aan het adres van een int zijn. 621 00:32:34,950 --> 00:32:37,380 Maar dat is niet helemaal wat ik wil, voor een paar redenen. 622 00:32:37,380 --> 00:32:38,616 >> PUBLIEK: Je wilt niet om ze te verwisselen. 623 00:32:38,616 --> 00:32:41,800 >> LUIDSPREKER 1: Precies, ik wil niet ruilen iets met tmp. tmp is gewoon 624 00:32:41,800 --> 00:32:42,790 week-een dingen. 625 00:32:42,790 --> 00:32:45,150 Alles wat ik wil is een variabele om enkele nummer op te slaan. 626 00:32:45,150 --> 00:32:47,330 Ik weet niet eens schelen adressen op dit moment. 627 00:32:47,330 --> 00:32:50,530 >> Ik moet alleen 32-bits of dus een int slaan. 628 00:32:50,530 --> 00:32:56,690 En ik wil zetten in die 32 bits alles wat niet in een, zo te zeggen, maar 629 00:32:56,690 --> 00:33:01,260 wat er op een, alleen maar om precies te zijn. 630 00:33:01,260 --> 00:33:06,420 Want als er een is een adres, * een middel ga er en krijgt de waarde 1. 631 00:33:06,420 --> 00:33:10,560 Bijvoorbeeld, in Bijvoorbeeld laatste week of in het geval b's, krijgen de waarde van 2. 632 00:33:10,560 --> 00:33:11,750 >> Dus wat er werkelijk aan de hand? 633 00:33:11,750 --> 00:33:15,070 Laat me een foto hier dat zal trekken alleen plagen elkaar een deel van vandaag. 634 00:33:15,070 --> 00:33:18,580 Maar dit zal blijven verschijnen al geruime tijd. 635 00:33:18,580 --> 00:33:22,430 >> Dit, ik beweer, is wat uw computer geheugen eruit ziet als je loopt een 636 00:33:22,430 --> 00:33:24,060 programma, een programma. 637 00:33:24,060 --> 00:33:28,340 Wanneer u een programma uitvoert aan de top RAM-geheugen van uw computer - dus denk aan 638 00:33:28,340 --> 00:33:33,530 deze rechthoek, echt, als uw RAM-geheugen of het geheugen van de computer, alle 101 639 00:33:33,530 --> 00:33:36,920 miljard bytes van het, al twee miljard bytes, alle twee gigabyte ervan, 640 00:33:36,920 --> 00:33:39,910 ongeacht de hoeveelheid die je hebt is, laten we het tekenen als een rechthoek. 641 00:33:39,910 --> 00:33:43,260 En ik beweer dat wanneer u een programma uitvoert zoals Microsoft Word of Chrome 642 00:33:43,260 --> 00:33:49,220 of iets dergelijks, de bits die Microsoft of dat Google schreef - 643 00:33:49,220 --> 00:33:50,910 in het geval van deze programma's - 644 00:33:50,910 --> 00:33:54,490 worden geladen in het geheugen van uw computer waar ze meer kunnen worden uitgevoerd 645 00:33:54,490 --> 00:33:57,520 snel en toegevoerd aan de CPU, die is het brein van de computer. 646 00:33:57,520 --> 00:34:00,940 >> En in TAM ze helemaal aan het zijn opgeslagen top van uw programma, om zo te zeggen. 647 00:34:00,940 --> 00:34:03,300 Met andere woorden, als dit een brok geheugen, wanneer u dubbelklikt op 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, de bits komen van de harde schijf. 649 00:34:05,740 --> 00:34:06,680 Ze krijgen in het geheugen geladen. 650 00:34:06,680 --> 00:34:10,330 En we zullen ze schuiven op naar de top de rechthoek conceptueel. 651 00:34:10,330 --> 00:34:13,010 >> Nou ja, de rest van je geheugen is voor verschillende dingen. 652 00:34:13,010 --> 00:34:16,460 Helemaal bovenaan zie je initialiseren gegevens en uninitialize gegevens. 653 00:34:16,460 --> 00:34:20,500 Dit hangt voor het grootste gedeelte, met constanten of globale variabelen 654 00:34:20,500 --> 00:34:21,340 die waarden. 655 00:34:21,340 --> 00:34:22,980 Maar meer op die andere tijd. 656 00:34:22,980 --> 00:34:25,150 >> Dan heb je de hoop, die we zullen terug te komen. 657 00:34:25,150 --> 00:34:28,420 Maar onder het deel dat bijzonder relevant nu. 658 00:34:28,420 --> 00:34:30,210 Het is de zogenaamde stack. 659 00:34:30,210 --> 00:34:33,850 Dus net als in vrijwel elke D hal hier op campus, heb je van die bakjes die 660 00:34:33,850 --> 00:34:37,210 alleen worden boven elkaar waarop u kunt eten en wat al gezet. 661 00:34:37,210 --> 00:34:40,139 De stack in een computersysteem is zeer vergelijkbaar. 662 00:34:40,139 --> 00:34:42,679 Behalve dat de lade, zoals we gebruiken in de eetzaal, natuurlijk, is bedoeld 663 00:34:42,679 --> 00:34:45,710 om dingen te dragen van de trays of de frames - 664 00:34:45,710 --> 00:34:49,469 zoals we ze zullen noemen - in een computer geheugen voor bewaring 665 00:34:49,469 --> 00:34:51,610 variabelen en waarden. 666 00:34:51,610 --> 00:34:53,929 >> Dus wat er werkelijk gebeurt onder de motorkap? 667 00:34:53,929 --> 00:34:55,820 Nou, laat me omdraaien naar het scherm hier. 668 00:34:55,820 --> 00:34:58,370 En laten we focussen alleen op de onderste deel voor een moment. 669 00:34:58,370 --> 00:35:02,770 Als dit het bodemgedeelte van mijn het geheugen van de computer het blijkt als ik 670 00:35:02,770 --> 00:35:05,350 bellen met de functie main - dat gebeurt, eerlijk gezegd, 671 00:35:05,350 --> 00:35:06,950 automatisch voor mij - 672 00:35:06,950 --> 00:35:10,510 Ik krijg een brok van het geheugen op de onderkant van mijn RAM zo te zeggen. 673 00:35:10,510 --> 00:35:13,390 En dit is waar de belangrijkste is lokale variabelen gaan. 674 00:35:13,390 --> 00:35:16,770 Het is waar argc en argv misschien gaan, en alle variabelen I 675 00:35:16,770 --> 00:35:18,170 verklaren binnenkant van de belangrijkste. 676 00:35:18,170 --> 00:35:20,260 Ze belanden op de bodem RAM-geheugen van mijn computer. 677 00:35:20,260 --> 00:35:25,040 >> Stel nu dat de belangrijkste gesprekken een functie zoals swap, zoals het deed vorige week? 678 00:35:25,040 --> 00:35:30,620 Nou, we wezen zet een nieuwe tray, een nieuw frame, op mijn stuk van het geheugen. 679 00:35:30,620 --> 00:35:34,160 En ik ga dit zo te beschrijven die behoren tot de swap-functie. 680 00:35:34,160 --> 00:35:35,770 >> Nu wat er in ruil? 681 00:35:35,770 --> 00:35:39,240 Nou ja, op basis van het programma van vorige week en degene die we zagen slechts een fragment uit, 682 00:35:39,240 --> 00:35:46,590 binnenkant van het frame swap's, of op swap's lade, zijn wat variabelen? 683 00:35:46,590 --> 00:35:47,970 Nou, a en b. 684 00:35:47,970 --> 00:35:51,850 Want dat waren de lokale argumenten, plus een derde tmp. 685 00:35:51,850 --> 00:35:54,470 Dus echt, ik kon dit tekenen een beetje schoner. 686 00:35:54,470 --> 00:35:56,680 Laat me ga je gang en maak de label. 687 00:35:56,680 --> 00:35:58,520 En laat me zeggen dat je weet wat? 688 00:35:58,520 --> 00:36:00,560 >> een is waarschijnlijk zal hier eindigen. 689 00:36:00,560 --> 00:36:02,160 B gaat hier eindigen. 690 00:36:02,160 --> 00:36:03,810 En tmp gaat hier eindigen. 691 00:36:03,810 --> 00:36:05,160 Nu, de bestelling zou een beetje anders. 692 00:36:05,160 --> 00:36:06,840 Maar conceptueel dit is het idee. 693 00:36:06,840 --> 00:36:11,490 >> En gezamenlijk dit wat we zullen frame van swap noemen, of 694 00:36:11,490 --> 00:36:12,136 eetzaal lade. 695 00:36:12,136 --> 00:36:13,150 En dezelfde deal met de belangrijkste. 696 00:36:13,150 --> 00:36:14,040 Maar ik zal niet opnieuw te tekenen dat. 697 00:36:14,040 --> 00:36:17,810 Maar dat is waar argc en argv en eventuele van zijn lokale variabelen zoals x en y 698 00:36:17,810 --> 00:36:18,940 kan net zo goed zijn. 699 00:36:18,940 --> 00:36:22,170 >> Dus nu overwegen wat er echt gebeurt als je swap bellen. 700 00:36:22,170 --> 00:36:26,370 Als je swap noemen, het uitvoeren van code zoals dit, je bent passeren in, in de 701 00:36:26,370 --> 00:36:30,670 buggy versie, a en b als kopieën van x en y. 702 00:36:30,670 --> 00:36:34,300 Dus als ik nu deze tekenen op het scherm - 703 00:36:34,300 --> 00:36:36,700 kreeg om beter te worden in deze - 704 00:36:36,700 --> 00:36:40,850 dus het verhaal dat ik vertelde mezelf In deze versie buggy, als we 705 00:36:40,850 --> 00:36:46,130 bel swap passeren in letterlijk a en b als gehele getallen, is wat er echt gebeurt? 706 00:36:46,130 --> 00:36:48,250 >> Nou, wat er echt gebeurt is dit. 707 00:36:48,250 --> 00:36:52,850 Laat me ga je gang en ongedaan net op te helderen wat ruimte hier. 708 00:36:52,850 --> 00:36:54,720 Dus dit is het geheugen van mijn computer. 709 00:36:54,720 --> 00:36:57,510 >> Dus als ik bijvoorbeeld - 710 00:36:57,510 --> 00:36:58,910 eigenlijk laten we het op deze manier - 711 00:36:58,910 --> 00:37:02,690 als ik beweren dat dit is x, opslaan de waarde 1 net als vorige week. 712 00:37:02,690 --> 00:37:05,930 Dit is y, opslaan van de waarde 2 net als vorige week. 713 00:37:05,930 --> 00:37:11,370 En dit is de belangrijkste, als ik bel swap, mezelf waardoor het geven van toegang tot een en 714 00:37:11,370 --> 00:37:15,150 b en tmp, ga ik om te beweren dat Dit is een en is 1. 715 00:37:15,150 --> 00:37:16,080 >> Dit is b. 716 00:37:16,080 --> 00:37:17,010 Dit is 2. 717 00:37:17,010 --> 00:37:18,370 Dit heet tmp. 718 00:37:18,370 --> 00:37:23,360 >> En in eerste instantie, het heeft een aantal vuilnis waarde totdat ik daadwerkelijk op te slaan in het een, 719 00:37:23,360 --> 00:37:24,450 die 1. 720 00:37:24,450 --> 00:37:28,320 Dan ga ik door en verandert een te zijn wat? 721 00:37:28,320 --> 00:37:29,720 B's waarde. 722 00:37:29,720 --> 00:37:31,980 >> En dus nu heb ik twee hier. 723 00:37:31,980 --> 00:37:34,050 En toen we zeiden b krijgt tmp. 724 00:37:34,050 --> 00:37:37,670 Opnieuw, net als een sanity check, de derde regel code hier is eenvoudig dit 725 00:37:37,670 --> 00:37:39,440 men, b krijgt tmp. 726 00:37:39,440 --> 00:37:41,730 >> En dus tot slot, wat moet ik doen? 727 00:37:41,730 --> 00:37:46,800 Ik ga door en verandert b te zijn wat de waarde van tmp is, die 1. 728 00:37:46,800 --> 00:37:48,390 Ik heb tmp niet meer aanraken. 729 00:37:48,390 --> 00:37:54,100 >> Maar nu het probleem zodra swap rendement, omdat het niet uitdelen 730 00:37:54,100 --> 00:37:57,540 back enige waarde, is er geen terugkeer verklaring expliciet erin. 731 00:37:57,540 --> 00:37:59,080 Wat is er eigenlijk gebeurt? 732 00:37:59,080 --> 00:38:03,480 Nou ja, in wezen al dit geheugen - 733 00:38:03,480 --> 00:38:07,410 OK, blijkbaar de gum houdt een vinger tegelijkertijd - 734 00:38:07,410 --> 00:38:08,180 gewoon verdwijnt. 735 00:38:08,180 --> 00:38:10,070 >> Nu in werkelijkheid is het niet gaat nergens heen. 736 00:38:10,070 --> 00:38:11,810 Maar je kunt het zien nu als vraagtekens. 737 00:38:11,810 --> 00:38:14,040 Want het is niet meer daadwerkelijk gebruikt. 738 00:38:14,040 --> 00:38:17,470 En er wordt niets gedaan met die waarden. 739 00:38:17,470 --> 00:38:21,920 >> Dus in het geval van de groene versie deze code, wat plaats is het zijn 740 00:38:21,920 --> 00:38:24,640 overgegaan in ruil? 741 00:38:24,640 --> 00:38:25,770 Zo richt. 742 00:38:25,770 --> 00:38:28,520 Zodat het adres van x en het adres van y. 743 00:38:28,520 --> 00:38:35,790 Dus als we opnieuw vertellen dit verhaal nog een laatste tijd, en ik eigenlijk opnieuw te tekenen swap, 744 00:38:35,790 --> 00:38:44,620 maar met pointers, hetgeen een, dit zijnde b, en dit is tmp, wat is 745 00:38:44,620 --> 00:38:49,080 feitelijk in een in deze groene versie van mijn code waar ik het passeren 746 00:38:49,080 --> 00:38:52,110 in adressen? 747 00:38:52,110 --> 00:38:53,780 >> Het gaat om een ​​pointer naar x te zijn. 748 00:38:53,780 --> 00:38:54,890 Zo kon ik een pijl te tekenen. 749 00:38:54,890 --> 00:38:57,310 Maar laten we gebruiken dezelfde arbitraire bijvoorbeeld als voorheen. 750 00:38:57,310 --> 00:39:01,220 Laten we zeggen dat dit iets als Ox123. 751 00:39:01,220 --> 00:39:04,970 En dit gaat worden Ox127 omdat het is vier bytes weg omdat het een 752 00:39:04,970 --> 00:39:07,370 int, dus Ox127. 753 00:39:07,370 --> 00:39:09,080 >> En nogmaals, ik ben het nemen van een aantal vrijheden met de nummers. 754 00:39:09,080 --> 00:39:11,430 Ze zijn veel kleiner dan ze zouden daadwerkelijk en in een andere volgorde. 755 00:39:11,430 --> 00:39:14,350 Maar dat is hoe het beeld is nu anders. 756 00:39:14,350 --> 00:39:19,060 >> Maar toen ik deze groene code en ik heb int tmp krijgen * een. 757 00:39:19,060 --> 00:39:25,010 * Een middel om het volgende te doen, neemt de pakken die in een en ga naar het, 758 00:39:25,010 --> 00:39:26,190 die 1. 759 00:39:26,190 --> 00:39:28,480 En dat is wat ik vervolgens in tmp. 760 00:39:28,480 --> 00:39:32,480 Ondertussen, in de volgende regel code Hier, * a krijgt b, wat betekent dat? 761 00:39:32,480 --> 00:39:36,910 >> Nou, * een, dus ga hier krijgt * b, wat betekent dat er heen gaan. 762 00:39:36,910 --> 00:39:39,310 En dat betekent dat de waarde naar daar. 763 00:39:39,310 --> 00:39:43,670 Ten slotte is de laatste regel code eenvoudig gezegd * b krijgt tmp. 764 00:39:43,670 --> 00:39:48,900 >> Dus b zegt dat er gaan en overschrijf met tmp die, in dit geval, gaat 765 00:39:48,900 --> 00:39:51,520 wil weer, 1. 766 00:39:51,520 --> 00:39:54,920 En dit is de reden waarom de groene versie van onze code werkt, terwijl de rode 767 00:39:54,920 --> 00:39:56,010 versie nooit gedaan. 768 00:39:56,010 --> 00:39:59,020 Het allemaal neer op hoe de geheugen wordt beheerd en waar het 769 00:39:59,020 --> 00:40:02,580 in uw daadwerkelijk geplaatst RAM van de computer. 770 00:40:02,580 --> 00:40:07,270 En voor nu, dat is een van de dingen dat de stapel wordt gebruikt. 771 00:40:07,270 --> 00:40:09,225 >> Vragen over de lay-out? 772 00:40:09,225 --> 00:40:10,380 Op pointers? 773 00:40:10,380 --> 00:40:11,630 Of op swap? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Oke, dus malloc, rappel, deed iets als dit. 776 00:40:17,043 --> 00:40:18,260 Dit was een super eenvoudig voorbeeld. 777 00:40:18,260 --> 00:40:20,550 En dit was degene die Binky stelde ons voor aan, zij het vrij 778 00:40:20,550 --> 00:40:21,870 snel eind klasse. 779 00:40:21,870 --> 00:40:24,480 Dammit, daar gaan we weer. 780 00:40:24,480 --> 00:40:28,780 >> Zo herinneren dat dit het voorbeeld dat Binky stelde ons voor aan, zij het 781 00:40:28,780 --> 00:40:30,360 enigszins snel aan het einde van de les. 782 00:40:30,360 --> 00:40:33,640 En hier hebben we gebruik malloc echt voor de tweede keer. 783 00:40:33,640 --> 00:40:37,330 Omdat de eerste keer dat we gebruikten het om aan voldoende RAM, toewijzen genoeg RAM 784 00:40:37,330 --> 00:40:38,340 een tekenreeks slaan. 785 00:40:38,340 --> 00:40:40,250 >> Dit keer Binky het simpel gehouden. 786 00:40:40,250 --> 00:40:42,465 Dus het is om gewoon te slaan een int, blijkbaar. 787 00:40:42,465 --> 00:40:43,510 En dat is helemaal prima. 788 00:40:43,510 --> 00:40:46,560 Het is een beetje raar, eerlijk gezegd, om Gebruik malloc naar een int toe te wijzen. 789 00:40:46,560 --> 00:40:50,650 Maar het punt van Nick's claymation was eigenlijk alleen maar vertellen het verhaal van wat 790 00:40:50,650 --> 00:40:53,830 gebeurt of niet gebeurt wanneer je mishandelen geheugen. 791 00:40:53,830 --> 00:40:56,520 >> Dus in dit geval, het programma deed een paar dingen. 792 00:40:56,520 --> 00:41:01,580 In het eerste geval hier, het verklaart een pointer genaamd x naar een int. 793 00:41:01,580 --> 00:41:04,480 Het verklaart dan een pointer riep y naar een int. 794 00:41:04,480 --> 00:41:06,150 Het slaat dan in x, wat? 795 00:41:06,150 --> 00:41:07,110 Iemand anders nu. 796 00:41:07,110 --> 00:41:09,685 Wat er wordt opgeslagen in x volgens de derde regel van dit programma? 797 00:41:09,685 --> 00:41:12,380 >> PUBLIEK: [onverstaanbaar]. 798 00:41:12,380 --> 00:41:14,130 >> LUIDSPREKER 1: Nou, niet helemaal bytes, per zeggen. 799 00:41:14,130 --> 00:41:16,760 Wees nu nauwkeuriger. 800 00:41:16,760 --> 00:41:18,325 Wat er wordt opgeslagen in x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Een adres, ik denk dat ik het hoorde. 803 00:41:22,060 --> 00:41:23,570 >> Dus wat doet malloc terug? 804 00:41:23,570 --> 00:41:26,030 malloc gedragsmatig toewijst een stuk van het geheugen. 805 00:41:26,030 --> 00:41:27,850 Maar hoe werkt het geeft je toegang tot het? 806 00:41:27,850 --> 00:41:29,460 Het geeft wat? 807 00:41:29,460 --> 00:41:32,000 Het adres van de eerste byte in het stuk van het geheugen. 808 00:41:32,000 --> 00:41:33,020 >> Nu, dit is super simpel. 809 00:41:33,020 --> 00:41:35,380 Het is gewoon een byte, wat betekent dat de pakken we krijgen terug is de 810 00:41:35,380 --> 00:41:37,300 adres van de hele zaak. 811 00:41:37,300 --> 00:41:42,070 Dus opgeslagen in x dan is, is het adres van dat stuk van het geheugen. 812 00:41:42,070 --> 00:41:43,400 Ondertussen, wat gebeurt er nu? 813 00:41:43,400 --> 00:41:45,890 Dus eigenlijk, laten we verder gaan en trekken dit uit echt snel. 814 00:41:45,890 --> 00:41:52,490 >> Dus als we gaan over naar het scherm hier en we spelen dit uit int * x en int * y 815 00:41:52,490 --> 00:41:53,740 gaat wat voor mij doen? 816 00:41:53,740 --> 00:41:58,280 Ik eis dat het gewoon gaat doen zoiets als dit en noemen het x, en 817 00:41:58,280 --> 00:42:00,010 dit en noemen het y. 818 00:42:00,010 --> 00:42:03,110 Intussen is de derde regel van de code is naar de grootte van een int toewijzen 819 00:42:03,110 --> 00:42:06,160 die toevallig - sorry als ik zei - een voordat ik een int betekende 820 00:42:06,160 --> 00:42:08,280 vier bytes op een typische computer. 821 00:42:08,280 --> 00:42:09,720 In ieder geval met de CS50 apparaat. 822 00:42:09,720 --> 00:42:11,490 >> Dus dit gaat te wijzen het, wie weet? 823 00:42:11,490 --> 00:42:12,800 Ergens hier. 824 00:42:12,800 --> 00:42:15,780 En dit wordt opgeslagen bij sommige adres Ox, wie weet? 825 00:42:15,780 --> 00:42:18,330 Maar wat er gaat komen terug is dat adres. 826 00:42:18,330 --> 00:42:22,270 Maar we zullen dit picturaal trekken als net een pijl als dat. 827 00:42:22,270 --> 00:42:25,430 >> Nu in de volgende regel * x krijgt 42. 828 00:42:25,430 --> 00:42:29,400 Wat betekent * x betekenen in lekentaal? 829 00:42:29,400 --> 00:42:30,040 Ga gewoon daar. 830 00:42:30,040 --> 00:42:30,960 Ga naar dat adres. 831 00:42:30,960 --> 00:42:35,900 Of met andere woorden, volgen de pijl en zet 42 daar. 832 00:42:35,900 --> 00:42:38,140 Maar dan is er iets ergs gebeurd naar Binky, toch? 833 00:42:38,140 --> 00:42:43,950 >> Bedenk dat lijn vijf hier, * y krijgt 13, inderdaad een ongeluksgetal, 834 00:42:43,950 --> 00:42:44,760 deed wat voor ons? 835 00:42:44,760 --> 00:42:47,320 Nou, * y middelen gaan daar. 836 00:42:47,320 --> 00:42:50,460 Nou, dit is niet gegeven nog een waarde, toch? 837 00:42:50,460 --> 00:42:54,090 De code heeft geen y zijnde geïnitialiseerd tot niets. 838 00:42:54,090 --> 00:42:56,120 We hadden x geïnitialiseerd naar een adres. 839 00:42:56,120 --> 00:42:57,640 Maar y werd uitgeroepen tot top. 840 00:42:57,640 --> 00:43:00,250 Maar dan een puntkomma, geen waarde werd in het eigenlijk gezet. 841 00:43:00,250 --> 00:43:02,330 Dus het is eerlijk om deze te bellen een vuilnisbak waarde. 842 00:43:02,330 --> 00:43:03,430 Wie weet wat er staat? 843 00:43:03,430 --> 00:43:07,160 Het is de overblijfselen van bits die gebruikt werden wordt door eerdere regel code in 844 00:43:07,160 --> 00:43:08,300 mijn programma. 845 00:43:08,300 --> 00:43:13,250 >> Dus als ik zeg ga er, dit is als, Ik heb geen idee waar deze pijl is 846 00:43:13,250 --> 00:43:14,490 gaat uiteindelijk. 847 00:43:14,490 --> 00:43:17,720 En dat is wanneer je meestal krijgen een segmentation fault. 848 00:43:17,720 --> 00:43:22,430 Als u per ongeluk dereferentie, om zo te spreken, of ga naar een adres dat niet 849 00:43:22,430 --> 00:43:25,400 eigenlijk een legitiem adres, slechte dingen gebeuren. 850 00:43:25,400 --> 00:43:27,550 >> En dat is precies wat er gebeurd is naar Binky denken. 851 00:43:27,550 --> 00:43:31,060 Zodat herinneren dat het verhaal dat Nick was Hier vertellen was hetzelfde idee als wat 852 00:43:31,060 --> 00:43:34,050 Ik heb getekend met de illusie van krijt op het bord daar. 853 00:43:34,050 --> 00:43:35,960 X en Y zijn verklaard. 854 00:43:35,960 --> 00:43:39,690 >> Dan toegewezen we de grootte van een int en opgeslagen in x. 855 00:43:39,690 --> 00:43:42,130 Dan is de volgende regel hebben we * x. 856 00:43:42,130 --> 00:43:46,070 Dit was Nick's toverstaf van dereferentie. 857 00:43:46,070 --> 00:43:49,780 Dat zet 42 in het geheugen opgemerkt door x. 858 00:43:49,780 --> 00:43:51,600 >> Maar dit is waar de dingen ging vreselijk mis. 859 00:43:51,600 --> 00:43:51,820 Rechts? 860 00:43:51,820 --> 00:43:53,550 We hebben geprobeerd om dereferentie y. 861 00:43:53,550 --> 00:43:55,620 Maar y had een aantal nep-waarde, toch? 862 00:43:55,620 --> 00:43:57,720 >> Die pijl in de linker corner, is niet 863 00:43:57,720 --> 00:43:58,950 eigenlijk wijst naar iets. 864 00:43:58,950 --> 00:44:01,520 Het is een soort van te doen wat ik deed hier op het bord. 865 00:44:01,520 --> 00:44:05,900 Dus slechte dingen gebeuren, segmentatie storing of Binky fout, in dit geval. 866 00:44:05,900 --> 00:44:10,800 >> Maar als we vervolgens vast te stellen dat door het doen van x krijgt y hoe werkt het verhaal veranderen? 867 00:44:10,800 --> 00:44:15,760 Nou, als ik x krijgt y, dat is feite hetzelfde als zeggen 868 00:44:15,760 --> 00:44:19,235 wat het ook is, Ox-iets gaat hier hetzelfde, 869 00:44:19,235 --> 00:44:20,080 Ox-iets. 870 00:44:20,080 --> 00:44:22,970 Of picturaal we een pijl te tekenen. 871 00:44:22,970 --> 00:44:25,530 >> Dus hier op het bord met Binky, met de volgende regel van 872 00:44:25,530 --> 00:44:28,350 code, * y betekent gaan daar. 873 00:44:28,350 --> 00:44:29,400 Waar is er? 874 00:44:29,400 --> 00:44:30,820 Het betekent hier voorbij. 875 00:44:30,820 --> 00:44:36,050 >> En toen we een update van dat te zijn 13 het enkel gaat om te gaan en 876 00:44:36,050 --> 00:44:39,470 schrijven van 13 hier nu. 877 00:44:39,470 --> 00:44:44,130 Dus misschien niet helemaal eenvoudig op het eerste gezicht. 878 00:44:44,130 --> 00:44:47,740 Maar om samen te vatten en om hetzelfde jargon gebruiken dat Binky hier werd gebruikt, dus 879 00:44:47,740 --> 00:44:50,485 de eerste twee wijzen de wijzers, x en y, maar niet de pointees. 880 00:44:50,485 --> 00:44:54,750 En pointees is geen algemeen gebruikte term. 881 00:44:54,750 --> 00:44:56,120 Maar wijzer absoluut is. 882 00:44:56,120 --> 00:44:59,200 Maar het is wat er wordt gewezen op in de nomenclatuur van Binky's. 883 00:44:59,200 --> 00:45:01,660 >> Deze volgende lijn, natuurlijk, wijst een int pointee. 884 00:45:01,660 --> 00:45:04,840 Dus een stuk van het geheugen - zoals ik trok dan op de rechterzijde is er - en set 885 00:45:04,840 --> 00:45:06,470 x gelijk om te wijzen op het. 886 00:45:06,470 --> 00:45:11,350 Dit dereferences x op te slaan 42 in het geheugen dat het wijzend op. 887 00:45:11,350 --> 00:45:13,380 En dan deze, uiteraard, was een slechte zaak. 888 00:45:13,380 --> 00:45:15,600 Omdat y werd niet wijzen bij nog niets. 889 00:45:15,600 --> 00:45:16,530 Dit lost het. 890 00:45:16,530 --> 00:45:18,240 Dus dit is nog steeds buggy programma. 891 00:45:18,240 --> 00:45:21,580 Gewoon omdat we waait door de code lijn per lijn en zeggen, ach, 892 00:45:21,580 --> 00:45:22,690 laat het daar crashen. 893 00:45:22,690 --> 00:45:23,420 Dat is een slechte zaak. 894 00:45:23,420 --> 00:45:26,790 Odds zijn het programma zal alleen maar abort helemaal op die lijn. 895 00:45:26,790 --> 00:45:30,550 Maar als je te verwijderen van de gecrashte lijn en vervang deze door de laatste twee 896 00:45:30,550 --> 00:45:32,470 lijnen er u toewijst - 897 00:45:32,470 --> 00:45:35,310 behulp wijzer opdracht - y om te wijzen op x als punt t. 898 00:45:35,310 --> 00:45:39,280 En dan moet je dereferentie y in een zeer veilige manier. 899 00:45:39,280 --> 00:45:41,520 >> Dus waar komt dit ons verlaten? 900 00:45:41,520 --> 00:45:45,350 Nou, blijkt dat onder de motorkap in de CS50 bibliotheek, pointers zijn 901 00:45:45,350 --> 00:45:46,320 gebruikt in. 902 00:45:46,320 --> 00:45:48,910 En we daadwerkelijk beginnen te schillen terug die laag duurde niet lang. 903 00:45:48,910 --> 00:45:51,740 Maar het blijkt ook, een uitdrukking die sommigen van u misschien bekend zijn met, 904 00:45:51,740 --> 00:45:54,580 name comfortabeler, is eigenlijk dat een zeer populaire 905 00:45:54,580 --> 00:45:56,390 website, of stack overflow, deze dagen. 906 00:45:56,390 --> 00:45:58,720 >> Maar dit heeft eigenlijk heel technische betekenis. 907 00:45:58,720 --> 00:46:00,160 We weten nu wat een stack is. 908 00:46:00,160 --> 00:46:02,550 Het is als een stapel trays binnenkant van een eetzaal. 909 00:46:02,550 --> 00:46:05,140 >> Of binnenkant van uw computer geheugen its die frames 910 00:46:05,140 --> 00:46:06,900 die worden gebruikt door functies. 911 00:46:06,900 --> 00:46:10,760 Nou, het blijkt dat als gevolg van die zeer eenvoudige uitvoering van 912 00:46:10,760 --> 00:46:14,970 geheugen en de frames op de zogenaamde stack, kun je eigenlijk controle over te nemen 913 00:46:14,970 --> 00:46:17,050 van een computersysteem vrij gemakkelijk. 914 00:46:17,050 --> 00:46:22,180 U kunt inbreken in een systeem als mensen zoals wij onze code niet hebben geschreven 915 00:46:22,180 --> 00:46:23,300 bijzonder goed. 916 00:46:23,300 --> 00:46:26,670 >> Als mensen zoals wij gebruiken brokken van het geheugen of het gebruik arrays - 917 00:46:26,670 --> 00:46:27,810 nog meer in het algemeen - 918 00:46:27,810 --> 00:46:31,800 maar soms vergeten om het te controleren grenzen van ons aanbod zoals je misschien 919 00:46:31,800 --> 00:46:38,470 heb je soms, en herhaald veel te ver voorbij het einde van een array. 920 00:46:38,470 --> 00:46:40,520 In het beste geval, uw programma misschien net crashen. 921 00:46:40,520 --> 00:46:42,280 Segmentatie fout, soort van gênant. 922 00:46:42,280 --> 00:46:45,480 Niet geweldig, maar het is niet per se een enorm slechte zaak. 923 00:46:45,480 --> 00:46:49,480 >> Maar als je programma is eigenlijk op echte computers van gebruikers, als het draait 924 00:46:49,480 --> 00:46:53,070 op een website die daadwerkelijk willekeurige mensen op het internet raken, laten 925 00:46:53,070 --> 00:46:56,690 mensen veroorzaken slechte dingen op je code is over het algemeen niet een goede zaak, want 926 00:46:56,690 --> 00:46:59,930 betekent dus de gelegenheid om besturing van de computer. 927 00:46:59,930 --> 00:47:01,350 En dit is gaan kijken een beetje cryptisch. 928 00:47:01,350 --> 00:47:04,570 Maar ik dacht dat ik je schrikken met Dit laatste voorbeeld hier. 929 00:47:04,570 --> 00:47:05,650 >> Hier is een voorbeeld van de code. 930 00:47:05,650 --> 00:47:07,370 En er is een goede Wikipedia artikel dat loopt door 931 00:47:07,370 --> 00:47:08,530 dit in meer detail. 932 00:47:08,530 --> 00:47:13,890 Ik heb de belangrijkste op de bodem roeping foo, passeren in argv van 1. 933 00:47:13,890 --> 00:47:15,750 En dat is gewoon zo dat je kunt start het programma en doorgeven 934 00:47:15,750 --> 00:47:17,080 een willekeurige ingang. 935 00:47:17,080 --> 00:47:20,180 >> En dan foo wordt verklaard up top als het accepteren van een string, of meer 936 00:47:20,180 --> 00:47:21,700 Juist, een char *. 937 00:47:21,700 --> 00:47:23,860 Het verklaart dan een array van chars. 938 00:47:23,860 --> 00:47:27,130 Noem het een buffer, meer algemeen, van maat 12. 939 00:47:27,130 --> 00:47:30,900 Zo 12 chars kan passen binnen van de matrix c genoemd. 940 00:47:30,900 --> 00:47:33,510 >> En dan is het gebruik van deze nieuwe functie, dat is nieuw, maar niet moeilijk te 941 00:47:33,510 --> 00:47:34,930 begrijpen, geheugen kopiëren. 942 00:47:34,930 --> 00:47:39,290 Het kopieert het geheugen van de bar, die was de variabele n verleden, ongeacht de 943 00:47:39,290 --> 00:47:42,080 gebruiker getypt in argv 1 in c. 944 00:47:42,080 --> 00:47:43,090 Hoeveel bytes? 945 00:47:43,090 --> 00:47:44,260 De lengte van de string van de bar. 946 00:47:44,260 --> 00:47:48,380 >> Dus met andere woorden, als de gebruiker types h-e-l-l-o enter, de lengte van de string 947 00:47:48,380 --> 00:47:49,260 van hello is vijf. 948 00:47:49,260 --> 00:47:52,790 Dus vijf van die bytes gaat krijgen gekopieerd naar de array c genoemd, die 949 00:47:52,790 --> 00:47:54,110 is van maat 12. 950 00:47:54,110 --> 00:47:58,710 Maar wat de gebruiker typt in een veel langere woord dat is 13 tekens of 14 951 00:47:58,710 --> 00:48:01,250 tekens of 100 tekens of meer? 952 00:48:01,250 --> 00:48:02,660 >> Waar gaan ze heen? 953 00:48:02,660 --> 00:48:06,090 Nou, dat frame, die lade in de eetzaal stack, 954 00:48:06,090 --> 00:48:06,930 ze gaan om er naartoe te gaan. 955 00:48:06,930 --> 00:48:10,080 En het is gewoon om te beginnen met het overschrijven andere dingen die al 956 00:48:10,080 --> 00:48:12,880 op die stapel, overvolle de stack, zo te zeggen. 957 00:48:12,880 --> 00:48:14,780 >> Dus pictorially, denk aan het op deze manier. 958 00:48:14,780 --> 00:48:17,970 Dit is slechts een kleurrijke versie van het beeld dat we hebben al getekend. 959 00:48:17,970 --> 00:48:20,060 Aan de onderkant, laten we zeggen, is de belangrijkste. 960 00:48:20,060 --> 00:48:24,690 En op de top, wat je nu ziet is het frame, kleur gecodeerd nu, voor een 961 00:48:24,690 --> 00:48:26,090 functie genaamd foo. 962 00:48:26,090 --> 00:48:30,170 Maar wat is interessant hier over foo is dat hier is het frame. 963 00:48:30,170 --> 00:48:32,860 Dus het is getrokken net zoals ik deed maar in lichtblauw. 964 00:48:32,860 --> 00:48:35,220 En nu dit is waar c beugel 0 gaat. 965 00:48:35,220 --> 00:48:37,410 En dit is waar c beugel 11 gaat eindigen. 966 00:48:37,410 --> 00:48:39,670 >> Met andere woorden, het gebeurt worden weergegeven als een vierkant. 967 00:48:39,670 --> 00:48:42,320 Maar als je gewoon blijven plopping bytes beneden - of chars - ze gaan eindigen 968 00:48:42,320 --> 00:48:46,070 up op locatie 0 helemaal naar boven tot 11 omdat het 0 geïndexeerd. 969 00:48:46,070 --> 00:48:49,170 >> Maar waar is de 13e teken gaat uiteindelijk? 970 00:48:49,170 --> 00:48:50,310 Waar is de 14e? 971 00:48:50,310 --> 00:48:52,430 Waar is de 50e teken gaat uiteindelijk? 972 00:48:52,430 --> 00:48:54,070 >> Het gaat om door te gaan naar beneden. 973 00:48:54,070 --> 00:48:57,350 Want ook al hebben we getekend de foto met de stapel opgroeien, de 974 00:48:57,350 --> 00:48:59,920 adressen, het blijkt, gaan van kleine adressen, kleine 975 00:48:59,920 --> 00:49:01,830 pointers, om grote adressen. 976 00:49:01,830 --> 00:49:03,540 Dus het blijft maar gaan omhoog en omhoog. 977 00:49:03,540 --> 00:49:05,660 >> Als types van de gebruiker hallo, dat is geweldig. 978 00:49:05,660 --> 00:49:08,650 Geen bug, geen probleem, iedereen is veilig. 979 00:49:08,650 --> 00:49:11,940 Maar als soorten de gebruiker in wat we zullen bellen hoor en wederhoor code, vertegenwoordigd 980 00:49:11,940 --> 00:49:16,040 generiek als een, aanval, aanval, aanval, aanval, wat er kan gebeuren? 981 00:49:16,040 --> 00:49:19,760 >> Nou, als alle van de input die de gebruiker getypt is niet zomaar een vriendelijke 982 00:49:19,760 --> 00:49:21,540 of beledigende tekenreeks. 983 00:49:21,540 --> 00:49:24,050 Het is eigenlijk een opeenvolging van karakters dat als je het gecompileerd, 984 00:49:24,050 --> 00:49:26,050 het is eigenlijk code. 985 00:49:26,050 --> 00:49:29,570 Misschien is het code die verwijdert alle bestanden op uw harde schijf of verstuurt spam 986 00:49:29,570 --> 00:49:30,810 of iets dergelijks. 987 00:49:30,810 --> 00:49:35,110 Merk op dat wat de sleutel hier is dat als de bad guy kregen geluk om 988 00:49:35,110 --> 00:49:37,830 overschrijven de rode brok van het geheugen - 989 00:49:37,830 --> 00:49:41,080 wat ik niet putten uit mijn foto maar deze Wikipedia foto hier heeft - 990 00:49:41,080 --> 00:49:42,890 haar zogenaamde retouradres. 991 00:49:42,890 --> 00:49:47,470 >> Wanneer het voedsel terug, toen swap rendementen, hoe werkt de computer weten om te gaan van 992 00:49:47,470 --> 00:49:49,790 tot hier tot hier beneden? 993 00:49:49,790 --> 00:49:52,920 Of in de tech segment boven, hoe weet zij om te gaan van de swap 994 00:49:52,920 --> 00:49:54,870 code - de 0 en 1's dat swap componeren - 995 00:49:54,870 --> 00:49:56,020 terug naar main? 996 00:49:56,020 --> 00:50:00,450 Er is een zogenaamde retouradres opgeslagen in dezelfde stackframe op 997 00:50:00,450 --> 00:50:02,140 dezelfde cafetaria lade. 998 00:50:02,140 --> 00:50:06,080 >> Dus als de bad guy is slim genoeg om zet aanval code, aanval code, aanval 999 00:50:06,080 --> 00:50:07,960 code, en krijg het geluk - 1000 00:50:07,960 --> 00:50:11,630 vaak door middel van trial and error - tot overschrijven die rode retouradres, 1001 00:50:11,630 --> 00:50:14,360 met het adres en de mededeling de top. 1002 00:50:14,360 --> 00:50:16,830 Merkt 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Het is geschreven achteruit up top voor redenen zullen we misschien opnieuw. 1004 00:50:20,650 --> 00:50:22,050 Dit is het getal. 1005 00:50:22,050 --> 00:50:25,790 >> Dus als de bad guy krijgt geluk of is slim genoeg om de rode overschrijven 1006 00:50:25,790 --> 00:50:29,480 strippen van het geheugen met het adres van code die hij of zij heeft een of andere manier 1007 00:50:29,480 --> 00:50:34,980 geïnjecteerd in uw computer, raden wiens code zal worden teruggestuurd naar 1008 00:50:34,980 --> 00:50:38,260 Zodra foo gebeurt uitvoeren? 1009 00:50:38,260 --> 00:50:39,440 >> Code van de bad guy's. 1010 00:50:39,440 --> 00:50:43,610 Dus deze aanval code, AAA, nogmaals, misschien spam versturen, worden mogelijk niet alle bestanden verwijderen 1011 00:50:43,610 --> 00:50:44,500 op uw harde schijf. 1012 00:50:44,500 --> 00:50:48,740 Maar dat is wat echt een stack overflow is, of een buffer overrun, of een 1013 00:50:48,740 --> 00:50:51,060 buffer overflow aanval. 1014 00:50:51,060 --> 00:50:54,400 >> En het is ongelooflijk, ongelooflijk gemeenschappelijke tot op de dag met programma's geschreven in 1015 00:50:54,400 --> 00:50:58,220 C, C + +, en zelfs andere talen. 1016 00:50:58,220 --> 00:51:02,275 Op die enge opmerking, zullen we eindigen met een grap. 1017 00:51:02,275 --> 00:51:03,230 >> [Lachen] 1018 00:51:03,230 --> 00:51:04,550 >> Tot ziens op woensdag. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Bij de volgende CS50 - 1021 00:51:10,310 --> 00:51:15,920 Dus ik ben allen uit schijf lampen vandaag maar wacht, vetvrije melk, de helft van de telefoon 1022 00:51:15,920 --> 00:51:17,850 boek, het sinaasappelsap dat ik vandaag dronk. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB-kabel, een moersleutel. 1025 00:51:22,780 --> 00:51:24,800 >> [Muziek]