1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Muziek] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. MALAN: Oke. 4 00:00:12,640 --> 00:00:14,525 Dit is CS50. 5 00:00:14,525 --> 00:00:16,009 En dit is het begin van week 5. 6 00:00:16,009 --> 00:00:18,050 En zoals je misschien al gemerkt hebt, deel van het materiaal 7 00:00:18,050 --> 00:00:21,050 wordt steeds een beetje meer complex, de kleine dichter. 8 00:00:21,050 --> 00:00:24,560 >> En het is heel makkelijk, vooral als u in de gewoonte geweest voor enige tijd, 9 00:00:24,560 --> 00:00:28,600 te proberen om de meeste opschrijven alles wat we doen, we zeggen in de klas. 10 00:00:28,600 --> 00:00:31,626 Maar beseffen, dat is misschien niet de ideale pedagogische aanpak 11 00:00:31,626 --> 00:00:34,250 om het leren van dit soort materiaal, en materiaal meer in het algemeen. 12 00:00:34,250 --> 00:00:37,250 En dus zijn we blij om kondigen eigen Gheng dat CS50 13 00:00:37,250 --> 00:00:39,780 Gong begonnen te bereiden een canonieke verzameling van opmerkingen 14 00:00:39,780 --> 00:00:42,100 voor de cursus, de hoop van namelijk dat men deze 15 00:00:42,100 --> 00:00:44,030 niet alleen als een referentie en een bron 16 00:00:44,030 --> 00:00:47,410 voor de herziening van materiaal en gaan terug door materiaal dat misschien 17 00:00:47,410 --> 00:00:51,230 ontsnapt de eerste keer, maar ook, zodat uw hoofd kan meer 18 00:00:51,230 --> 00:00:53,740 omhoog dan omlaag, wanneer tijd is om de les te lezen, 19 00:00:53,740 --> 00:00:56,960 zodat je zou kunnen gaan meer bedachtzaam, als 20 00:00:56,960 --> 00:00:59,170 tegenstelling tot meer scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Met dat gezegd, wat je zult vinden op de website is dergelijke documenten als dit. 22 00:01:02,510 --> 00:01:04,660 En let, linksboven, is er niet alleen een inhoudsopgave, 23 00:01:04,660 --> 00:01:06,920 maar ook tijd codes die krijgt u meteen te springen 24 00:01:06,920 --> 00:01:09,077 naar de juiste onderdeel in de video online. 25 00:01:09,077 --> 00:01:11,410 En wat Chang hier heeft gedaan wordt, in essentie, gedocumenteerd 26 00:01:11,410 --> 00:01:13,340 wat er in deze bijzondere lezing. 27 00:01:13,340 --> 00:01:16,370 En veel van de lezingen zijn al online nu met deze URL. 28 00:01:16,370 --> 00:01:20,110 En we zullen doorgaan met de rest te posten van die tegen het einde van deze week, 29 00:01:20,110 --> 00:01:22,380 dus profiteren van die bron. 30 00:01:22,380 --> 00:01:25,740 >> Dus zonder verder oponthoud, we begonnen om terug te pellen 31 00:01:25,740 --> 00:01:28,180 de laag die is koord enige tijd. 32 00:01:28,180 --> 00:01:30,670 En wat hebben we zeggen een string eigenlijk is de afgelopen week? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Dus char ster. 35 00:01:32,900 --> 00:01:34,900 En char ster, goed, wat ging dat eigenlijk? 36 00:01:34,900 --> 00:01:37,150 Nou, al die tijd, als we hebben is het aanroepen van een functie, 37 00:01:37,150 --> 00:01:40,450 zoals getString en opslaan de zogenaamde return 38 00:01:40,450 --> 00:01:42,910 waarde van getString in een variable-- het heet 39 00:01:42,910 --> 00:01:47,721 s soort string-- we al schrijven de regel van de code daar boven. 40 00:01:47,721 --> 00:01:49,970 En het is pas als ik zie mijn handschrift hier uitvergroot 41 00:01:49,970 --> 00:01:51,930 moet ik beseffen hoe afschuwelijk dit is. 42 00:01:51,930 --> 00:01:54,180 >> Echter, laten we aannemen dat, aan de rechterzijde 43 00:01:54,180 --> 00:01:57,070 is niettemin een redelijke voorstelling van wat er 44 00:01:57,070 --> 00:01:58,880 er aan de hand dit alles tijd met getString. 45 00:01:58,880 --> 00:02:00,380 getString natuurlijk krijgt een tekenreeks. 46 00:02:00,380 --> 00:02:01,691 Maar wat betekent dat eigenlijk? 47 00:02:01,691 --> 00:02:04,190 Het betekent het krijgt een brok van geheugen van het besturingssysteem 48 00:02:04,190 --> 00:02:06,040 door te bellen naar een functie, genaamd malloc. 49 00:02:06,040 --> 00:02:07,390 Maar daarover later meer. 50 00:02:07,390 --> 00:02:09,139 En dan is het bevolkt dat stuk van het geheugen 51 00:02:09,139 --> 00:02:11,764 met de brieven van de gebruiker heeft ingetypt, gevolgd door natuurlijk 52 00:02:11,764 --> 00:02:14,800 een nul, of een backslash nul op het einde. 53 00:02:14,800 --> 00:02:18,280 >> Ondertussen, aan de linkerkant van dit verhaal, al die tijd, 54 00:02:18,280 --> 00:02:20,850 we hebben declareren van een variabele, zoals s. 55 00:02:20,850 --> 00:02:24,770 En die variabele is wat nu zal beginnen bellen een pointer. 56 00:02:24,770 --> 00:02:29,190 Het is niet een doos binnen van die we zetten de string, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 maar zetten we in dat plein vak aan de linkerzijde wat precies? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Yeah? 60 00:02:35,390 --> 00:02:37,118 >> Publiek: Het adres van waar het is gelegen in het geheugen. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. MALAN: Precies. 62 00:02:38,118 --> 00:02:40,690 Het adres van waar Daven bevindt zich in het geheugen. 63 00:02:40,690 --> 00:02:44,650 En niet waar alle Daven is gevestigd, per se, maar specifiek adres 64 00:02:44,650 --> 00:02:45,150 van wat? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Yeah? 67 00:02:46,810 --> 00:02:47,460 >> PUBLIEK: Eerste karakter. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. MALAN: Het eerste teken in Daven, die in dit geval 69 00:02:50,209 --> 00:02:53,820 Ik heb voorgesteld was willekeurig en onrealistisch 1, OX1, 70 00:02:53,820 --> 00:02:55,910 waardoor alleen de hexadecimaal getal van 1. 71 00:02:55,910 --> 00:02:57,993 Maar het gaat waarschijnlijk een veel grotere getal zijn 72 00:02:57,993 --> 00:03:01,260 opdat wij zouden trekken met een 0x als voorvoegsel, 73 00:03:01,260 --> 00:03:02,806 wat neerkomt op een hexadecimaal karakter. 74 00:03:02,806 --> 00:03:05,930 En omdat we niet nodig om te weten waar de rest van de karakters van Daven 75 00:03:05,930 --> 00:03:09,860 zijn, door wat eenvoudig ontwerp beslissing dat was vele jaren geleden gemaakt? 76 00:03:09,860 --> 00:03:10,548 Yeah? 77 00:03:10,548 --> 00:03:11,651 >> PUBLIEK: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. MALAN: Ja, precies. 79 00:03:12,900 --> 00:03:18,100 De backslash 0 kunt u, zij het in lineaire tijd, om de string doorkruisen, 80 00:03:18,100 --> 00:03:20,400 lopen van links naar rechts, met een lus, of een tijdje 81 00:03:20,400 --> 00:03:22,608 lus, of iets dergelijks dat, en te bepalen, oh, hier 82 00:03:22,608 --> 00:03:24,751 is het einde van dit koord. 83 00:03:24,751 --> 00:03:27,000 Dus met alleen het adres op het begin van een tekenreeks, 84 00:03:27,000 --> 00:03:30,290 Wij hebben toegang tot het geheel van , want dit alles terwijl, 85 00:03:30,290 --> 00:03:32,030 een string is net een char ster. 86 00:03:32,030 --> 00:03:36,370 >> Dus het is zeker goed te blijven gebruiken de CS50 bibliotheek en deze abstractie, 87 00:03:36,370 --> 00:03:38,440 zo te zeggen, maar we zullen gaan precies zien 88 00:03:38,440 --> 00:03:41,230 wat is er aan de hand onder deze hele tijd. 89 00:03:41,230 --> 00:03:45,260 Dus je kan dit voorbeeld herinneren, Ook van de vorige keer, vergelijk 0, 90 00:03:45,260 --> 00:03:47,300 die eigenlijk niet te vergelijken. 91 00:03:47,300 --> 00:03:49,070 Maar we begonnen om dit op te lossen. 92 00:03:49,070 --> 00:03:52,020 >> Maar als misschien wel een opfriscursus, zou ik iemand interesseren 93 00:03:52,020 --> 00:03:54,261 in een roze olifant vandaag, ook gemaakt door Chang? 94 00:03:54,261 --> 00:03:55,760 Hoe zit je aan de voorkant? [Onverstaanbaar]. 95 00:03:55,760 --> 00:03:56,660 Kom maar naar boven. 96 00:03:56,660 --> 00:03:58,740 >> En in de tussentijd, als je komen, laten we 97 00:03:58,740 --> 00:04:01,670 overwegen voor slechts een moment wat deze code is werkelijk te doen. 98 00:04:01,670 --> 00:04:04,917 Het verklaren van twee variabelen op top, s en t, en bellen getString. 99 00:04:04,917 --> 00:04:08,250 Dit is niet een zeer gebruiksvriendelijk programma, omdat het je niet vertellen wat je moet doen. 100 00:04:08,250 --> 00:04:10,541 Maar laten we aannemen dat we gericht op het sappige gedeelte. 101 00:04:10,541 --> 00:04:14,470 En dan doen we, als s gelijk is aan t gelijk moet printf zeggen 102 00:04:14,470 --> 00:04:16,170 je hetzelfde getypt. 103 00:04:16,170 --> 00:04:16,670 Hello. 104 00:04:16,670 --> 00:04:17,050 Wat is je naam? 105 00:04:17,050 --> 00:04:17,779 >> JANELLE: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. MALAN: Janelle, leuk je te ontmoeten. 107 00:04:19,529 --> 00:04:21,800 Dus uw uitdaging bij hand voor deze olifant 108 00:04:21,800 --> 00:04:25,230 is om eerst te tekenen ons een beeld van wat er worden voorgesteld in de eerste twee 109 00:04:25,230 --> 00:04:25,970 lijnen. 110 00:04:25,970 --> 00:04:28,139 Zo s en t misschien vertegenwoordigd hoe op het scherm? 111 00:04:28,139 --> 00:04:30,680 En je kunt gewoon tekenen met uw vinger op dit grote scherm. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Dus er is twee helften aan elke zijde van die vergelijking. 114 00:04:34,510 --> 00:04:37,760 Dus er is s aan de linkerkant, en de Vervolgens getString aan de rechterkant. 115 00:04:37,760 --> 00:04:40,540 En dan is er nog t aan de linkerkant, en dan getString aan de rechterkant. 116 00:04:40,540 --> 00:04:42,630 Dus hoe kunnen we beginnen het tekenen van een beeld dat 117 00:04:42,630 --> 00:04:46,340 weergeeft wat er aan de hand hier in het geheugen, zou je dan zeggen? 118 00:04:46,340 --> 00:04:49,150 En laat me laten uitleggen wat je doet als je gaat. 119 00:04:49,150 --> 00:04:49,820 >> JANELLE: OK. 120 00:04:49,820 --> 00:04:58,890 Nou, ten eerste, het zou moeten vragen u naar de input string te krijgen. 121 00:04:58,890 --> 00:05:00,439 En het zou store-- oh, sorry. 122 00:05:00,439 --> 00:05:01,230 DAVID J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Goed. 124 00:05:01,730 --> 00:05:03,330 En dit is wat heet? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Blijf doorgaan. 127 00:05:04,450 --> 00:05:05,575 Ik wilde je niet storen. 128 00:05:05,575 --> 00:05:07,060 JANELLE: Sorry. 129 00:05:07,060 --> 00:05:14,237 Dus het zou ingang het in het adres van-- niet zeker. 130 00:05:14,237 --> 00:05:17,320 Ik kan me niet precies herinneren het nummer, maar ik denk dat het begon met 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. MALAN: Dat is in orde, omdat ik de getallen, 132 00:05:18,420 --> 00:05:19,650 dus er is geen juist antwoord. 133 00:05:19,650 --> 00:05:22,105 >> JANELLE: Te beginnen met de 0 arc. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. MALAN: OK, dus element 0. 135 00:05:24,000 --> 00:05:24,765 Tuurlijk. 136 00:05:24,765 --> 00:05:28,295 >> JANELLE: En dan, als was als slechts een twee-letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. MALAN: OK, terug naar jou. 138 00:05:30,496 --> 00:05:33,629 >> JANELLE: Dus element 0 en dan 1 element of element 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. MALAN: En welk stuk van de foto ben je nu aan het tekenen? 140 00:05:36,670 --> 00:05:37,690 De oproep tot getString? 141 00:05:37,690 --> 00:05:38,830 Of de verklaring van s? 142 00:05:38,830 --> 00:05:42,890 >> JANELLE: De verklaring van s, geloof ik. 143 00:05:42,890 --> 00:05:45,980 Oh, de getString omdat het zou worden ingevoerd in elke [? gebied. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. MALAN: Goed. 145 00:05:46,510 --> 00:05:47,051 Precies. 146 00:05:47,051 --> 00:05:49,300 Hoewel dit effectief geeft een array, recall, 147 00:05:49,300 --> 00:05:53,300 als we terug een string, we kunnen index in die string met 01 en 2. 148 00:05:53,300 --> 00:05:56,180 Technisch gezien, zijn dit waarschijnlijk vertegenwoordigd door individuele adressen, 149 00:05:56,180 --> 00:05:57,100 maar dat is prima. 150 00:05:57,100 --> 00:06:00,170 >> Dus stel, als ik kan alleen snel doorsturen naar waar we gebleven 151 00:06:00,170 --> 00:06:04,320 laatste keer als een van de snaren was g a b e, 152 00:06:04,320 --> 00:06:10,337 backslash 0, zijn aldus Gabe's input, hoe zouden wij vertegenwoordigen en nu? 153 00:06:10,337 --> 00:06:12,670 Als dit het geheugen dat geretourneerd door getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> JANELLE: Zou het vertegenwoordigd door een boog? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. MALAN: Door een boog? 157 00:06:18,750 --> 00:06:19,130 Nou, nee. 158 00:06:19,130 --> 00:06:21,171 Laten we zeggen, picturaal, laat me gewoon doorgaan 159 00:06:21,171 --> 00:06:25,710 en voor dat, indien dit is s, dit is de return waarde van getString. 160 00:06:25,710 --> 00:06:29,482 En je hebt dit getekend als 0, 1, 2, die is heel redelijk, omdat we 161 00:06:29,482 --> 00:06:30,940 kan indexeren in de string, als zodanig. 162 00:06:30,940 --> 00:06:33,340 Maar gewoon om te stroken met laatste keer, laat me ga je gang 163 00:06:33,340 --> 00:06:37,310 en willekeurig voor te stellen dat deze is het adres 1, dit is het adres 2, 164 00:06:37,310 --> 00:06:39,597 dit adres 3, enzovoort. 165 00:06:39,597 --> 00:06:41,430 En dus, gewoon om super te zijn duidelijk, wat is er 166 00:06:41,430 --> 00:06:44,580 gaan in s als gevolg van die eerste regel van de code, zou je dan zeggen? 167 00:06:44,580 --> 00:06:45,420 >> JANELLE: Adres 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. MALAN: Precies. 169 00:06:46,420 --> 00:06:47,190 Dus pakken 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 En ondertussen, laat me gaan en dupliceren veel van wat je hebt gedaan 172 00:06:51,230 --> 00:06:52,740 en voeg hier mijn eigen t. 173 00:06:52,740 --> 00:06:56,340 Als ik te typen in Gabe nogmaals, een tweede keer, 174 00:06:56,340 --> 00:07:01,530 wanneer daarom wordt gevraagd met getString, waar, Natuurlijk is gabe ga? 175 00:07:01,530 --> 00:07:02,280 Nou, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> JANELLE: Net als hier? 178 00:07:05,975 --> 00:07:06,850 DAVID J. MALAN: Ja. 179 00:07:06,850 --> 00:07:08,516 JANELLE: Of het is ook in dezelfde dozen? 180 00:07:08,516 --> 00:07:11,940 DAVID J. MALAN: Laat me voorstellen, ja, precies, zodat in het andere vakken. 181 00:07:11,940 --> 00:07:15,230 Maar wat is nu belangrijk is dat, zelfs hoewel ik deze aardig in de buurt hebt getekend 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, dit wordt 0x2-- in werkelijkheid, 183 00:07:18,650 --> 00:07:25,750 dit nu zou kunnen adres 0x10 zijn, bijvoorbeeld, en 0x11 en 0x12, 184 00:07:25,750 --> 00:07:26,870 enzovoort. 185 00:07:26,870 --> 00:07:29,955 En dus, als dat het geval is, wat er gaat hier uiteindelijk in t? 186 00:07:29,955 --> 00:07:30,830 >> JANELLE: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. MALAN: Precies. 188 00:07:31,830 --> 00:07:33,180 Dus 0x10. 189 00:07:33,180 --> 00:07:34,570 En nu, de laatste vraag. 190 00:07:34,570 --> 00:07:37,510 Je hebt, veruit, moest het werk moeilijkste voor een olifant tot nu toe. 191 00:07:37,510 --> 00:07:42,650 Door nu, als ik trek de code weer, wanneer ik, in lijn drie, 192 00:07:42,650 --> 00:07:47,630 als s gelijk is gelijk aan t, wat ben ik eigenlijk vergelijken van dat we hier hebben getrokken? 193 00:07:47,630 --> 00:07:49,271 >> JANELLE: De twee adressen? 194 00:07:49,271 --> 00:07:50,270 DAVID J. MALAN: Precies. 195 00:07:50,270 --> 00:07:53,350 Dus ik zeg is s gelijk is gelijk aan t? 196 00:07:53,350 --> 00:07:56,210 Met andere woorden, 1 gelijk gelijk aan 10? 197 00:07:56,210 --> 00:07:59,710 En natuurlijk de voor de hand liggende antwoord is nu, nee. 198 00:07:59,710 --> 00:08:02,920 En dus dit programma is uiteindelijk ter perse gaan wat, zou je dan zeggen? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> JANELLE: Zou het, je hetzelfde getypt? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. MALAN: Dus als s 1 is en t 10? 202 00:08:11,446 --> 00:08:13,320 >> JANELLE: Je getypt verschillende dingen. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. MALAN: Precies. 204 00:08:13,570 --> 00:08:14,480 U hebt getypt verschillende dingen. 205 00:08:14,480 --> 00:08:14,850 Oke. 206 00:08:14,850 --> 00:08:16,714 Dus een applaus, als we konden, hier. 207 00:08:16,714 --> 00:08:17,214 [Applaus] 208 00:08:17,214 --> 00:08:17,708 Dat was pijnlijk. 209 00:08:17,708 --> 00:08:18,208 Ik weet het. 210 00:08:18,208 --> 00:08:19,684 Mooi gedaan. 211 00:08:19,684 --> 00:08:24,690 Dus laten we nu eens kijken of we niet kunnen plagen elkaar wat de oplossing was. 212 00:08:24,690 --> 00:08:28,040 En natuurlijk, als we vast dit-- die ik nu te vertegenwoordigen in green-- 213 00:08:28,040 --> 00:08:29,690 we hebben een paar verbeteringen hier. 214 00:08:29,690 --> 00:08:32,409 Ten eerste, zoals een gezond verstand kijk, ik ben eerst te controleren 215 00:08:32,409 --> 00:08:35,110 als s gelijk is aan nul en t is gelijk aan nul. 216 00:08:35,110 --> 00:08:39,440 En alleen maar om duidelijk te zijn, wanneer zou s of t nul in code als deze? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Wanneer zou s of t null zijn. 219 00:08:44,490 --> 00:08:44,990 Yeah? 220 00:08:44,990 --> 00:08:45,990 >> PUBLIEK: [onverstaanbaar]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. MALAN: Precies. 223 00:08:50,510 --> 00:08:52,840 Als de tekenreeks die de gebruiker ingetypt is veel te lang 224 00:08:52,840 --> 00:08:56,140 te passen in het geheugen, of een rare hoek geval als dat, 225 00:08:56,140 --> 00:08:59,010 getString, zoals we zullen zien, letterlijk vandaag, in de documentatie, 226 00:08:59,010 --> 00:09:02,330 zegt dat het zal null zo terug een speciale sentinel waarde, 227 00:09:02,330 --> 00:09:05,417 of gewoon een soort van een speciaal symbool dat betekent dat er iets mis is gegaan. 228 00:09:05,417 --> 00:09:07,500 Dus we willen controleren dat, aangezien het blijkt 229 00:09:07,500 --> 00:09:09,720 dat null is een zeer gevaarlijke waarde. 230 00:09:09,720 --> 00:09:14,250 >> Vaak, als je probeert om iets te doen met null met een function-- door te geven 231 00:09:14,250 --> 00:09:17,470 als input voor instance-- die functie misschien erg zal crashen en, met het, 232 00:09:17,470 --> 00:09:19,090 take down je hele programma. 233 00:09:19,090 --> 00:09:22,570 Dus deze derde lijn is nu slechts een sanity controleren, foutcontrole, als je wil. 234 00:09:22,570 --> 00:09:25,450 Dat is nu een goede gewoonte voor ons op te nemen in een tijd dat we 235 00:09:25,450 --> 00:09:28,050 proberen om een ​​waarde te gebruiken die kon, in potentie, van nul. 236 00:09:28,050 --> 00:09:32,000 >> Nu, hier de vierde regel, "Als strcmp (s, t)," goed, 237 00:09:32,000 --> 00:09:33,180 wat is dat een verwijzing naar? 238 00:09:33,180 --> 00:09:36,750 Nou, wij vonden dat dit een zeer beknopt benoemde functie voor string vergelijking. 239 00:09:36,750 --> 00:09:40,370 En haar doel in het leven is om te vergelijken haar eerste argument tegen het tweede, 240 00:09:40,370 --> 00:09:44,640 maar niet in termen van hun adressen, zoals wij gedaan hebben onbedoeld een moment 241 00:09:44,640 --> 00:09:48,270 geleden met de rode code, maar veeleer vergelijken deze twee 242 00:09:48,270 --> 00:09:53,210 strings in het menselijk intuïtieve manier door het vergelijken van dit, tegen deze, 243 00:09:53,210 --> 00:09:56,690 tegen dit, tegen deze, en dan stoppen indien en wanneer een 244 00:09:56,690 --> 00:09:59,590 of beide van mijn vingers raakt een backslash 0. 245 00:09:59,590 --> 00:10:04,530 Dus iemand die jaren geleden geïmplementeerd strcmp uitvoer te leggen voor ons de functionaliteit 246 00:10:04,530 --> 00:10:08,890 dat we gehoopt dat we zouden hebben gekregen met slechts twee eenvoudige vergelijking van waarden. 247 00:10:08,890 --> 00:10:14,929 >> Nu eerlijk gezegd, ik blijf tekenen al deze verschillende getallen. 248 00:10:14,929 --> 00:10:17,470 Maar de realiteit is, ik ben geweest waardoor deze de hele tijd. 249 00:10:17,470 --> 00:10:19,580 En dus laat me gewoon doorgaan en krabbel deze uit 250 00:10:19,580 --> 00:10:23,100 om een ​​punt dat aan het einde van de dag en vooruit, 251 00:10:23,100 --> 00:10:30,160 we zijn niet echt zorgen te maken over welke adressen dingen eigenlijk 252 00:10:30,160 --> 00:10:30,790 in het geheugen. 253 00:10:30,790 --> 00:10:34,320 Dus ik ben niet van plan om deze te tekenen soorten nummers zo veel meer, 254 00:10:34,320 --> 00:10:38,970 Ik ben gewoon een abstract deze weg een beetje meer vriendelijk met slechts pijlen. 255 00:10:38,970 --> 00:10:42,060 >> Met andere woorden, als s een pointer, goed, laten we gewoon tekenen, letterlijk, 256 00:10:42,060 --> 00:10:45,430 als een pointer, een pijl uit zichzelf naar iets anders, 257 00:10:45,430 --> 00:10:48,280 en niet te veel zorgen meer over de minutia van deze adressen 258 00:10:48,280 --> 00:10:49,910 die, nogmaals, ik heb bedacht toch. 259 00:10:49,910 --> 00:10:52,680 Maar we zullen deze adressen te zien, Soms, bij het oplossen van code. 260 00:10:52,680 --> 00:10:56,450 >> Nu ondertussen, dit programma hier fixes, natuurlijk, 261 00:10:56,450 --> 00:10:58,720 dat probleem door vergelijking die twee strings. 262 00:10:58,720 --> 00:11:00,260 Maar we liepen tegen een ander probleem. 263 00:11:00,260 --> 00:11:03,180 Dit was van de kopie programmeren laatste keer, 264 00:11:03,180 --> 00:11:06,880 waarbij, ik probeerde te kapitaliseren alleen het eerste teken in een string. 265 00:11:06,880 --> 00:11:09,620 Maar wat was het symptoom we vorige keer toen zag 266 00:11:09,620 --> 00:11:14,150 een gebruiker heeft ingevoerd in een waarde, zoals gabe in kleine letters, voor s, 267 00:11:14,150 --> 00:11:19,310 vervolgens toegewezen we s naar t, zoals in het derde line, 268 00:11:19,310 --> 00:11:22,900 en dan heb ik geprobeerd om kapitaliseren t beugel 0? 269 00:11:22,900 --> 00:11:25,950 Wat was het effect van veranderende t beugel 0 hier? 270 00:11:25,950 --> 00:11:27,150 >> Publiek: Het veranderde s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. MALAN: Ja, Ik veranderde s, ook. 272 00:11:29,360 --> 00:11:31,050 Want wat er werkelijk aan de hand? 273 00:11:31,050 --> 00:11:34,130 Nou, laat me zien of ik kan schoonmaken op deze foto, als volgt. 274 00:11:34,130 --> 00:11:41,390 >> Als s, wederom, het woord g, a, b, e, backslash, 0, en s 275 00:11:41,390 --> 00:11:44,084 we zullen doorgaan met tekenen als een doos here, maar niet meer adressen. 276 00:11:44,084 --> 00:11:45,250 Laten we stoppen met het maken van dingen. 277 00:11:45,250 --> 00:11:47,510 Laten we gewoon een tekening maken de wereld vereenvoudigen. 278 00:11:47,510 --> 00:11:52,640 >> Als ik verklaar t met string t, dat schept dat stuk van het geheugen. 279 00:11:52,640 --> 00:11:55,850 Plein gebeurt te zijn 32 bits in de meeste computers. 280 00:11:55,850 --> 00:11:59,530 In feite, als je ooit gehoord van een computer met een 32-bit architectuur, 281 00:11:59,530 --> 00:12:03,000 echt fancy-spreken, die net middelen gebruikt 32-bit adressen. 282 00:12:03,000 --> 00:12:05,370 En als technisch terzijde, Als je ooit hebt afgevraagd 283 00:12:05,370 --> 00:12:09,630 waarom oudere computers, als u daadwerkelijk probeerde soep ze met veel RAM, 284 00:12:09,630 --> 00:12:12,360 kan slechts een maximum hebben van vier gigabyte aan RAM-geheugen, 285 00:12:12,360 --> 00:12:14,860 Nou dat is omdat, letterlijk, uw oude computer kon alleen 286 00:12:14,860 --> 00:12:17,250 tellen zo hoog als 4 miljard, 4 miljard bytes, 287 00:12:17,250 --> 00:12:20,590 omdat het 32-bits nummers adressen. 288 00:12:20,590 --> 00:12:23,260 >> Maar in elk geval, in deze Bijvoorbeeld, het verhaal van veel eenvoudiger. 289 00:12:23,260 --> 00:12:27,250 t is gewoon een andere aanwijzer, of echt een char ster, aka string. 290 00:12:27,250 --> 00:12:30,860 En hoe kan ik deze foto wilt updaten nu met die tweede regel van de code, 291 00:12:30,860 --> 00:12:31,950 na de dot, dot, dot? 292 00:12:31,950 --> 00:12:35,845 Als ik dat doe touw t de waarde s puntkomma, hoe verhoudt dit beeld te veranderen? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Yeah? 295 00:12:38,000 --> 00:12:38,916 >> PUBLIEK: [onverstaanbaar]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. MALAN: Ja. 298 00:12:42,020 --> 00:12:42,600 Precies. 299 00:12:42,600 --> 00:12:45,620 Ik heb net een pijl uit de t box naar hetzelfde adres, 300 00:12:45,620 --> 00:12:47,570 dezelfde eerste letter in gaf. 301 00:12:47,570 --> 00:12:50,850 Of technisch, als dit man nog op 0x1, 302 00:12:50,850 --> 00:12:53,052 het is alsof ik had 0x1 hier en 0x1 hier. 303 00:12:53,052 --> 00:12:54,760 Maar nogmaals, who cares de adressen? 304 00:12:54,760 --> 00:12:56,345 Het is gewoon het idee dat het nu doet. 305 00:12:56,345 --> 00:12:57,720 Dus dit is wat er hier gebeurt. 306 00:12:57,720 --> 00:13:02,690 Dus natuurlijk, als je dat doet t beugel 0: de matrix notatie, 307 00:13:02,690 --> 00:13:05,650 van course-- en eerlijk gezegd, het ziet er alsof er een scala hier, 308 00:13:05,650 --> 00:13:07,340 maar nu is er een raar ding. 309 00:13:07,340 --> 00:13:11,160 Weten dat de programmeertaal, C, biedt u deze mogelijkheid, 310 00:13:11,160 --> 00:13:14,650 waarbij, zelfs als t een wijzer, of s een pointer, 311 00:13:14,650 --> 00:13:18,050 kunt u nog steeds gebruik maken van die vertrouwd zijn, comfortabele vierkante haak 312 00:13:18,050 --> 00:13:22,520 notatie naar het eerste element, of het tweede element, of een element 313 00:13:22,520 --> 00:13:26,130 dat pointer wijst om omdat vermoedelijk het 314 00:13:26,130 --> 00:13:29,410 is, zoals in casu, wijst op een array. 315 00:13:29,410 --> 00:13:30,340 >> Dus hoe kunnen we dit oplossen? 316 00:13:30,340 --> 00:13:33,660 Eerlijk gezegd, dit is waar het werd een beetje overweldigend op het eerste gezicht. 317 00:13:33,660 --> 00:13:35,340 Maar hier is een nieuwe en verbeterde versie. 318 00:13:35,340 --> 00:13:37,460 >> Dus eerst, ik krijg ontdoen van de CS50 bibliotheek, 319 00:13:37,460 --> 00:13:41,170 gewoon bloot dat s inderdaad een char ster, maar een synoniem. 320 00:13:41,170 --> 00:13:43,540 En t is ook een char ster. 321 00:13:43,540 --> 00:13:48,290 Maar wat er gaande is op de rechterzijde van die lijn 322 00:13:48,290 --> 00:13:49,970 waarbij t een waarde is toegekend? 323 00:13:49,970 --> 00:13:50,790 >> Wat is malloc? 324 00:13:50,790 --> 00:13:51,630 Wat het strlen? 325 00:13:51,630 --> 00:13:52,547 Wat is sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Waarom de heck doet dit lijn blik zo complex? 327 00:13:54,380 --> 00:13:55,713 Wat doet het op een hoog niveau? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Hoe is het opslaan van in t? 330 00:13:57,440 --> 00:13:58,646 Yeah? 331 00:13:58,646 --> 00:14:01,104 Publiek: Het toewijzen van een bepaalde hoeveelheid geheugen ruimte. 332 00:14:01,104 --> 00:14:03,032 Het is op te slaan, denk ik, brieven [onverstaanbaar]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. MALAN: Perfect. 334 00:14:04,032 --> 00:14:04,540 Perfect. 335 00:14:04,540 --> 00:14:06,650 Het toekennen van een bepaalde hoeveelheid geheugenruimte 336 00:14:06,650 --> 00:14:08,940 opslaan vermoedelijk toekomst letters. 337 00:14:08,940 --> 00:14:11,310 En met name malloc Daarom terug wat? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> PUBLIEK: Terugkerende de [onverstaanbaar]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. MALAN: Precies. 341 00:14:15,850 --> 00:14:18,850 Terugzending van het adres van dat geheugen, Dit is een ingewikkelde manier om te zeggen, 342 00:14:18,850 --> 00:14:21,640 geeft het adres van de eerste byte van dat geheugen. 343 00:14:21,640 --> 00:14:25,460 Het is aan mij om te onthouden hoeveel geheugen ik eigenlijk 344 00:14:25,460 --> 00:14:27,140 toegewezen of gevraagd malloc voor. 345 00:14:27,140 --> 00:14:28,384 >> Nu hoeveel is dat? 346 00:14:28,384 --> 00:14:30,550 Nou, ook al is er veel haakjes here, 347 00:14:30,550 --> 00:14:32,970 malloc duurt slechts een enkel argument. 348 00:14:32,970 --> 00:14:37,250 En ik ben het specificeren strlen van s, dus geef me zoveel bytes als er in s, 349 00:14:37,250 --> 00:14:37,800 maar voeg een. 350 00:14:37,800 --> 00:14:38,300 Waarom? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Yeah? 353 00:14:39,530 --> 00:14:40,840 >> Publiek: De backslash 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. MALAN: Precies. 355 00:14:41,840 --> 00:14:43,423 We moeten een beetje het huishouden doen. 356 00:14:43,423 --> 00:14:45,970 Dus omdat er een backslash 0, zouden we beter onthouden. 357 00:14:45,970 --> 00:14:47,310 Anders gaan we om een ​​string te maken dat 358 00:14:47,310 --> 00:14:49,170 niet over die speciale terminator. 359 00:14:49,170 --> 00:14:52,640 >> Ondertussen, alleen maar om super te zijn anaal, ik heb sizeof (char), 360 00:14:52,640 --> 00:14:55,730 voor het geval dat iemand loopt mijn code niet op de CS50 apparaat, 361 00:14:55,730 --> 00:14:58,220 maar misschien een andere computer helemaal waar chars 362 00:14:58,220 --> 00:15:01,470 zijn een byte, volgens afspraak, maar twee bytes, of iets groter dan dat. 363 00:15:01,470 --> 00:15:04,490 Het is gewoon super zijn, super vies van fouten. 364 00:15:04,490 --> 00:15:06,940 Alhoewel, in werkelijkheid is het het meest waarschijnlijk zal een 1 zijn. 365 00:15:06,940 --> 00:15:11,490 >> Nu, ondertussen, ik ga je gang en kopieer de reeks, t beugel i is gelijk aan t beugel s. 366 00:15:11,490 --> 00:15:14,962 En ik zal uitstellen tot vorige week broncode om te zien wat er gaande is. 367 00:15:14,962 --> 00:15:17,670 Maar de sleutel mee te nemen, en de reden dat ik de code nu in het groen, 368 00:15:17,670 --> 00:15:22,520 Want dat laatste lijn, t beugel 0 evenaart toupper, 369 00:15:22,520 --> 00:15:25,230 heeft tot gevolg kapitaliseren die reeks? 370 00:15:25,230 --> 00:15:26,960 t en / of s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Die laatste regel code. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Gewoon t, want wat is gebeurde dit keer, 375 00:15:35,560 --> 00:15:41,500 als ik iets ongedaan te maken die laatste stap, wat is er gebeurd, als ik bel malloc, 376 00:15:41,500 --> 00:15:45,380 Ik wezen krijgen een stuk van het geheugen dat is hetzelfde formaat als het origineel, 377 00:15:45,380 --> 00:15:47,020 want dat is het rekenkundig ik deed. 378 00:15:47,020 --> 00:15:50,920 Ik ben het opslaan van in t het adres van dat deel van het geheugen. 379 00:15:50,920 --> 00:15:53,370 Hoewel dit ziet er leuk uit en mooi, mooi en leeg, 380 00:15:53,370 --> 00:15:56,882 de realiteit is dat er, wat we zullen blijven bellen, vuilnis waarden in hier. 381 00:15:56,882 --> 00:15:59,340 Dat stuk van het geheugen zou zeer goed hebben al eerder gebruikt, 382 00:15:59,340 --> 00:16:00,940 een paar seconden, een paar minuten geleden. 383 00:16:00,940 --> 00:16:04,410 Dus er absoluut kan zijn nummers of letters er, net per ongeluk. 384 00:16:04,410 --> 00:16:08,580 Maar ze zijn niet geldig, totdat ik mezelf bevolken dit stuk van het geheugen 385 00:16:08,580 --> 00:16:12,510 met de werkelijke tekens, zoals ik doen in die lus daar. 386 00:16:12,510 --> 00:16:13,180 Goed? 387 00:16:13,180 --> 00:16:16,180 >> Dus nu, de climax van Deze drie voorbeelden 388 00:16:16,180 --> 00:16:20,730 die schijnbaar gebroken waren de vorige keer, deze Swap voorbeeld van deze functie 389 00:16:20,730 --> 00:16:23,670 werkzaam in de zin dat verwisseld a en b. 390 00:16:23,670 --> 00:16:25,620 Maar het werkte niet in welke andere zin? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Yeah? 393 00:16:28,614 --> 00:16:29,612 >> PUBLIEK: [onverstaanbaar]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. MALAN: Precies. 396 00:16:36,700 --> 00:16:39,530 Als ik deze functie aan te roepen van another-- bijvoorbeeld 397 00:16:39,530 --> 00:16:42,870 van een functie als main, waar Ik heb een variabele, x en y, zoals ik 398 00:16:42,870 --> 00:16:46,160 vorige week deed, dezelfde code, en ik pas in de x en y 399 00:16:46,160 --> 00:16:49,860 naar Wisselen en neem contact Swap-- dit, Uiteraard is de juiste versie 400 00:16:49,860 --> 00:16:52,220 is wat we gaan see-- het werkte niet. 401 00:16:52,220 --> 00:16:53,770 Dus wat is de oplossing? 402 00:16:53,770 --> 00:16:56,850 >> Nou ja, zo gewoon te zijn duidelijk, laat me ga je gang 403 00:16:56,850 --> 00:17:05,450 en-- geef me een seconde hier, en zie als ik je kan laten zien de laatste, die 404 00:17:05,450 --> 00:17:12,464 zal in-- eens kijken of ik kan vinden deze echte fast-- OK, [onverstaanbaar]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, daar is het. 407 00:17:19,240 --> 00:17:21,000 Dus negeer de commando's ik ben gewoon te typen. 408 00:17:21,000 --> 00:17:23,780 Ik wil het op te halen bij het laatste moment een voorbeeld 409 00:17:23,780 --> 00:17:27,960 van de laatste tijd, die heet nu geen Swap. 410 00:17:27,960 --> 00:17:30,200 >> Dus geen Swap is waar we gebleven waren de vorige keer, 411 00:17:30,200 --> 00:17:32,930 waarbij, geïnitialiseerd I x op 1 en y 2. 412 00:17:32,930 --> 00:17:35,840 Ik roep dan Swap, passeren in 1 en 2. 413 00:17:35,840 --> 00:17:37,930 En dan is deze functie werkte in zekere zin 414 00:17:37,930 --> 00:17:40,750 maar het had geen permanente Effect op de x en y. 415 00:17:40,750 --> 00:17:45,430 Dus de vraag aan de hand is, hoe nu weten we eigenlijk dit probleem op te lossen? 416 00:17:45,430 --> 00:17:47,820 Wat is de oplossing bij de hand? 417 00:17:47,820 --> 00:17:53,150 >> Nou, in swap.c, die nieuw is vandaag de dag, merken een paar verschillen. 418 00:17:53,150 --> 00:17:54,700 x en y gelijk. 419 00:17:54,700 --> 00:17:57,250 Maar wat duidelijk anders over lijn 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Wat is er nieuw, als je nog hoe het eruit zag als een tweede geleden? 422 00:18:01,715 --> 00:18:02,565 >> PUBLIEK: [onverstaanbaar]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. MALAN: Ja. 424 00:18:03,440 --> 00:18:06,680 Dus de ampersands zijn een nieuw stuk van syntax, niet alleen in dit programma, 425 00:18:06,680 --> 00:18:08,560 maar ook meer in het algemeen in de CS50. 426 00:18:08,560 --> 00:18:10,680 Tot op heden, ik denk niet dat We hebben voorbeelden gezien 427 00:18:10,680 --> 00:18:14,070 of echt gesproken over hen op enigerlei detail, andere dan, misschien, preemptively 428 00:18:14,070 --> 00:18:16,467 in doorsnede, een ampersand als deze. 429 00:18:16,467 --> 00:18:19,300 Nou, het blijkt ampersand is een van de laatste stukken van nieuwe syntaxis 430 00:18:19,300 --> 00:18:20,174 we gaan om te leren. 431 00:18:20,174 --> 00:18:23,500 Het betekent alleen de adres van een variabele. 432 00:18:23,500 --> 00:18:25,070 Op welk adres hoeft x leven? 433 00:18:25,070 --> 00:18:26,510 Maar wat het adres doet y leven? 434 00:18:26,510 --> 00:18:28,700 Want als de fundamentele probleem voor 435 00:18:28,700 --> 00:18:32,970 werd dat x en y werden doorgegeven zoals kopieën, wat we echt willen doen 436 00:18:32,970 --> 00:18:38,780 wordt voorzien Swap met als een schat map die leidt waar x en y eigenlijk 437 00:18:38,780 --> 00:18:41,910 in RAM, zodat Swap kan die kaart volgen 438 00:18:41,910 --> 00:18:47,760 en ga naar de plaats waar x of y markeert de plek en verander de werkelijke waarden 1 en 2 439 00:18:47,760 --> 00:18:48,270 er. 440 00:18:48,270 --> 00:18:50,710 >> Dus Swap moet ook iets veranderen. 441 00:18:50,710 --> 00:18:53,760 En op het eerste gezicht, deze macht lijkt een beetje vergelijkbaar met char ster. 442 00:18:53,760 --> 00:18:54,850 En inderdaad het is. 443 00:18:54,850 --> 00:18:59,635 Dus een is een pointer naar wat voor soort data, op basis van deze gemarkeerde gedeelte? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Dus het is een int. 446 00:19:01,620 --> 00:19:04,880 >> Dus een is niet langer een int, het is het adres van een int. 447 00:19:04,880 --> 00:19:07,910 En evenzo b gaat nu het adres van een int. 448 00:19:07,910 --> 00:19:12,470 Dus als ik bel nu Swap van Main, Ik ben niet van plan om Swap 1 en 2 geven. 449 00:19:12,470 --> 00:19:15,540 Ik ga om het te geven als Ox-iets en Ox-iets, 450 00:19:15,540 --> 00:19:19,820 twee adressen die zal leiden Swap hun werkelijke locaties 451 00:19:19,820 --> 00:19:21,310 in het geheugen van mijn computer. 452 00:19:21,310 --> 00:19:25,580 >> Dus nu mijn resterende implementatie moet een beetje veranderen. 453 00:19:25,580 --> 00:19:28,650 Wat is uiteraard anders nu in deze drie regels code? 454 00:19:28,650 --> 00:19:31,350 Er is die verdomde sterren alle over de plaats, goed? 455 00:19:31,350 --> 00:19:33,014 Dus wat is hier aan de hand? 456 00:19:33,014 --> 00:19:33,514 Yeah? 457 00:19:33,514 --> 00:19:35,055 >> Publiek: Het is natuurlijk [onverstaanbaar]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. MALAN: Precies. 460 00:19:37,990 --> 00:19:41,560 Dus in dit context-- en dit niet was het beste ontwerp beslissing, toegegeven, 461 00:19:41,560 --> 00:19:42,530 jaar geleden. 462 00:19:42,530 --> 00:19:45,110 In deze context, waar hoef je alleen maar een ster, 463 00:19:45,110 --> 00:19:48,240 en je hoeft niet een datatype, zoals int, onmiddellijk naar links, 464 00:19:48,240 --> 00:19:53,146 in plaats daarvan heb je een gelijk teken, duidelijk, in deze context, als je zegt dat een ster, 465 00:19:53,146 --> 00:19:56,980 betekent naar de adres dat is in een. 466 00:19:56,980 --> 00:19:58,870 Volg de schatkaart, bij wijze van spreken. 467 00:19:58,870 --> 00:20:01,720 >> En ondertussen, in lijn 37, het betekent hetzelfde. 468 00:20:01,720 --> 00:20:05,460 Ga naar het adres van een, en doe wat er? 469 00:20:05,460 --> 00:20:09,520 Wat er ook aan de locatie die b specificeert. 470 00:20:09,520 --> 00:20:10,980 Met andere woorden, ga naar b. 471 00:20:10,980 --> 00:20:12,130 Krijgen die waarde. 472 00:20:12,130 --> 00:20:15,620 Ga naar een en, per gelijke ondertekenen, de opdracht operator, 473 00:20:15,620 --> 00:20:17,010 zet daar die waarde. 474 00:20:17,010 --> 00:20:19,272 >> Ook int temp is gewoon een int. 475 00:20:19,272 --> 00:20:20,730 Er hoeft niets te veranderen over temp. 476 00:20:20,730 --> 00:20:24,810 Het is gewoon een extra glas uit Annenberg voor wat melk of jus d'orange. 477 00:20:24,810 --> 00:20:27,630 Maar ik moet wel zeggen, ga naar b. 478 00:20:27,630 --> 00:20:31,449 Ga naar die bestemming en zet de waarde in temp daar. 479 00:20:31,449 --> 00:20:32,490 Dus wat gebeurt er dan? 480 00:20:32,490 --> 00:20:36,540 Toen ik daadwerkelijk op te roepen Swap dit moment, als deze eerste bak hier vertegenwoordigt Main, 481 00:20:36,540 --> 00:20:42,270 deze tweede lade vertegenwoordigt Swap, wanneer Ik passeer ampersand x en y ampersand 482 00:20:42,270 --> 00:20:47,150 van Main naar Wisselen, gewoon om duidelijk te zijn, wat is dit stackframe ontvangen? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Yeah? 485 00:20:49,200 --> 00:20:50,180 >> PUBLIEK: [onverstaanbaar]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. MALAN: Precies. 487 00:20:51,180 --> 00:20:53,129 Het adres van x en het adres van y. 488 00:20:53,129 --> 00:20:55,170 En u kunt denken van deze zoals postadressen. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street en 35 Oxford Street, en u 490 00:20:58,772 --> 00:21:01,230 willen de twee gebouwen te verplaatsen die op die locaties. 491 00:21:01,230 --> 00:21:04,680 >> Het is een soort van een belachelijk idee, maar dat is alles wat we bedoelen met het adres. 492 00:21:04,680 --> 00:21:07,000 Waar in de wereld kan je die twee ints vinden? 493 00:21:07,000 --> 00:21:09,470 Waar in de wereld kun je die twee gebouwen te vinden? 494 00:21:09,470 --> 00:21:15,170 Dus als eindelijk, na al die tijd I gaan in de huidige broncode en compileren 495 00:21:15,170 --> 00:21:22,110 Swap en run ./swap, ten slotte, voor de eerste keer dat we echt zien dat 496 00:21:22,110 --> 00:21:25,330 mijn waarden inderdaad succesvol verwisseld. 497 00:21:25,330 --> 00:21:30,860 En nu kunnen we zelfs Noteer dit in, zeg, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Dus laat me gaan in hetzelfde bestand. 499 00:21:32,740 --> 00:21:35,010 Laat me ga je gang en lopen gdb van ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 En nu, in Swap, ik ga om te gaan vooruit en stel een breekpunt in de Main. 502 00:21:40,547 --> 00:21:42,630 En nu ga ik om te gaan vooruit en start het programma. 503 00:21:42,630 --> 00:21:45,810 En nu zien we mijn code gepauzeerd op die lijn. 504 00:21:45,810 --> 00:21:48,330 >> Als ik ga je gang en printen x, wat moet ik hier zie? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Het is een vraag. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Weer zeggen? 509 00:21:51,530 --> 00:21:52,295 >> PUBLIEK: [onverstaanbaar]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. MALAN: Dus willekeurige getallen, misschien. 511 00:21:53,910 --> 00:21:56,010 Misschien krijg ik geluk, en het is lekker simpel, net als 0. 512 00:21:56,010 --> 00:21:57,230 Maar misschien is het wat willekeurig getal. 513 00:21:57,230 --> 00:21:58,090 In dit geval, ik heb geluk gehad. 514 00:21:58,090 --> 00:21:59,030 Het gebeurt gewoon te zijn 0. 515 00:21:59,030 --> 00:22:00,780 Maar het is inderdaad geluk, omdat niet totdat ik 516 00:22:00,780 --> 00:22:06,280 typt volgende en vervolgens afdrukken x heeft dat regel code, lijn 19, is uitgevoerd. 517 00:22:06,280 --> 00:22:10,942 >> Ondertussen, naast opnieuw als ik typ, en nu uitprinten y, ik ga om te zien 2. 518 00:22:10,942 --> 00:22:13,900 Nu, als ik typ volgend, gaat het om een beetje verwarrend, want nu, 519 00:22:13,900 --> 00:22:17,250 de printf gaat over lijken het scherm, zoals zij heeft gedaan. x is 1. 520 00:22:17,250 --> 00:22:18,606 >> Laten we dit nog een keer doen. 521 00:22:18,606 --> 00:22:20,480 En nu, hier is waar dingen interessant. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Voordat ik noem Wisselen of zelfs stap in het, laten we een beetje peek. 524 00:22:26,580 --> 00:22:28,980 x is, weer 1. 525 00:22:28,980 --> 00:22:33,240 Y is natuurlijk snel verstand controleren, 2, zodat er hard. 526 00:22:33,240 --> 00:22:35,740 Maar wat is het en-teken x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Antwoord, het is soort van funky zoekt. 529 00:22:39,350 --> 00:22:43,500 Maar de int ster tussen haakjes is gewoon bbp's manier om te zeggen dit is een adres. 530 00:22:43,500 --> 00:22:48,290 Het is niet een int, het is een pointer naar een int, of ook wel bekend als een adres. 531 00:22:48,290 --> 00:22:49,742 >> Wat is dit gekke ding? 532 00:22:49,742 --> 00:22:51,825 We hebben nog nooit iets gezien heel graag dat vóór. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Dus dit is het adres in mijn computer geheugen van waar x gebeurt te leven. 535 00:22:58,120 --> 00:22:59,040 Het is Ox-iets. 536 00:22:59,040 --> 00:23:01,290 En dit is, eerlijk gezegd, waarom Ik ben begonnen met het tekenen pijlen, 537 00:23:01,290 --> 00:23:03,340 plaats van nummers, omdat die echt cares 538 00:23:03,340 --> 00:23:06,890 dat je int is op een bepaald adres dat is zo groot. 539 00:23:06,890 --> 00:23:12,160 Maar bffff0c4, het zijn allemaal inderdaad hexadecimale cijfers, 540 00:23:12,160 --> 00:23:13,720 die 0 zijn door f. 541 00:23:13,720 --> 00:23:16,590 >> Dus we zijn niet van plan om te wonen lang over wat die dingen zijn. 542 00:23:16,590 --> 00:23:19,400 Maar als ik print y, Natuurlijk zie ik 2. 543 00:23:19,400 --> 00:23:22,440 Maar ampersand y, zie ik dit adres. 544 00:23:22,440 --> 00:23:26,527 En bericht, voor de nieuwsgierigen, hoe ver zijn x en y? 545 00:23:26,527 --> 00:23:27,985 U kunt het grootste deel van het adres negeren. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Vier bytes. 548 00:23:29,920 --> 00:23:33,510 En dat is in overeenstemming met onze eerder beweren dat hoe groot is een int? 549 00:23:33,510 --> 00:23:34,130 Vier bytes. 550 00:23:34,130 --> 00:23:37,420 Zodat het lijkt alsof voering alles omhoog mooi, als je zou hopen, in het geheugen. 551 00:23:37,420 --> 00:23:40,010 >> Dus nu, laten we gewoon snel vooruit aan het einde van dit verhaal. 552 00:23:40,010 --> 00:23:43,290 Laten we verder gaan en typ stap, om te duiken in de functie Swap. 553 00:23:43,290 --> 00:23:46,880 Let nu op, als ik typ een, het is gelijk aan het adres van x. 554 00:23:46,880 --> 00:23:52,130 Als ik typ b, het is identiek aan het adres van y. 555 00:23:52,130 --> 00:23:57,020 Dus wat moet ik zien of ik zeg, ga dan naar het adres van een? 556 00:23:57,020 --> 00:23:58,120 Dus print star een. 557 00:23:58,120 --> 00:24:00,130 Dus ster betekent dat er naartoe te gaan, in deze context. 558 00:24:00,130 --> 00:24:02,730 Ampersand betekent wat is het adres van. 559 00:24:02,730 --> 00:24:05,000 Dus ster een middel 1. 560 00:24:05,000 --> 00:24:09,590 En print star b geeft me 2. 561 00:24:09,590 --> 00:24:15,750 >> En laat me nemen, voor het moment, dat althans de beveiligingscode 562 00:24:15,750 --> 00:24:18,950 gaat nu voeren kan door met redenen omkleed op die manier. 563 00:24:18,950 --> 00:24:21,150 Maar we zullen dit idee opnieuw het duurde niet lang. 564 00:24:21,150 --> 00:24:23,850 Dus deze versie van Swap nu correct en maakt 565 00:24:23,850 --> 00:24:26,650 ons voor dit specifieke type data uitwisselen. 566 00:24:26,650 --> 00:24:29,120 >> Dus vragen dan op Swap? 567 00:24:29,120 --> 00:24:29,890 Op ster? 568 00:24:29,890 --> 00:24:30,690 Op het adres van? 569 00:24:30,690 --> 00:24:33,270 En je zult zien, met probleem set 4, soort, 570 00:24:33,270 --> 00:24:37,310 maar probleem set 5, zeker, hoe deze dingen zijn nuttig en krijgt veel meer 571 00:24:37,310 --> 00:24:39,584 comfortabel met hen, als gevolg. 572 00:24:39,584 --> 00:24:40,430 Helemaal niets? 573 00:24:40,430 --> 00:24:40,930 Oke. 574 00:24:40,930 --> 00:24:44,350 Dus malloc is, nogmaals, deze functie die net wijst geheugen, het geheugen 575 00:24:44,350 --> 00:24:45,330 allocatie. 576 00:24:45,330 --> 00:24:47,024 En waarom is dit nuttig? 577 00:24:47,024 --> 00:24:48,940 Nou, al die tijd, je hebt door hiervan gebruik. 578 00:24:48,940 --> 00:24:52,230 Als je nu hoe overwegen getString werken vermoedelijk het 579 00:24:52,230 --> 00:24:56,140 gevraagd iemand voor een brok van geheugen, wanneer de gebruiker typt een string 580 00:24:56,140 --> 00:24:59,040 in, omdat we zeker wist niet, als CS50 personeel, 581 00:24:59,040 --> 00:25:02,710 hoe groot die strings die de mens zullen typen kunnen zijn. 582 00:25:02,710 --> 00:25:07,910 >> Dus laten we, voor de eerste keer, beginnen te schil terug hoe de CS50 bibliotheek werken, 583 00:25:07,910 --> 00:25:10,990 door middel van een aantal voorbeelden dat zal ons daar leiden. 584 00:25:10,990 --> 00:25:15,300 Dus als ik het openstellen gedit en open scanf 0, 585 00:25:15,300 --> 00:25:17,055 we gaan naar de volgende code te zien. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, beschikbaar op de website voor vandaag de dag, heeft relatief weinig regels code 588 00:25:23,530 --> 00:25:25,351 here, 14 tot 20. 589 00:25:25,351 --> 00:25:26,600 En laten we zien wat het doet. 590 00:25:26,600 --> 00:25:28,920 Het verklaart een int, genaamd x. 591 00:25:28,920 --> 00:25:30,850 Het zegt iets als, nummer aub. 592 00:25:30,850 --> 00:25:33,940 En nu zegt, scanf% i, & x. 593 00:25:33,940 --> 00:25:35,620 Dus er is een heleboel nieuwe dingen daar. 594 00:25:35,620 --> 00:25:38,420 >> Maar scanf, kun je soort van denken van als het tegenovergestelde van printf. 595 00:25:38,420 --> 00:25:40,090 printf natuurlijk drukken om het scherm. 596 00:25:40,090 --> 00:25:44,410 scanf soort scans van de gebruiker toetsenbord iets wat hij of zij heeft getypt. 597 00:25:44,410 --> 00:25:46,550 >> % I is net als printf. 598 00:25:46,550 --> 00:25:49,410 Dit betekent verwachten gebruiker naar een int typen. 599 00:25:49,410 --> 00:25:52,820 En nu, waarom denk je dat ik misschien passeren scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Als het doel in het leven van scanf is iets van de gebruiker te krijgen, 602 00:25:57,770 --> 00:26:02,480 wat is de betekenis van de door te geven, en x, nu? 603 00:26:02,480 --> 00:26:02,980 Yeah? 604 00:26:02,980 --> 00:26:03,896 >> PUBLIEK: [onverstaanbaar]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. MALAN: Precies. 607 00:26:06,540 --> 00:26:12,900 Wat ik, de mens, typt, mijn inbreng zal gered worden op die locatie. 608 00:26:12,900 --> 00:26:17,660 Het is niet voldoende, te herinneren, om gewoon passeren in x, omdat we al hebben gezien, 609 00:26:17,660 --> 00:26:21,630 elke keer als je langs slechts een ruwe variabele, als een int, naar een andere functie, 610 00:26:21,630 --> 00:26:25,640 zeker, het kan dat veranderen variabele, maar niet permanent. 611 00:26:25,640 --> 00:26:27,360 Het kan een effect op de Main niet hebben. 612 00:26:27,360 --> 00:26:29,420 Het kan alleen zijn eigen lokale kopie. 613 00:26:29,420 --> 00:26:32,560 Maar als je daarentegen niet geef mij de werkelijke int, 614 00:26:32,560 --> 00:26:36,640 maar je geeft me een routebeschrijving naar dat int, ik nu, dat scanf, 615 00:26:36,640 --> 00:26:41,050 zeker, kan ik volgen dat pakken en zet er een aantal 616 00:26:41,050 --> 00:26:43,280 zodat je er toegang toe hebben als goed. 617 00:26:43,280 --> 00:26:45,120 >> Dus toen ik dit programma uit te voeren, laten we eens kijken. 618 00:26:45,120 --> 00:26:49,660 Maak scanf 0 dot slash, Scanf 0. 619 00:26:49,660 --> 00:26:54,030 En als ik nu typ een nummer zoals 50, bedankt voor de 50. 620 00:26:54,030 --> 00:26:58,150 Als ik nu een getal als negatieve 1, de negatieve 1. 621 00:26:58,150 --> 00:27:04,200 Ik heb nu een getal zoals 1.5, hm. 622 00:27:04,200 --> 00:27:06,030 Waarom heeft mijn programma negeren me? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Nou, omdat simpelweg, ik vertelde het naar een int alleen verwachten. 625 00:27:09,880 --> 00:27:10,380 Oke. 626 00:27:10,380 --> 00:27:11,630 Dus dat is een versie van deze. 627 00:27:11,630 --> 00:27:16,600 Laten we de dingen nemen een inkeping en stellen dat dit niet goed is. 628 00:27:16,600 --> 00:27:20,530 En hierin ligt een heel eenvoudig voorbeeld van hoe we het schrijven van code kan beginnen 629 00:27:20,530 --> 00:27:24,450 dat andere mensen kunnen exploiteren of compromitteren door het doen van slechte dingen. 630 00:27:24,450 --> 00:27:28,336 Dus lijn 16, dus vergelijkbaar in geest vóór, 631 00:27:28,336 --> 00:27:29,960 maar ik ben niet te verklaren dat int deze tijd. 632 00:27:29,960 --> 00:27:32,970 Ik verklaar het char ster, aka string. 633 00:27:32,970 --> 00:27:35,190 >> Maar wat betekent dat eigenlijk? 634 00:27:35,190 --> 00:27:38,790 Dus als ik niet een address-- specificeren en Ik willekeurig noemde het, buffer, 635 00:27:38,790 --> 00:27:43,370 maar ik zou kunnen noemen het s, simple-- te zijn en dit dan doen ik, mij uitleggen, 636 00:27:43,370 --> 00:27:48,630 als je zou kunnen, op basis van de vorige logica, wat scanf doen op lijn 18, 637 00:27:48,630 --> 00:27:55,000 Als pas% s en buffer, dat is een adres? 638 00:27:55,000 --> 00:27:58,210 Wat is scanf, als u van toepassing zijn de exact dezelfde logica als versie 0, 639 00:27:58,210 --> 00:28:00,640 ga proberen om hier te doen, wanneer de types gebruiker iets in? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Yeah? 642 00:28:03,409 --> 00:28:04,407 >> PUBLIEK: [onverstaanbaar]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. MALAN: Precies. 645 00:28:08,890 --> 00:28:11,577 Scanf door de logica eerder gaat de string te 646 00:28:11,577 --> 00:28:13,410 dat het menselijk getypte in-- het is nu een string, 647 00:28:13,410 --> 00:28:15,790 het is niet een aantal, vermoedelijk, als hij of zij cooperates-- 648 00:28:15,790 --> 00:28:19,310 en het gaat om te proberen om dat te zetten tekenreeks in het geheugen op welk adres 649 00:28:19,310 --> 00:28:20,340 buffer specificeert. 650 00:28:20,340 --> 00:28:23,870 En dit is geweldig, omdat buffer inderdaad bedoeld om een ​​adres. 651 00:28:23,870 --> 00:28:30,470 >> Maar ik beweren dat dit programma is buggy in een zeer serieuze manier, want wat waarde is 652 00:28:30,470 --> 00:28:31,330 buffer standaard? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Wat heb ik geïnitialiseerd in? 655 00:28:34,790 --> 00:28:35,770 Welke brok van geheugen? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Ik heb niet, toch? 658 00:28:38,620 --> 00:28:42,265 >> Dus ook al heb ik toegewezen een char ster die niet meer heet s, 659 00:28:42,265 --> 00:28:48,030 het is in plaats daarvan riep, buffer-- dus laten we trekken de naam van de variabele 660 00:28:48,030 --> 00:28:53,380 nu als buffer-- als ik niet riep getString of malloc hier, 661 00:28:53,380 --> 00:28:56,030 die effectief betekent dat buffer is slechts enkele garbage waarde. 662 00:28:56,030 --> 00:28:57,030 >> Nu, wat betekent dat? 663 00:28:57,030 --> 00:29:00,220 Het betekent dat ik scanf heb verteld om een ​​string van de gebruiker verwacht. 664 00:29:00,220 --> 00:29:01,300 En weet je wat? 665 00:29:01,300 --> 00:29:03,883 Wat dit ding wijst om-- en ik teken een vraagteken, 666 00:29:03,883 --> 00:29:07,060 maar in werkelijkheid gaat het om iets als OX1, 2, 3, toch? 667 00:29:07,060 --> 00:29:10,730 Het is een aantal nep-waarde die net gebeurt er van tevoren. 668 00:29:10,730 --> 00:29:13,440 Dus met andere woorden, het is alsof buffer net 669 00:29:13,440 --> 00:29:16,180 naar iets in het geheugen. 670 00:29:16,180 --> 00:29:17,610 Ik heb geen idee wat. 671 00:29:17,610 --> 00:29:24,130 >> Dus als ik typ in Gabe nu, het gaat om te proberen om de g-a-b-e / 0 daar te zetten. 672 00:29:24,130 --> 00:29:25,530 Maar wie weet wat dat is? 673 00:29:25,530 --> 00:29:27,480 En in het verleden, elk keer dat we hebben geprobeerd aan te raken 674 00:29:27,480 --> 00:29:29,770 geheugen dat niet van voor ons, wat is er gebeurd? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Of bijna elke keer. 677 00:29:32,870 --> 00:29:34,310 Segmentatie fout, toch? 678 00:29:34,310 --> 00:29:37,829 >> Deze pijl, ik heb geen idee waar het is wijzen. het is gewoon wat willekeurige waarde. 679 00:29:37,829 --> 00:29:40,370 En natuurlijk, als je interpreteren een willekeurige waarde als een adres, 680 00:29:40,370 --> 00:29:42,610 je gaat naar wat willekeurige bestemming. 681 00:29:42,610 --> 00:29:46,810 Dus gabe zou inderdaad crash mijn programma in dit geval hier. 682 00:29:46,810 --> 00:29:50,600 >> Dus wat kunnen we doen, dat is bijna net zo erg? 683 00:29:50,600 --> 00:29:52,660 Beschouw dit derde en laatste voorbeeld van scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Deze versie is beter in welke zin? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Als u vertrouwd bent met het zijn previous probleem, dit is beter. 688 00:30:01,400 --> 00:30:02,250 Waarom? 689 00:30:02,250 --> 00:30:03,250 >> PUBLIEK: [onverstaanbaar]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. MALAN: Goed. 692 00:30:07,110 --> 00:30:09,970 Dus dit geval leiding 16 beter, in de zin 693 00:30:09,970 --> 00:30:12,030 dat we expliciet toewijzen van wat geheugen. 694 00:30:12,030 --> 00:30:14,190 We zijn niet door hiervan gebruik, we gebruiken de week 2 695 00:30:14,190 --> 00:30:16,060 aanpak waarbij slechts een array. 696 00:30:16,060 --> 00:30:18,130 En we hebben al eerder gezegd dat een string is gewoon een reeks van tekens, 697 00:30:18,130 --> 00:30:19,690 dus dit is volkomen legitiem. 698 00:30:19,690 --> 00:30:22,910 Maar het is natuurlijk, als u er rekening mee, vaste grootte, 16. 699 00:30:22,910 --> 00:30:25,440 >> Dus dit programma is volkomen veilig, als ik typ 700 00:30:25,440 --> 00:30:29,760 in een tekenreeksen, twee karakter strings, 15 tekenreeksen. 701 00:30:29,760 --> 00:30:34,970 Maar zodra ik begin te typen 16, 17, 18, 1000 tekenreeksen, 702 00:30:34,970 --> 00:30:37,390 waar is die string gaat eindigen? 703 00:30:37,390 --> 00:30:39,570 Het zal uiteindelijk deels hier. 704 00:30:39,570 --> 00:30:42,820 Maar dan wie weet wat nog meer is buiten de grenzen 705 00:30:42,820 --> 00:30:44,270 van dit matrix? 706 00:30:44,270 --> 00:30:48,015 >> Het is alsof ik heb 16 dozen hier verklaard. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Dus in plaats van te trekken uit alle 16, zullen we net doen alsof dat ik getekend heb 16. 709 00:30:52,690 --> 00:30:56,540 Maar als ik dan proberen om een ​​string te lezen dat is veel langer, zoals 50 tekens, 710 00:30:56,540 --> 00:31:01,270 Ik ga om te beginnen met het opzetten a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 En dit is vermoedelijk sommige andere geheugen-segment 712 00:31:04,916 --> 00:31:06,790 dat weer kan leiden mijn programma crasht, 713 00:31:06,790 --> 00:31:10,600 want ik heb niet gevraagd om iets meer dan 16 bytes. 714 00:31:10,600 --> 00:31:12,260 >> Dus who cares? 715 00:31:12,260 --> 00:31:13,880 Nou, hier is de CS50 bibliotheek. 716 00:31:13,880 --> 00:31:17,220 En de meeste van deze is gewoon zoals instructies boven. 717 00:31:17,220 --> 00:31:21,670 De CS50 bibliotheek, al die tijd, heeft deze regel in regel 52 had. 718 00:31:21,670 --> 00:31:23,680 We hebben typedef gezien, of je zult typedef zien 719 00:31:23,680 --> 00:31:27,930 in PSET 4, die net creëert een synoniem waarbij char ster meer kan zijn 720 00:31:27,930 --> 00:31:29,290 simpelweg aangeduid als string. 721 00:31:29,290 --> 00:31:31,540 Dit is een van de paar zijwieltjes 722 00:31:31,540 --> 00:31:34,120 we hebben in het geheim gebruikt onder de motorkap. 723 00:31:34,120 --> 00:31:36,490 >> Ondertussen, hier is de functie, getchar. 724 00:31:36,490 --> 00:31:38,190 Nu blijkbaar is er geen lichaam aan. 725 00:31:38,190 --> 00:31:40,273 En in feite, als ik blijf scrollen, dat doe ik eigenlijk niet 726 00:31:40,273 --> 00:31:42,080 zie geen implementaties van deze functies. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Als een sanity check, waarom is dat? 729 00:31:45,516 --> 00:31:46,795 >> PUBLIEK: [onverstaanbaar]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. MALAN: Ja. 731 00:31:47,670 --> 00:31:48,950 Dus dit is de header file. 732 00:31:48,950 --> 00:31:52,520 En header bestanden bevatten prototypes, plus een aantal andere dingen, zo lijkt het, 733 00:31:52,520 --> 00:31:53,780 zoals typedefs. 734 00:31:53,780 --> 00:31:56,910 Maar in CS50.c, die we hebben je nooit ronduit gegeven, 735 00:31:56,910 --> 00:32:02,100 maar is in de CS50 apparaat alle deze keer diep in de mappen 736 00:32:02,100 --> 00:32:04,990 merken dat er een hele bos van functies in hier. 737 00:32:04,990 --> 00:32:06,720 >> In feite, laten we naar beneden scrollen. 738 00:32:06,720 --> 00:32:08,810 Laten we negeren de meeste van hen, voor nu. 739 00:32:08,810 --> 00:32:12,670 Maar scroll naar beneden naar getInt en zie hoe getInt werkt. 740 00:32:12,670 --> 00:32:13,890 Dus hier is getInt. 741 00:32:13,890 --> 00:32:17,727 En als je ooit echt om hoe krijgen int werkt, hier is de documentatie. 742 00:32:17,727 --> 00:32:19,560 En onder de dingen het zegt is het u vertelt 743 00:32:19,560 --> 00:32:21,340 wat de reeksen van waarden kan terugkeren. 744 00:32:21,340 --> 00:32:24,400 Het is in wezen negatief 2000000000 om positieve 2 miljard, geven of nemen. 745 00:32:24,400 --> 00:32:26,420 >> En het blijkt, dit alles tijd, ook al hebben we nog nooit 746 00:32:26,420 --> 00:32:28,570 had u controleren op het, als er iets misgaat, 747 00:32:28,570 --> 00:32:30,680 het blijkt dat alle deze keer getInt heeft 748 00:32:30,680 --> 00:32:33,600 terug te keren speciale constant, niet nul, 749 00:32:33,600 --> 00:32:36,760 maar INT_MAX, die conventie slechts een programmeur. 750 00:32:36,760 --> 00:32:38,846 Het betekent dat hier een bijzondere waarde. 751 00:32:38,846 --> 00:32:41,470 Zorg ervoor om te controleren of deze, net in het geval er iets misgaat. 752 00:32:41,470 --> 00:32:43,261 Maar we hebben nooit de moeite genomen met dat tot op heden, 753 00:32:43,261 --> 00:32:45,200 want nogmaals, dit is bedoeld te vereenvoudigen. 754 00:32:45,200 --> 00:32:46,950 >> Maar hoe werkt getInt krijgen geïmplementeerd? 755 00:32:46,950 --> 00:32:48,450 Nou ja, een, het heeft geen argumenten. 756 00:32:48,450 --> 00:32:49,390 We weten dat. 757 00:32:49,390 --> 00:32:50,820 Het geeft een int. 758 00:32:50,820 --> 00:32:51,950 We weten dat. 759 00:32:51,950 --> 00:32:54,460 Dus hoe werkt het onder de motorkap? 760 00:32:54,460 --> 00:32:58,290 >> Dus er is blijkbaar een oneindige lus, ten minste erop lijken. 761 00:32:58,290 --> 00:33:00,290 Merk op dat we gebruiken getString. 762 00:33:00,290 --> 00:33:04,000 Dus dat is interessant. getInt noemt onze eigen functie, getString. 763 00:33:04,000 --> 00:33:05,645 En nu, wat zou dit het geval zijn? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Waarom ben ik defensief here in lijn 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Wat er kan gebeuren in de lijn 164, voor de duidelijkheid? 768 00:33:15,639 --> 00:33:16,930 Het is hetzelfde antwoord als voorheen. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Misschien wel uit het geheugen. 771 00:33:20,089 --> 00:33:23,130 Er iets mis gaat met getString, we moeten in staat zijn om te behandelen dat. 772 00:33:23,130 --> 00:33:27,070 En de reden dat ik niet terug null is dat, technisch gezien, null is een pointer. 773 00:33:27,070 --> 00:33:29,120 getInt moet een int terug. 774 00:33:29,120 --> 00:33:31,060 Dus ik heb willekeurig besloten, in wezen, 775 00:33:31,060 --> 00:33:34,600 dat 2 miljard, geven of te nemen, gaat een bijzondere waarde zijn, dat kan ik nooit 776 00:33:34,600 --> 00:33:35,970 daadwerkelijk te krijgen van de gebruiker. 777 00:33:35,970 --> 00:33:39,930 Het is gewoon de ene waarde ik ga te verspillen om een ​​foutcode te vertegenwoordigen. 778 00:33:39,930 --> 00:33:41,540 >> Dus nu, dingen een beetje fantasie. 779 00:33:41,540 --> 00:33:44,670 En het is niet helemaal dezelfde functie als voorheen, maar het is zeer vergelijkbaar. 780 00:33:44,670 --> 00:33:50,120 Dus merken, verklaar ik hier, in lijn 172, beide een int n en een char c. 781 00:33:50,120 --> 00:33:53,600 En dan dit funky lijn gebruik ik, sscanf, dat blijkt 782 00:33:53,600 --> 00:33:55,990 scant niet een string van het toetsenbord. 783 00:33:55,990 --> 00:33:59,226 Het staat een bestaande string die de gebruiker al heeft getypt. 784 00:33:59,226 --> 00:34:02,100 Dus ik al getString, genaamd die betekent dat ik een string in het geheugen. 785 00:34:02,100 --> 00:34:05,020 sscanf is wat je zou bel een parsing functie. 786 00:34:05,020 --> 00:34:07,760 Er wordt gekeken naar de string Ik heb ingetypt, teken voor teken, 787 00:34:07,760 --> 00:34:09,250 en doet iets nuttigs. 788 00:34:09,250 --> 00:34:10,969 Deze reeks wordt opgeslagen in lijn. 789 00:34:10,969 --> 00:34:13,560 En ik weet dat alleen door te gaan een back-up hier en zeggen: oh, OK, 790 00:34:13,560 --> 00:34:15,143 Ik noemde het niet en deze keer, maar lijn. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> En nu dit is een beetje anders. 793 00:34:18,080 --> 00:34:22,480 Maar dit in feite betekent, om redenen we enigszins zwaaien handen om vandaag, 794 00:34:22,480 --> 00:34:26,070 dat we de controle te of de gebruiker getypt 795 00:34:26,070 --> 00:34:29,909 en int en misschien een ander karakter. 796 00:34:29,909 --> 00:34:33,610 Als de gebruiker heeft ingevoerd in een int, is het zal worden opgeslagen in n, omdat ik 797 00:34:33,610 --> 00:34:36,739 langs deze op adres, de nieuwe truc die we hebben gezien vandaag. 798 00:34:36,739 --> 00:34:41,570 Als de gebruiker ook getypt in als 123x, dat x 799 00:34:41,570 --> 00:34:45,060 gaat uiteindelijk een brief in teken c. 800 00:34:45,060 --> 00:34:48,739 >> Nu blijkt dat sscanf zal mij zeggen, intelligent, 801 00:34:48,739 --> 00:34:54,750 hoeveel variabelen werd sscanf succesvol kunnen vullen. 802 00:34:54,750 --> 00:34:58,770 Dus deze logica, als de functie Ik uitvoering wordt getInt, 803 00:34:58,770 --> 00:35:00,900 maar ik ben het controleren, potentieel voor de gebruiker 804 00:35:00,900 --> 00:35:04,190 in een int te hebben getypt gevolgd door iets anders, 805 00:35:04,190 --> 00:35:08,580 wat wil ik sscanf's return waarde echt te zijn? 806 00:35:08,580 --> 00:35:10,950 Als het doel is om gewoon een int van de gebruiker? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Dus als sscanf rendement 2, wat betekent dat? 809 00:35:19,300 --> 00:35:21,660 De gebruiker heeft ingevoerd in iets als, letterlijk, 810 00:35:21,660 --> 00:35:24,770 123x, dat is gewoon onzin. 811 00:35:24,770 --> 00:35:27,490 Het is een fout, en Ik wil controleren dat. 812 00:35:27,490 --> 00:35:32,960 >> Als de gebruiker dit type in, door deze logica, wat doet sscanf terugkeren, 813 00:35:32,960 --> 00:35:33,740 zou je dan zeggen? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Dus het gaat om terug te keren 2, omdat de 123 gaat hier naar binnen gaan, 816 00:35:39,130 --> 00:35:41,580 en de x gaat eindigen in hier. 817 00:35:41,580 --> 00:35:43,970 Maar ik wil niet dat de x om te laten vullen. 818 00:35:43,970 --> 00:35:48,580 Ik wil sscanf alleen slagen in vullen van de eerste van de variabelen. 819 00:35:48,580 --> 00:35:52,490 En dat is dus de reden waarom ik willen sscanf om terug te keren 1. 820 00:35:52,490 --> 00:35:55,750 >> En als dit een beetje over het hoofd voor het moment, dat is helemaal prima. 821 00:35:55,750 --> 00:36:00,030 Realiseer je echter dat een van de waarden van getInt en getString 822 00:36:00,030 --> 00:36:03,630 is dat we doen een deurklink van een Veel foutcontrole als dit zo 823 00:36:03,630 --> 00:36:07,130 dat tot op heden, kan je vrij veel typt iets op je toetsenbord, 824 00:36:07,130 --> 00:36:08,490 en wij zullen het op te vangen. 825 00:36:08,490 --> 00:36:10,592 En we hebben zeker de personeel, zal zeker niet 826 00:36:10,592 --> 00:36:13,300 als bron van een bug in de programma, omdat we defensief 827 00:36:13,300 --> 00:36:16,270 het controleren van alle van de domme dingen die een gebruiker zou kunnen doen, 828 00:36:16,270 --> 00:36:18,900 zoals het typen van een koord, wanneer je echt wilde int. 829 00:36:18,900 --> 00:36:21,350 Dus voor nu-- we komen terug naar deze vóór long-- 830 00:36:21,350 --> 00:36:23,710 maar deze tijd, getString en getInt hebben 831 00:36:23,710 --> 00:36:29,950 onder de kap met deze geweest basisidee van adressen van geheugen. 832 00:36:29,950 --> 00:36:32,580 >> Dus nu, laten we de dingen een weinig meer gebruiksvriendelijk. 833 00:36:32,580 --> 00:36:38,740 Zoals u zich wellicht herinnert, van Binky laatste tijd-- als mijn muis zal dus cooperate-- 834 00:36:38,740 --> 00:36:42,560 we hadden deze code, die eerlijk gezegd, is tamelijk onzinnig. 835 00:36:42,560 --> 00:36:45,330 Deze code haalt niets nuttig, maar het was het voorbeeld 836 00:36:45,330 --> 00:36:48,330 dat professor Parlante gebruikt om te vertegenwoordigen 837 00:36:48,330 --> 00:36:51,840 wat er gaande was in een programma met het geheugen. 838 00:36:51,840 --> 00:36:54,850 >> Dus laten we dit navertellen verhaal super kort. 839 00:36:54,850 --> 00:36:58,720 Deze eerste twee regels, in Engels, doe wat, zou je dan zeggen? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Gewoon in redelijk mens, maar enigszins technische termen, neem een ​​steek. 842 00:37:05,430 --> 00:37:06,346 PUBLIEK: [onverstaanbaar]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. MALAN: OK, je bent tot oprichting van adressen voor x en y variabelen. 845 00:37:11,080 --> 00:37:15,520 Niet helemaal omdat x en y niet variabelen in de traditionele betekenis. 846 00:37:15,520 --> 00:37:18,054 x en y adressen of zal het adres op te slaan. 847 00:37:18,054 --> 00:37:19,220 Dus laten we proberen dit eens te meer. 848 00:37:19,220 --> 00:37:21,010 Geen slecht begin, dat wel. 849 00:37:21,010 --> 00:37:21,510 Yeah? 850 00:37:21,510 --> 00:37:22,426 >> PUBLIEK: [onverstaanbaar]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. MALAN: Goed. 853 00:37:24,840 --> 00:37:26,173 Ik denk dat dat een beetje schoner. 854 00:37:26,173 --> 00:37:28,630 Verklaren van twee pointers, twee gehele getallen. 855 00:37:28,630 --> 00:37:30,150 En we bellen ze x en y. 856 00:37:30,150 --> 00:37:32,790 Of als we waren te stellen dit als een foto, weer, 857 00:37:32,790 --> 00:37:36,410 herinneren simpelweg dat alle we doen met die eerste lijn 858 00:37:36,410 --> 00:37:39,690 is het tekenen van een doos als deze, met garbage waarde in, 859 00:37:39,690 --> 00:37:41,920 en noemde het x, en dan een andere doos als dit, 860 00:37:41,920 --> 00:37:43,880 met garbage waarde in het, noemde het y. 861 00:37:43,880 --> 00:37:45,810 We hebben verklaard twee pointers die uiteindelijk 862 00:37:45,810 --> 00:37:47,860 het adres van een int slaan. 863 00:37:47,860 --> 00:37:49,170 Dus dat is er allemaal. 864 00:37:49,170 --> 00:37:53,290 >> Dus toen Binky deed dit, de klei net zo uitzag. 865 00:37:53,290 --> 00:37:55,350 En Nick gewoon een soort van verpakt de pijlen, 866 00:37:55,350 --> 00:37:57,590 alsof ze nergens te wijzen in het bijzonder, want ze zijn gewoon 867 00:37:57,590 --> 00:37:58,250 garbage waarden. 868 00:37:58,250 --> 00:38:01,670 Ze zijn niet expliciet geïnitialiseerd overal in het bijzonder. 869 00:38:01,670 --> 00:38:03,980 >> Nu de volgende regel code, recall, was dit. 870 00:38:03,980 --> 00:38:07,510 Dus in redelijk gebruiksvriendelijk, maar enigszins technisch Engels, 871 00:38:07,510 --> 00:38:09,790 wat is deze regel code aan het doen? 872 00:38:09,790 --> 00:38:10,391 Yeah? 873 00:38:10,391 --> 00:38:11,333 >> PUBLIEK: [onverstaanbaar]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. MALAN: Perfect. 876 00:38:13,950 --> 00:38:17,016 Het toewijzen van de brok van de geheugen dat is de grootte van een int. 877 00:38:17,016 --> 00:38:18,140 En dat is de helft van het antwoord. 878 00:38:18,140 --> 00:38:20,056 U antwoordde de rechter helft van de expressie. 879 00:38:20,056 --> 00:38:22,473 Wat er gebeurt op de linkerkant van het gelijk-teken? 880 00:38:22,473 --> 00:38:22,972 Yeah? 881 00:38:22,972 --> 00:38:24,814 PUBLIEK: En rechtverkrijgenden het aan de variabele x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. MALAN: En rechtverkrijgenden aan de variabele x. 883 00:38:27,690 --> 00:38:31,650 Dus om samen te vatten, rechterzijde toewijst voldoende geheugen om een ​​int slaan. 884 00:38:31,650 --> 00:38:34,150 Maar malloc specifiek geeft het adres 885 00:38:34,150 --> 00:38:37,270 van dat deel van het geheugen, die je hebt net voorgesteld wordt opgeslagen in x. 886 00:38:37,270 --> 00:38:42,560 >> Dus wat Nick deed de vorige keer met Binky is hij sleepte die wijzer uit, de klei, 887 00:38:42,560 --> 00:38:46,820 Tot nu toe wijzen op een wit stuk van het geheugen die gelijk is aan de grootte van een int. 888 00:38:46,820 --> 00:38:49,360 En inderdaad, dat is bedoeld vier bytes vertegenwoordigen. 889 00:38:49,360 --> 00:38:55,310 >> Nu, de volgende regel code dit deed, ster x krijgt 42. 890 00:38:55,310 --> 00:38:58,530 Dus 42 is eenvoudig op de rechterzijde, betekenis van het leven. 891 00:38:58,530 --> 00:39:00,500 Linkerkant, ster x betekent wat? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Ook dat zou kunnen hebben gone-- dat is OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> PUBLIEK: In principe, ga naar de [onverstaanbaar] 896 00:39:06,875 --> 00:39:07,750 DAVID J. MALAN: Goed. 897 00:39:07,750 --> 00:39:08,760 PUBLIEK: [onverstaanbaar]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. MALAN: Precies. 899 00:39:09,760 --> 00:39:11,979 Linkerkant betekent ga naar x. 900 00:39:11,979 --> 00:39:12,520 x is het adres. 901 00:39:12,520 --> 00:39:15,520 Het is net als 33 Oxford Street, of OX1. 902 00:39:15,520 --> 00:39:18,690 En ster x betekent naar die aan te pakken en zetten wat daar? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Dus inderdaad, dat is precies wat Nick deed. 905 00:39:21,290 --> 00:39:23,740 Hij begon met door, wezen, mentaal 906 00:39:23,740 --> 00:39:26,270 wijst een vinger naar x, na de pijl 907 00:39:26,270 --> 00:39:30,670 naar de witte doos op de rechter kant, en zetten het nummer 42 er. 908 00:39:30,670 --> 00:39:34,120 Maar toen kreeg de dingen een beetje gevaarlijk, toch? 909 00:39:34,120 --> 00:39:35,860 Binky's over zijn hoofd te verliezen. 910 00:39:35,860 --> 00:39:39,465 >> Star y is gelijk aan 13, pech, betekent wat? 911 00:39:39,465 --> 00:39:43,620 Dus ster y middelen gaan naar het adres in y. 912 00:39:43,620 --> 00:39:45,630 Maar wat is het adres in y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Oke, het is garbage waarde, toch? 915 00:39:49,440 --> 00:39:50,800 Ik trok het als een vraagteken. 916 00:39:50,800 --> 00:39:54,850 Nick trok het als een opgerold pijl. 917 00:39:54,850 --> 00:39:59,600 En zodra je probeert te doen ster y, zeggen ga er, 918 00:39:59,600 --> 00:40:03,872 maar er is geen legitieme adres, het is een nep-locatie, 919 00:40:03,872 --> 00:40:05,080 het programma gaat crashen. 920 00:40:05,080 --> 00:40:08,580 En Binky's hoofd gaat om hier weg te vliegen, zoals zij heeft gedaan. 921 00:40:08,580 --> 00:40:12,130 >> Dus op het einde, dit programma was ronduit fout. 922 00:40:12,130 --> 00:40:13,540 Het was een buggy programma. 923 00:40:13,540 --> 00:40:14,760 En het moest worden opgelost. 924 00:40:14,760 --> 00:40:18,260 En de enige manier, echt, om het te repareren zou bijvoorbeeld deze regel, 925 00:40:18,260 --> 00:40:21,010 die we niet eens aan, omdat het programma crashte te vroeg. 926 00:40:21,010 --> 00:40:26,170 Maar als we dit op te lossen, wat effect heeft doen y gelijk x hebben? 927 00:40:26,170 --> 00:40:30,010 Nou, het wijst in wezen y op welke waarde x wijst. 928 00:40:30,010 --> 00:40:32,430 >> Dus in Nick's verhaal, of Binky's verhaal, zowel 929 00:40:32,430 --> 00:40:34,640 x en y werden wijzend op het witte deel van het geheugen, 930 00:40:34,640 --> 00:40:38,300 zo dat, ten slotte, wanneer u denk ster y is gelijk aan 13 weer, 931 00:40:38,300 --> 00:40:43,080 je uiteindelijk zetten 13 in de juiste locatie. 932 00:40:43,080 --> 00:40:47,640 Dus al deze lijnen zijn perfect legitiem, behalve deze ene, 933 00:40:47,640 --> 00:40:51,730 toen het gebeurde voordat u werkelijk toegekende y een waarde. 934 00:40:51,730 --> 00:40:54,290 >> Nu gelukkig, je doet niet moeten redeneren door alle 935 00:40:54,290 --> 00:40:56,560 van dit soort problemen op uw eigen. 936 00:40:56,560 --> 00:40:59,310 Laat me gaan en openen een terminal-venster hier 937 00:40:59,310 --> 00:41:03,050 en open te stellen, voor een ogenblik, een super kort programma dat 938 00:41:03,050 --> 00:41:04,360 Ook is een soort van zinloos. 939 00:41:04,360 --> 00:41:05,152 Het is lelijk. 940 00:41:05,152 --> 00:41:06,610 Het hoeft niet iets nuttigs te bereiken. 941 00:41:06,610 --> 00:41:10,180 Maar het toont wel aan problemen van het geheugen, dus laten we een kijkje nemen. 942 00:41:10,180 --> 00:41:11,830 >> Belangrijkste, super eenvoudig. 943 00:41:11,830 --> 00:41:14,830 Het roept blijkbaar een functie, f, en dan is het resultaat 0. 944 00:41:14,830 --> 00:41:16,310 Het is een beetje moeilijk te verpesten. 945 00:41:16,310 --> 00:41:18,540 Dus Hoofd is vrij goed, tot nu toe. 946 00:41:18,540 --> 00:41:20,100 >> Dus f is problematisch. 947 00:41:20,100 --> 00:41:22,120 En gewoon niet veel zetten inspanning in het benoemen van het 948 00:41:22,120 --> 00:41:23,990 hier, om de focus op de code te houden. 949 00:41:23,990 --> 00:41:25,740 f heeft twee lijnen. 950 00:41:25,740 --> 00:41:27,610 En laten we eens kijken wat er nu gaande is. 951 00:41:27,610 --> 00:41:29,840 Dus enerzijds hier-- en laat me 952 00:41:29,840 --> 00:41:32,680 Dit strookt met de vorige example-- enerzijds, 953 00:41:32,680 --> 00:41:35,830 de linkerkant is doet wat, in het Engels? 954 00:41:35,830 --> 00:41:36,493 Het is-- 955 00:41:36,493 --> 00:41:37,701 Publiek: Het creëren van een pointer. 956 00:41:37,701 --> 00:41:40,830 DAVID J. MALAN: Het maken van een pointer naar een int en noemde het x. 957 00:41:40,830 --> 00:41:43,789 Dus het is het creëren van een van die dozen Ik blijf het tekenen op het aanraakscherm. 958 00:41:43,789 --> 00:41:45,913 En nu, op de rechter zijde malloc natuurlijk 959 00:41:45,913 --> 00:41:47,420 wordt de toewijzing van een deel van het geheugen. 960 00:41:47,420 --> 00:41:49,989 En alleen maar om duidelijk te zijn, hoe veel geheugen is het blijkbaar 961 00:41:49,989 --> 00:41:52,030 toewijzen, als je gewoon soort van de wiskunde hier? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Dus het is 40 bytes. 964 00:41:54,040 --> 00:41:57,400 En ik weet dat alleen omdat ik weet dat een int op CS50 apparaat tenminste 965 00:41:57,400 --> 00:41:58,060 vier bytes. 966 00:41:58,060 --> 00:41:59,610 Dus 10 keer 4 is 40. 967 00:41:59,610 --> 00:42:04,924 Dus dit is het opslaan van een x, het adres van de eerste van de 40 ints dat 968 00:42:04,924 --> 00:42:07,340 zijn toegewezen ruimte terug, naar achter, naar achter, naar achteren. 969 00:42:07,340 --> 00:42:08,470 >> En dat is wat er sleutel over malloc. 970 00:42:08,470 --> 00:42:11,261 Het hoeft niet een beetje geheugen nemen hier, een beetje hier, een beetje hier. 971 00:42:11,261 --> 00:42:14,220 Het geeft je een stuk van het geheugen, aansluitend, van de operationele 972 00:42:14,220 --> 00:42:15,240 systeem. 973 00:42:15,240 --> 00:42:18,500 >> Nu wat over deze, x beugel 10 is gelijk aan 0? 974 00:42:18,500 --> 00:42:19,470 Arbitraire regel code. 975 00:42:19,470 --> 00:42:21,100 Het hoeft niet iets nuttigs te bereiken. 976 00:42:21,100 --> 00:42:26,128 Maar het is interessant, omdat x beugel 10--? 977 00:42:26,128 --> 00:42:26,628 Yeah? 978 00:42:26,628 --> 00:42:27,912 >> PUBLIEK: [onverstaanbaar]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. MALAN: x beugel 10 hoeft niet nul te zijn. 980 00:42:30,500 --> 00:42:35,070 De null detail komt pas in het spel strijkers aan het einde van een koord. 981 00:42:35,070 --> 00:42:36,700 Maar een goede gedachte. 982 00:42:36,700 --> 00:42:39,615 >> Hoe groot is deze array, zelfs hoewel ik 40 bytes heb toegewezen? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Het is 0 tot en met negen, toch? 985 00:42:43,690 --> 00:42:45,120 Het is 10 ints, totaal. 986 00:42:45,120 --> 00:42:48,790 40 bytes, maar 10 ints, geïndexeerd 0 tot 0. 987 00:42:48,790 --> 00:42:50,930 >> Dus wat is dat x beugel 10? 988 00:42:50,930 --> 00:42:53,090 Het is eigenlijk een aantal onbekend garbage waarde. 989 00:42:53,090 --> 00:42:54,780 Het is het geheugen dat niet van mij. 990 00:42:54,780 --> 00:42:59,650 Ik moet niet te raken dat byte nummer 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Ik ben een beetje te ver gaan. 992 00:43:01,420 --> 00:43:04,490 >> En inderdaad, als ik zonder deze programma, kan het heel goed crashen. 993 00:43:04,490 --> 00:43:05,790 Maar soms hebben we geluk. 994 00:43:05,790 --> 00:43:07,706 En dus gewoon om aan te tonen dit-- en eerlijk gezegd, 995 00:43:07,706 --> 00:43:11,000 je weet maar nooit voordat u denk het-- laten we dit uit te voeren. 996 00:43:11,000 --> 00:43:12,480 Het maakte eigenlijk niet crashen. 997 00:43:12,480 --> 00:43:15,032 >> Maar als ik dit wijzigen voor Zo zijn zoals 1000, 998 00:43:15,032 --> 00:43:16,740 om dit echt te maken weloverwogen, laten we eens kijken 999 00:43:16,740 --> 00:43:18,710 als we kunnen krijgen om deze tijd te crashen. 1000 00:43:18,710 --> 00:43:20,070 OK, het niet crashen. 1001 00:43:20,070 --> 00:43:22,600 Hoe zit het met 100.000? 1002 00:43:22,600 --> 00:43:25,000 Laten we remake, en nu start het opnieuw op. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Oef. 1005 00:43:25,960 --> 00:43:26,460 Oke. 1006 00:43:26,460 --> 00:43:29,090 Dus lijkt, weer, deze segmenten geheugen zogezegd, 1007 00:43:29,090 --> 00:43:32,660 zijn redelijk groot, dus we kunnen krijgen opnieuw en opnieuw geluk. 1008 00:43:32,660 --> 00:43:36,510 Maar uiteindelijk, als je eenmaal belachelijk krijgen en echt ver uit op het scherm, 1009 00:43:36,510 --> 00:43:39,120 u het geheugen aanraakt dat echt, echt niet van jou is. 1010 00:43:39,120 --> 00:43:40,870 >> Maar eerlijk gezegd, deze allerlei bugs gaan 1011 00:43:40,870 --> 00:43:43,020 harder en harder om erachter te komen op uw eigen. 1012 00:43:43,020 --> 00:43:47,880 Maar gelukkig, zoals programmeurs, hebben we tools die ons toelaten om dit voor ons te doen. 1013 00:43:47,880 --> 00:43:50,140 Dus dit is misschien een van de lelijkste programma's, 1014 00:43:50,140 --> 00:43:52,060 nog lelijker dan uitgang gdb's. 1015 00:43:52,060 --> 00:43:55,670 Maar het heeft altijd een lijn of twee die super nuttig. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind is een programma dat helpt niet debuggen programma, zodanig, 1017 00:44:00,310 --> 00:44:03,500 maar vind het geheugen-gerelateerde problemen bijzonder. 1018 00:44:03,500 --> 00:44:07,590 Het zal automatisch uw code uit te voeren voor u en op zoek naar ten minste twee dingen. 1019 00:44:07,590 --> 00:44:10,680 Een, heb je iets te doen ongeluk zoals aanraking geheugen 1020 00:44:10,680 --> 00:44:11,980 dat niet van jou is? 1021 00:44:11,980 --> 00:44:13,590 Het zal u helpen vinden die gevallen. 1022 00:44:13,590 --> 00:44:15,710 >> En twee, zal het helpen je iets genaamd vinden 1023 00:44:15,710 --> 00:44:19,270 memory leaks, die we hebben volledig genegeerd, naïef, 1024 00:44:19,270 --> 00:44:21,380 voor enige tijd en zalig. 1025 00:44:21,380 --> 00:44:23,140 Maar het blijkt, alle deze keer wanneer 1026 00:44:23,140 --> 00:44:26,620 je getString in moeten bellen zo veel van onze programma's, 1027 00:44:26,620 --> 00:44:28,930 U bent de operationele vragen voor geheugen, 1028 00:44:28,930 --> 00:44:32,070 maar je moet elke herinnering van ooit waardoor het 1029 00:44:32,070 --> 00:44:36,169 terug, doet UNALLOC, of gratis, zoals dat heet. 1030 00:44:36,169 --> 00:44:37,960 Nee, want we hebben nooit gevraagd om dit te doen. 1031 00:44:37,960 --> 00:44:41,250 >> Maar al die tijd, de programma's heb je geschreven in C 1032 00:44:41,250 --> 00:44:43,800 zijn lekkende geheugen, het stellen van de operationele 1033 00:44:43,800 --> 00:44:46,190 systeem voor meer en meer geheugen voor strijkers en wat al niet, 1034 00:44:46,190 --> 00:44:47,870 maar nooit inlevert terug. 1035 00:44:47,870 --> 00:44:50,080 En nu is dit een beetje van een oversimplificatie, 1036 00:44:50,080 --> 00:44:53,550 maar als je ooit hebt draaien op je Mac of uw pc al geruime tijd, opening 1037 00:44:53,550 --> 00:44:55,790 veel programma's, misschien is het sluiten van programma's, 1038 00:44:55,790 --> 00:44:57,795 en zelfs al is uw computer is niet gecrasht, 1039 00:44:57,795 --> 00:45:01,690 het wordt zo veel langzamer, alsof het is echt 1040 00:45:01,690 --> 00:45:04,290 met veel geheugen of middelen, hoewel, 1041 00:45:04,290 --> 00:45:06,070 als je niet eens aanraken van het toetsenbord, 1042 00:45:06,070 --> 00:45:10,430 dat kan be-- maar niet always-- konden zijn dat de programma's die je draait 1043 00:45:10,430 --> 00:45:11,920 hebben zelf memory leaks. 1044 00:45:11,920 --> 00:45:15,645 En ze blijven vragen van de OS voor meer en meer geheugen, maar vergeet het, 1045 00:45:15,645 --> 00:45:18,470 eigenlijk niet te gebruiken, maar Daarom nemen geheugen weg 1046 00:45:18,470 --> 00:45:20,500 vanuit andere programma's zou willen dat het. 1047 00:45:20,500 --> 00:45:23,940 Dus dat is een gemeenschappelijke verklaring. 1048 00:45:23,940 --> 00:45:25,940 Nu hier is waar Valgrind's output volledig 1049 00:45:25,940 --> 00:45:29,290 afschuwelijk om die minder en comfortabeler gelijk. 1050 00:45:29,290 --> 00:45:32,690 Maar het interessante spul is hier rechts boven. 1051 00:45:32,690 --> 00:45:37,060 Het is me te vertellen een ongeldige schrijven van grootte vier gebeurt in dit programma, 1052 00:45:37,060 --> 00:45:40,640 in het bijzonder, op regel 21 van memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Als ik ga naar lijn 21, hm, er inderdaad is een ongeldig schrijven van grootte vier. 1054 00:45:45,450 --> 00:45:46,250 Waarom grootte vier? 1055 00:45:46,250 --> 00:45:49,500 Nou, dit number-- en het anything-- zou kunnen zijn is een int. 1056 00:45:49,500 --> 00:45:50,450 Dus het is vier bytes. 1057 00:45:50,450 --> 00:45:52,550 Dus ik ben om vier bytes waar ze niet thuishoren. 1058 00:45:52,550 --> 00:45:55,080 Dat is wat Valgrind is me eigenlijk te vertellen. 1059 00:45:55,080 --> 00:45:57,600 Bovendien zal ook vertel me, zoals we zullen zien, 1060 00:45:57,600 --> 00:46:01,490 als je dit uitvoeren in een toekomstige PSET, indien en als je hebt gelekt geheugen, dat inderdaad 1061 00:46:01,490 --> 00:46:05,300 Ik heb, want ik heb genoemd malloc, maar ik heb niet echt 1062 00:46:05,300 --> 00:46:08,010 genoemd, in dit geval, vrij, waar we uiteindelijk zien 1063 00:46:08,010 --> 00:46:09,830 is het tegenovergestelde van malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Dus nu, denk ik, een laatste voorbeeld. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Dus dit is een beetje meer geheimzinnige, maar het is misschien 1068 00:46:16,690 --> 00:46:19,180 de belangrijkste reden Wees voorzichtig met het geheugen, 1069 00:46:19,180 --> 00:46:24,490 en de reden dat vele programma en / of webservers, zelfs tot op de dag, 1070 00:46:24,490 --> 00:46:28,200 worden overgenomen door slechteriken ergens op het internet die ergens 1071 00:46:28,200 --> 00:46:33,390 het verzenden van valse pakketten naar uw server proberen om uw rekeningen compromis, 1072 00:46:33,390 --> 00:46:36,420 of neem uw gegevens, of gewoon algemeen gedurende een zekere machine. 1073 00:46:36,420 --> 00:46:38,910 Buffer overflow, zoals de naam al doet vermoeden, middelen 1074 00:46:38,910 --> 00:46:40,740 overlopen geen int, maar een buffer. 1075 00:46:40,740 --> 00:46:43,490 En een buffer is gewoon een mooie manier om te zeggen het is een stelletje van het geheugen. 1076 00:46:43,490 --> 00:46:46,710 >> En inderdaad, ik belde een string voordat buffer, in plaats van s. 1077 00:46:46,710 --> 00:46:49,234 Want als het een buffer, net als in de YouTube zin, 1078 00:46:49,234 --> 00:46:52,400 of wanneer je aan het kijken bent een video, je zou het woord buffering hebben gezien, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, dot. 1080 00:46:53,040 --> 00:46:54,240 Het is ongelooflijk vervelend. 1081 00:46:54,240 --> 00:46:55,990 En dat betekent dat je videospeler 1082 00:46:55,990 --> 00:46:58,710 probeert om veel te downloaden bytes, veel bytes 1083 00:46:58,710 --> 00:47:00,170 van een video van het internet. 1084 00:47:00,170 --> 00:47:02,920 Maar het is traag, dus het is het proberen om een ​​bos van hen te downloaden 1085 00:47:02,920 --> 00:47:06,430 een buffer, een container, zodat vullen je hebt genoeg bytes dat het kan dan 1086 00:47:06,430 --> 00:47:09,174 tonen u de video, zonder te pauzeren voortdurend. 1087 00:47:09,174 --> 00:47:11,340 Maar het blijkt, je kan een buffer om zo groot. 1088 00:47:11,340 --> 00:47:15,710 Maar probeer dit zoveel data in te zetten het, en zeer slechte dingen kunnen gebeuren. 1089 00:47:15,710 --> 00:47:22,780 Dus bijvoorbeeld, laten we eens kijken naar deze laatste teaser een voorbeeld. 1090 00:47:22,780 --> 00:47:24,720 Dit is een ander programma die, op het eerste gezicht, 1091 00:47:24,720 --> 00:47:26,540 doet niets super handig doen. 1092 00:47:26,540 --> 00:47:29,590 Het heeft een Hoofd functie dat noemt die functie, f. 1093 00:47:29,590 --> 00:47:36,640 En die functie, f, hier, heeft een char array, genaamd c, van maat 12. 1094 00:47:36,640 --> 00:47:39,340 En dan is het gebruik van dit nieuwe functie genaamd strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Het blijkt dat met deze eenvoudige, eenvoudige regel code, slechts twee lijnen, 1097 00:47:45,190 --> 00:47:49,130 we hebben mijn hele programma gemaakt, en daarom, mijn hele computer, 1098 00:47:49,130 --> 00:47:54,000 en mijn gebruikersaccount, en mijn harde rijden mogelijk kwetsbaar voor iedereen 1099 00:47:54,000 --> 00:47:58,170 die weet en goed genoeg draaien dit programma een bepaald opdrachtregel 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 Met andere woorden, als deze slechte guy zet binnenkant van argvargv [1] door te typen 1102 00:48:03,400 --> 00:48:08,750 op het toetsenbord van een zeer speciaal vervaardigd koord, niet abc, 123, maar in wezen, 1103 00:48:08,750 --> 00:48:15,180 binaire symbolen die uitvoerbare vertegenwoordigen code, een programma dat hij of zij schreef, 1104 00:48:15,180 --> 00:48:19,190 met dit eenvoudig programma, dat vertegenwoordiger van duizenden programma 1105 00:48:19,190 --> 00:48:23,610 die zijn eveneens kwetsbaar zijn, durf te zeggen, hij kan uiteindelijk Wissen 1106 00:48:23,610 --> 00:48:26,680 de bestanden op mijn harde schijf, krijgen een knipperende prompt zodat hij of zij kan 1107 00:48:26,680 --> 00:48:30,170 typen commando's op hun eigen, e-mail van alle bestanden bij mezelf. 1108 00:48:30,170 --> 00:48:34,660 Alles wat ik kan doen, hij of ze kan doen met deze code. 1109 00:48:34,660 --> 00:48:36,575 >> We zullen nog niet helemaal dit op te lossen. 1110 00:48:36,575 --> 00:48:38,700 En in feite gaat het om betrekken een kleine afbeelding 1111 00:48:38,700 --> 00:48:41,470 als dit, waar we zullen snel komen alle beter te begrijpen. 1112 00:48:41,470 --> 00:48:44,480 Maar voor vandaag, laten we eindigen op wat is er, hopelijk, een iets meer 1113 00:48:44,480 --> 00:48:48,360 begrijpelijk XKCD grap, tot we weer de volgende keer. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Oke. 1116 00:48:51,600 --> 00:48:53,446 Tot ziens op woensdag. 1117 00:48:53,446 --> 00:48:54,754 >> [Muziek] 1118 00:48:54,754 --> 00:48:57,790 >> Spreker: En nu, diep gedachten, door Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Geheugen is als het springen in een stapel gouden bladeren op een zondagmiddag. 1121 00:49:04,770 --> 00:49:09,000 Wind waait, gooien uw hair-- oh, ik mis de dagen when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Lachen] 1124 00:49:12,650 --> 00:49:13,750