1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [MUSIK SPELA] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. MALAN: Okej. 4 00:00:12,640 --> 00:00:14,525 Detta är CS50. 5 00:00:14,525 --> 00:00:16,009 Och detta är början på veckan 5. 6 00:00:16,009 --> 00:00:18,050 Och som ni kanske har märkt, en del av materialet 7 00:00:18,050 --> 00:00:21,050 blir lite mer komplex, den lilla tätare. 8 00:00:21,050 --> 00:00:24,560 >> Och det är väldigt lätt, särskilt om du har haft för vana under en tid, 9 00:00:24,560 --> 00:00:28,600 att försöka klottra ner mest allt vi gör, vi säger i klassen. 10 00:00:28,600 --> 00:00:31,626 Men inse, det är kanske inte den ideala pedagogik 11 00:00:31,626 --> 00:00:34,250 att lära sig den här typen av material, och material i allmänhet. 12 00:00:34,250 --> 00:00:37,250 Och så är vi glada att meddela att CS50 egen Gheng 13 00:00:37,250 --> 00:00:39,780 Gong har börjat förbereda en kanonisk uppsättning anteckningar 14 00:00:39,780 --> 00:00:42,100 för kursen, hopp om vilket är att, en, dessa 15 00:00:42,100 --> 00:00:44,030 inte bara fungera som en referens och en resurs 16 00:00:44,030 --> 00:00:47,410 för att granska materialet och går tillbaka genom material som kan ha 17 00:00:47,410 --> 00:00:51,230 undgått dig första gången, men också så att era huvuden kan vara mer 18 00:00:51,230 --> 00:00:53,740 upp än ned, när den börjar bli dags att föreläsa, 19 00:00:53,740 --> 00:00:56,960 så att du kan engagera mer eftertänksamt, som 20 00:00:56,960 --> 00:00:59,170 skillnad från mer kladdig. 21 00:00:59,170 --> 00:01:02,510 >> Med det sagt, vad du hittar på hemsidan är sådana handlingar som denna. 22 00:01:02,510 --> 00:01:04,660 Och varsel, uppe till vänster, finns det inte bara en innehållsförteckning, 23 00:01:04,660 --> 00:01:06,920 men också tidskoder som kommer omedelbart hoppar du 24 00:01:06,920 --> 00:01:09,077 till lämplig del i videon på nätet. 25 00:01:09,077 --> 00:01:11,410 Och vad Chang här har gjort är i huvudsak dokumenterade 26 00:01:11,410 --> 00:01:13,340 vad som hände i det här särskilt föreläsning. 27 00:01:13,340 --> 00:01:16,370 Och många av föreläsningarna är redan på nätet nu med den här webbadressen. 28 00:01:16,370 --> 00:01:20,110 Och vi kommer att fortsätta att lägga upp resten av dem i slutet av denna vecka, 29 00:01:20,110 --> 00:01:22,380 så tar nytta av denna resurs. 30 00:01:22,380 --> 00:01:25,740 >> Så utan vidare, vi började att skala tillbaka 31 00:01:25,740 --> 00:01:28,180 det skikt som har varit sträng för en tid. 32 00:01:28,180 --> 00:01:30,670 Och vad gjorde vi säger en sträng faktiskt förra veckan? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Så röding stjärna. 35 00:01:32,900 --> 00:01:34,900 Och röding stjärna, ja, vad gjorde det egentligen? 36 00:01:34,900 --> 00:01:37,150 Tja, hela tiden, om vi har krävt en funktion, 37 00:01:37,150 --> 00:01:40,450 som getString och lagring den så kallade retur 38 00:01:40,450 --> 00:01:42,910 värdet av getString i en variable-- det kallas 39 00:01:42,910 --> 00:01:47,721 s typ string-- vi har skrivit kodraden där uppe ovan. 40 00:01:47,721 --> 00:01:49,970 Och det är bara när jag ser min handskrift förstorade här 41 00:01:49,970 --> 00:01:51,930 jag inser hur förfärligt det är. 42 00:01:51,930 --> 00:01:54,180 >> Men låt oss anta att, på höger sida 43 00:01:54,180 --> 00:01:57,070 är ändå en rimlig skildring av vad som är 44 00:01:57,070 --> 00:01:58,880 pågått allt detta tid med getString. 45 00:01:58,880 --> 00:02:00,380 getString naturligtvis blir en sträng. 46 00:02:00,380 --> 00:02:01,691 Men vad betyder det egentligen? 47 00:02:01,691 --> 00:02:04,190 Det betyder att det blir en del av minne från operativsystemet 48 00:02:04,190 --> 00:02:06,040 genom att anropa en funktion som kallas malloc. 49 00:02:06,040 --> 00:02:07,390 Men mer om det senare. 50 00:02:07,390 --> 00:02:09,139 Och då fyller den del av minnet 51 00:02:09,139 --> 00:02:11,764 med bokstäverna användaren har skrivs in, följt av, naturligtvis, 52 00:02:11,764 --> 00:02:14,800 en nolltecken, eller omvänt snedstreck noll i slutet. 53 00:02:14,800 --> 00:02:18,280 >> Under tiden, på vänster sida av denna berättelse, hela tiden, 54 00:02:18,280 --> 00:02:20,850 vi har att förklara en variabel, som s. 55 00:02:20,850 --> 00:02:24,770 Och den variabeln är vad nu kommer börja ringa en pekare. 56 00:02:24,770 --> 00:02:29,190 Det är inte en låda inuti varav vi sätter strängen, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 utan vi lägger i den rutan rutan till vänster vad exakt? 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 >> PUBLIK: Adressen till där den ligger i minnet. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. MALAN: Exakt. 62 00:02:38,118 --> 00:02:40,690 Adressen där Daven ligger i minnet. 63 00:02:40,690 --> 00:02:44,650 Och inte där alla Daven ligger, per se, men specifikt till adressen 64 00:02:44,650 --> 00:02:45,150 av vad? 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 >> PUBLIK: Första tecknet. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. MALAN: Det första tecknet i Daven, som i detta fall, 69 00:02:50,209 --> 00:02:53,820 Jag föreslog var godtyckligt och orealistiskt 1, OX1, 70 00:02:53,820 --> 00:02:55,910 vilket bara innebär att hexadecimal antal 1. 71 00:02:55,910 --> 00:02:57,993 Men det kommer förmodligen att vara ett mycket större antal 72 00:02:57,993 --> 00:03:01,260 att vi kan dra med en 0x som prefix, 73 00:03:01,260 --> 00:03:02,806 representerar ett hexadecimalt tecken. 74 00:03:02,806 --> 00:03:05,930 Och eftersom vi inte behöver veta var resten av karaktärerna i Daven 75 00:03:05,930 --> 00:03:09,860 är, på grund av vad enkel design beslut som gjordes för många år sedan? 76 00:03:09,860 --> 00:03:10,548 Yeah? 77 00:03:10,548 --> 00:03:11,651 >> PUBLIK: omvänt snedstreck 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. MALAN: Ja, exakt. 79 00:03:12,900 --> 00:03:18,100 Det omvända snedstrecket 0 gör att du, om än i linjär tid, att korsa strängen, 80 00:03:18,100 --> 00:03:20,400 gå från vänster till höger, med en for-loop, eller en stund 81 00:03:20,400 --> 00:03:22,608 loop, eller något liknande det, och bestämmer, oh, här 82 00:03:22,608 --> 00:03:24,751 är slutet av denna speciella sträng. 83 00:03:24,751 --> 00:03:27,000 Så med bara adress början av en sträng, 84 00:03:27,000 --> 00:03:30,290 Vi kan komma åt helheten av det, eftersom allt detta samtidigt, 85 00:03:30,290 --> 00:03:32,030 en sträng har just varit en char stjärna. 86 00:03:32,030 --> 00:03:36,370 >> Så det är säkert bra att fortsätta använda den CS50 biblioteket och denna abstraktion, 87 00:03:36,370 --> 00:03:38,440 så att säga, men vi ska börja se exakt 88 00:03:38,440 --> 00:03:41,230 Vad har hänt under hela den här tiden. 89 00:03:41,230 --> 00:03:45,260 Så ni kanske minns det här exemplet, också, från förra gången, jämföra 0, 90 00:03:45,260 --> 00:03:47,300 vilket egentligen inte jämföra. 91 00:03:47,300 --> 00:03:49,070 Men vi började att lösa detta. 92 00:03:49,070 --> 00:03:52,020 >> Men som kanske en uppdaterare, skulle jag intressera någon 93 00:03:52,020 --> 00:03:54,261 i en rosa elefant i dag, också av Chang? 94 00:03:54,261 --> 00:03:55,760 Hur du framför? [Ohörbart]. 95 00:03:55,760 --> 00:03:56,660 Kom upp. 96 00:03:56,660 --> 00:03:58,740 >> Och under tiden, när du kommer upp, låt oss 97 00:03:58,740 --> 00:04:01,670 överväga för ett ögonblick vad denna kod faktiskt gör. 98 00:04:01,670 --> 00:04:04,917 Det förklarar två variabler upp topp, s och t, ​​och ringer getString. 99 00:04:04,917 --> 00:04:08,250 Detta är inte en mycket användarvänligt program, eftersom den inte berätta vad de ska göra. 100 00:04:08,250 --> 00:04:10,541 Men låt oss bara anta att vi är med fokus på den saftiga delen. 101 00:04:10,541 --> 00:04:14,470 Och sedan gör vi, om s är lika med lika t, bör den säga printf, 102 00:04:14,470 --> 00:04:16,170 du skrev samma sak. 103 00:04:16,170 --> 00:04:16,670 Hej. 104 00:04:16,670 --> 00:04:17,050 Vad heter du? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. MALAN: Janelle, Trevligt att träffas. 107 00:04:19,529 --> 00:04:21,800 Så din utmaning handen för elefant 108 00:04:21,800 --> 00:04:25,230 är att först dra oss en bild av vad som är representeras i dessa två första 109 00:04:25,230 --> 00:04:25,970 linjer. 110 00:04:25,970 --> 00:04:28,139 Så s och t kan vara representerade hur på skärmen? 111 00:04:28,139 --> 00:04:30,680 Och du kan bara dra den med fingret på denna stora skärmen. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Så det finns två halvor till varje sida av den ekvationen. 114 00:04:34,510 --> 00:04:37,760 Så det finns s till vänster, och sedan getString till höger. 115 00:04:37,760 --> 00:04:40,540 Och sedan finns det t till vänster, och sedan getString till höger. 116 00:04:40,540 --> 00:04:42,630 Så hur kan vi börjar rita en bild som 117 00:04:42,630 --> 00:04:46,340 representerar vad som händer här i minnet, skulle du säga? 118 00:04:46,340 --> 00:04:49,150 Och låt mig låta dig förklara vad du gör när du går. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Jo, först, det skulle vara fråga dig att få indatasträngen. 121 00:04:58,890 --> 00:05:00,439 Och det skulle 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 Bra. 124 00:05:01,730 --> 00:05:03,330 Och detta kallas vad? 125 00:05:03,330 --> 00:05:03,950 Åh, OK. 126 00:05:03,950 --> 00:05:04,450 Fortsätt. 127 00:05:04,450 --> 00:05:05,575 Jag menade inte att störa. 128 00:05:05,575 --> 00:05:07,060 Janelle: Förlåt. 129 00:05:07,060 --> 00:05:14,237 Så det skulle input den till adressen of-- osäker. 130 00:05:14,237 --> 00:05:17,320 Jag kan inte exakt ihåg numret, men jag tror att det börjar med 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. MALAN: Det är okej, eftersom jag gjorde siffrorna uppåt, 132 00:05:18,420 --> 00:05:19,650 så det finns inget rätt svar. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Från och med 0 bågen. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. MALAN: OK, så elementet 0. 135 00:05:24,000 --> 00:05:24,765 Visst. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: Och sedan om var som bara två letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. MALAN: OK, tillbaka till dig. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Så elementet 0, och då elementet 1 eller element 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. MALAN: Och vilken del av bilden drar du just nu? 140 00:05:36,670 --> 00:05:37,690 Uppmaningen till getString? 141 00:05:37,690 --> 00:05:38,830 Eller förklaringen s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Deklarationen av s, tror jag. 143 00:05:42,890 --> 00:05:45,980 Åh, det getString, eftersom det skulle läsas in i varje [? område. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. MALAN: Bra. 145 00:05:46,510 --> 00:05:47,051 Exakt. 146 00:05:47,051 --> 00:05:49,300 Även om detta på ett effektivt sätt returnerar en array, återkallelse, 147 00:05:49,300 --> 00:05:53,300 när vi kommer tillbaka en sträng, kan vi index in i den sträng med 01 och 2. 148 00:05:53,300 --> 00:05:56,180 Tekniskt sett dessa är förmodligen representeras av enskilda adresser, 149 00:05:56,180 --> 00:05:57,100 men det är bra. 150 00:05:57,100 --> 00:06:00,170 >> Så antar, om jag kan bara snabbt vidarebefordra till där vi slutade 151 00:06:00,170 --> 00:06:04,320 förra gången, om en av strängarna var g a b e, 152 00:06:04,320 --> 00:06:10,337 omvänt snedstreck 0, därigenom representerande gabe ter ingång, hur kan vi representerar er nu? 153 00:06:10,337 --> 00:06:12,670 Om detta är det minne som är returnerats av getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Skulle det vara representeras av en båge? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. MALAN: Med en båge? 157 00:06:18,750 --> 00:06:19,130 Tja, nej. 158 00:06:19,130 --> 00:06:21,171 Låt oss bara säga, pictorially, låt mig bara gå vidare 159 00:06:21,171 --> 00:06:25,710 och föreslår att, om detta är er, detta är returvärdet för getString. 160 00:06:25,710 --> 00:06:29,482 Och du har dragit detta som 0, 1, 2, som är helt rimligt, eftersom vi 161 00:06:29,482 --> 00:06:30,940 kan indexera i strängen, som sådan. 162 00:06:30,940 --> 00:06:33,340 Men bara för att vara i linje med förra gången, låt mig gå vidare 163 00:06:33,340 --> 00:06:37,310 och godtyckligt föreslår att denna är adressen 1, detta är adressen 2, 164 00:06:37,310 --> 00:06:39,597 detta är adressen 3, och så vidare. 165 00:06:39,597 --> 00:06:41,430 Och så, bara för att vara super klart, vad som händer 166 00:06:41,430 --> 00:06:44,580 att gå i er som ett resultat av att första raden av kod, skulle du säga? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Adress 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. MALAN: Exakt. 169 00:06:46,420 --> 00:06:47,190 Så itu 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Och under tiden, låt mig gå vidare och duplicera mycket av vad du gjort 172 00:06:51,230 --> 00:06:52,740 och lägga min T här. 173 00:06:52,740 --> 00:06:56,340 Om jag skulle skriva in gabe igen, en andra gång, 174 00:06:56,340 --> 00:07:01,530 när du ombeds med getString, där, naturligtvis, gabe kommer att gå? 175 00:07:01,530 --> 00:07:02,280 Tja, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Som på här? 178 00:07:05,975 --> 00:07:06,850 DAVID J. MALAN: Ja. 179 00:07:06,850 --> 00:07:08,516 Janelle: Eller det är också i samma lådor? 180 00:07:08,516 --> 00:07:11,940 DAVID J. MALAN: Låt mig föreslå, ja, exakt, så i dessa ytterligare lådor. 181 00:07:11,940 --> 00:07:15,230 Men vad är nyckeln nu är att även även om jag har ritat dem ganska nära 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, detta är 0x2-- i verkligheten, 183 00:07:18,650 --> 00:07:25,750 det nu kan vara adress 0x10, till exempel, och 0x11 och 0x12, 184 00:07:25,750 --> 00:07:26,870 och så vidare. 185 00:07:26,870 --> 00:07:29,955 Och så, om så är fallet, vad som kommer att hamna här i t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. MALAN: Exakt. 188 00:07:31,830 --> 00:07:33,180 Så 0x10. 189 00:07:33,180 --> 00:07:34,570 Och så nu, sista frågan. 190 00:07:34,570 --> 00:07:37,510 Du har överlägset, var tvungen att jobba på svårast för en elefant hittills. 191 00:07:37,510 --> 00:07:42,650 Nu, om jag drar upp koden igen, när jag gör, i linje tre, 192 00:07:42,650 --> 00:07:47,630 Om s är lika med är lika med t, vad är jag egentligen jämföra att vi har ritat här? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: De två adresserna? 194 00:07:49,271 --> 00:07:50,270 DAVID J. MALAN: Exakt. 195 00:07:50,270 --> 00:07:53,350 Så jag säger är s lika lika med t? 196 00:07:53,350 --> 00:07:56,210 Med andra ord är en lika lika med 10? 197 00:07:56,210 --> 00:07:59,710 Och naturligtvis, det självklara svaret är nu, nej. 198 00:07:59,710 --> 00:08:02,920 Och så det här programmet är ytterst kommer att skriva ut det, skulle du säga? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Skulle det vara, du skrev samma sak? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. MALAN: Så om s är 1 och t är 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Du skrev olika saker. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. MALAN: Exakt. 204 00:08:13,570 --> 00:08:14,480 Du skrev olika saker. 205 00:08:14,480 --> 00:08:14,850 Okej. 206 00:08:14,850 --> 00:08:16,714 Så en applåd, om vi kunde, här. 207 00:08:16,714 --> 00:08:17,214 [Applåder] 208 00:08:17,214 --> 00:08:17,708 Det var smärtsamt. 209 00:08:17,708 --> 00:08:18,208 Jag vet. 210 00:08:18,208 --> 00:08:19,684 Snyggt gjort. 211 00:08:19,684 --> 00:08:24,690 Så nu ska vi se om vi inte kan retas isär vad fix var. 212 00:08:24,690 --> 00:08:28,040 Och naturligtvis, när vi fast detta-- som jag ska nu representera i green-- 213 00:08:28,040 --> 00:08:29,690 Vi gjorde ett par förbättringar här. 214 00:08:29,690 --> 00:08:32,409 Först, bara som en förstånd kolla, jag först kontrollera 215 00:08:32,409 --> 00:08:35,110 Om s är lika med noll och t är lika med noll. 216 00:08:35,110 --> 00:08:39,440 Och bara för att vara tydlig, då kanske s eller t vara null i kod som denna? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 När kan s eller t vara null. 219 00:08:44,490 --> 00:08:44,990 Yeah? 220 00:08:44,990 --> 00:08:45,990 >> PUBLIK: [ohörbart]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. MALAN: Exakt. 223 00:08:50,510 --> 00:08:52,840 Om strängen som användaren skrev i är alldeles för lång 224 00:08:52,840 --> 00:08:56,140 att passa in i minnet, eller något konstig hörn fall som detta, 225 00:08:56,140 --> 00:08:59,010 getString, som vi får se, bokstavligt talat idag, i sin dokumentation, 226 00:08:59,010 --> 00:09:02,330 säger den ger null som en speciell sentinel värde, 227 00:09:02,330 --> 00:09:05,417 eller bara typ av en speciell symbol som betyder något gick fel. 228 00:09:05,417 --> 00:09:07,500 Så vi vill kontrollera att eftersom det visar sig 229 00:09:07,500 --> 00:09:09,720 att null är en mycket farlig värde. 230 00:09:09,720 --> 00:09:14,250 >> Ofta om du försöker göra något med null involverar en function-- passerar det 231 00:09:14,250 --> 00:09:17,470 som indata för instance-- denna funktion kan mycket kommer att krascha och, med det, 232 00:09:17,470 --> 00:09:19,090 ta ner hela programmet. 233 00:09:19,090 --> 00:09:22,570 Så denna tredje raden är nu bara en sanity kolla, felkontroll, om ni så vill. 234 00:09:22,570 --> 00:09:25,450 Det är en god vana nu oss att komma in när som helst vi 235 00:09:25,450 --> 00:09:28,050 försöker använda ett värde som kunde potentiellt vara null. 236 00:09:28,050 --> 00:09:32,000 >> Nu, i den fjärde raden här, "Om strcmp (s, t)," bra, 237 00:09:32,000 --> 00:09:33,180 vad är det att hänvisa till? 238 00:09:33,180 --> 00:09:36,750 Tja, sa vi att detta var ett mycket kortfattat uppkallad funktion för strängjämförelse. 239 00:09:36,750 --> 00:09:40,370 Och dess syfte i livet är att jämföra sitt första argument mot det andra, 240 00:09:40,370 --> 00:09:44,640 men inte i termer av deras adresser, som vi gjorde oavsiktligt ett ögonblick 241 00:09:44,640 --> 00:09:48,270 sedan med den röda koden, men snarare att jämföra dessa två 242 00:09:48,270 --> 00:09:53,210 strängar i mänskligt intuitivt sätt genom att jämföra detta mot detta, 243 00:09:53,210 --> 00:09:56,690 mot detta, mot detta, och sedan stoppa, om och när en 244 00:09:56,690 --> 00:09:59,590 eller båda av mina fingrar träffar ett omvänt snedstreck 0. 245 00:09:59,590 --> 00:10:04,530 Så någon år sedan genomfört strcmp att genomföra för oss funktionaliteten 246 00:10:04,530 --> 00:10:08,890 att vi hoppades att vi skulle ha fått genom att bara jämföra två enkla värden. 247 00:10:08,890 --> 00:10:14,929 >> Nu ärligt talat, jag håller ritning alla dessa olika siffror. 248 00:10:14,929 --> 00:10:17,470 Men verkligheten är, jag har varit göra dessa upp hela tiden. 249 00:10:17,470 --> 00:10:19,580 Och så låt mig bara gå vidare och klottra dessa ut 250 00:10:19,580 --> 00:10:23,100 att göra en punkt som i slutet av dagen och framåt, 251 00:10:23,100 --> 00:10:30,160 Vi är inte riktigt kommer att bry sig om vilka adresser saker är faktiskt 252 00:10:30,160 --> 00:10:30,790 i minnet. 253 00:10:30,790 --> 00:10:34,320 Så jag tänker inte dra dessa typer av siffror så mycket längre, 254 00:10:34,320 --> 00:10:38,970 Jag är bara en abstrakt detta bort en lite mer vänligt med bara pilar. 255 00:10:38,970 --> 00:10:42,060 >> Med andra ord, om s är en pekare, väl, låt oss bara göra det, bokstavligen, 256 00:10:42,060 --> 00:10:45,430 som en pekare, en pil som pekar från sig själv till något annat, 257 00:10:45,430 --> 00:10:48,280 och inte oroa sig alltför mycket mer om minutiae av dessa adresser 258 00:10:48,280 --> 00:10:49,910 som, återigen, gjorde jag upp ändå. 259 00:10:49,910 --> 00:10:52,680 Men vi får se dessa adresser, ibland, när felsökning kod. 260 00:10:52,680 --> 00:10:56,450 >> Nu under tiden, det här programmet här uppe fixar, naturligtvis, 261 00:10:56,450 --> 00:10:58,720 det problemet genom att jämföra dessa två strängar. 262 00:10:58,720 --> 00:11:00,260 Men vi stötte på ett annat problem. 263 00:11:00,260 --> 00:11:03,180 Detta var från kopian programmera förra gången, 264 00:11:03,180 --> 00:11:06,880 vari, jag försökte att kapitalisera bara det första tecknet i en sträng. 265 00:11:06,880 --> 00:11:09,620 Men vad var symptomet vi såg förra gången då 266 00:11:09,620 --> 00:11:14,150 en användare skrivit in ett värde, som gabe små bokstäver, för s, 267 00:11:14,150 --> 00:11:19,310 då vi tilldelade s in t, som i den tredje raden där, 268 00:11:19,310 --> 00:11:22,900 och sedan försökte jag kapitalisera t bygel 0? 269 00:11:22,900 --> 00:11:25,950 Vad var effekten av ändra t fäste 0 här? 270 00:11:25,950 --> 00:11:27,150 >> PUBLIK: Det ändrade talet. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. MALAN: Ja, Jag bytte s, liksom. 272 00:11:29,360 --> 00:11:31,050 För vad som verkligen pågick? 273 00:11:31,050 --> 00:11:34,130 Nåväl, låt mig se om jag kan städa upp denna bild, enligt följande. 274 00:11:34,130 --> 00:11:41,390 >> Om s är, återigen, ordet g, a, b, e, snedstreck, 0, och S 275 00:11:41,390 --> 00:11:44,084 vi ska fortsätta rita som en låda här, men inga fler adresser. 276 00:11:44,084 --> 00:11:45,250 Låt oss sluta göra saker. 277 00:11:45,250 --> 00:11:47,510 Låt oss bara rita en bild att förenkla världen. 278 00:11:47,510 --> 00:11:52,640 >> När jag förklarar t med snöre t, som skapar denna bit av minnet. 279 00:11:52,640 --> 00:11:55,850 Fyrkantig råkar vara 32 bitar i de flesta datorer. 280 00:11:55,850 --> 00:11:59,530 Faktum är, om du någonsin har hört talas om en dator som har en 32-bitars arkitektur, 281 00:11:59,530 --> 00:12:03,000 riktigt fancy-tala, som bara betyder att den använder 32-bitarsadresser. 282 00:12:03,000 --> 00:12:05,370 Och som en teknisk åt sidan, Om du någonsin undrat 283 00:12:05,370 --> 00:12:09,630 varför äldre datorer, om du faktiskt försökte soppa upp dem med massor av RAM, 284 00:12:09,630 --> 00:12:12,360 kunde bara ha högst fyra gigabyte RAM, 285 00:12:12,360 --> 00:12:14,860 väl det beror på, bokstavligt talat, din gamla dator kunde bara 286 00:12:14,860 --> 00:12:17,250 räkna så högt som 4 miljarder, 4 miljarder byte, 287 00:12:17,250 --> 00:12:20,590 eftersom det var med 32-bitars nummer för adresser. 288 00:12:20,590 --> 00:12:23,260 >> Men i alla fall, i detta exempel berättelsens mycket enklare. 289 00:12:23,260 --> 00:12:27,250 t är bara en annan pekare, eller verkligen en röding stjärna, aka sträng. 290 00:12:27,250 --> 00:12:30,860 Och hur gör jag vill uppdatera den här bilden nu med den andra raden av kod, 291 00:12:30,860 --> 00:12:31,950 efter punkt, prick, pricka? 292 00:12:31,950 --> 00:12:35,845 När jag gör string t är lika med s semikolon, Hur ändrar den här bilden? 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 >> PUBLIK: [ohörbart]. 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 Exakt. 299 00:12:42,600 --> 00:12:45,620 Jag satte bara en pil från t box till samma adress, 300 00:12:45,620 --> 00:12:47,570 samma första bokstav i gav. 301 00:12:47,570 --> 00:12:50,850 Eller tekniskt, om detta Killen var fortfarande på 0x1, 302 00:12:50,850 --> 00:12:53,052 det är som om jag hade 0x1 här och 0x1 här. 303 00:12:53,052 --> 00:12:54,760 Men återigen, vem bryr sig om adresserna? 304 00:12:54,760 --> 00:12:56,345 Det är bara tanken att nu betyder något. 305 00:12:56,345 --> 00:12:57,720 Så det här är vad som händer här. 306 00:12:57,720 --> 00:13:02,690 Så naturligtvis, om du gör t fäste 0, vilket är array notation, 307 00:13:02,690 --> 00:13:05,650 av course-- och ärligt talat, det ser som det finns en matris över här, 308 00:13:05,650 --> 00:13:07,340 men nu finns det här konstiga. 309 00:13:07,340 --> 00:13:11,160 Vet att programmeringsspråket, C, erbjuder denna funktion, 310 00:13:11,160 --> 00:13:14,650 varigenom, även om t är en pekare, eller s är en pekare, 311 00:13:14,650 --> 00:13:18,050 Du kan fortfarande använda den välbekanta, bekväm klammer 312 00:13:18,050 --> 00:13:22,520 notation för att gå till den första delen, eller den andra delen, eller någon del 313 00:13:22,520 --> 00:13:26,130 att att pekaren pekar till grund, förmodligen, det 314 00:13:26,130 --> 00:13:29,410 är, som i detta fall, pekar på några array. 315 00:13:29,410 --> 00:13:30,340 >> Så hur ska vi fixa detta? 316 00:13:30,340 --> 00:13:33,660 Ärligt talat, det är där den fick ett lite överväldigande vid första anblicken. 317 00:13:33,660 --> 00:13:35,340 Men här är en ny och förbättrad version. 318 00:13:35,340 --> 00:13:37,460 >> Så först, jag får bli av med CS50 biblioteket 319 00:13:37,460 --> 00:13:41,170 bara för att exponera att s är verkligen en röding stjärna, bara en synonym. 320 00:13:41,170 --> 00:13:43,540 Och t är också en röding stjärna. 321 00:13:43,540 --> 00:13:48,290 Men vad som händer på högra sidan av denna linje 322 00:13:48,290 --> 00:13:49,970 där t tilldelas ett värde? 323 00:13:49,970 --> 00:13:50,790 >> Vad är malloc? 324 00:13:50,790 --> 00:13:51,630 Vad det är strlen? 325 00:13:51,630 --> 00:13:52,547 Vad är sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Varför i helsike gör detta line ser så komplicerat? 327 00:13:54,380 --> 00:13:55,713 Vad gör den på en hög nivå? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Hur är det att lagra i t? 330 00:13:57,440 --> 00:13:58,646 Yeah? 331 00:13:58,646 --> 00:14:01,104 PUBLIK: Det tilldela ett viss mängd minne. 332 00:14:01,104 --> 00:14:03,032 Det är för att lagra, antar jag, brev [ohörbart]. 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 Det allokera en viss mängden minne 336 00:14:06,650 --> 00:14:08,940 att lagra, förmodligen, framtida bokstäver. 337 00:14:08,940 --> 00:14:11,310 Och framför allt, malloc Därför återvänder vad? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> PUBLIK: Returnera [ohörbart]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. MALAN: Exakt. 341 00:14:15,850 --> 00:14:18,850 Returnera adressen till det minnet, vilket är ett finare sätt att säga, 342 00:14:18,850 --> 00:14:21,640 returnerar adressen för den första byten i detta minne. 343 00:14:21,640 --> 00:14:25,460 Det åligger mig att komma ihåg hur mycket minne jag faktiskt 344 00:14:25,460 --> 00:14:27,140 tilldelats eller bad malloc för. 345 00:14:27,140 --> 00:14:28,384 >> Nu hur mycket är det? 346 00:14:28,384 --> 00:14:30,550 Tja, även om det finns en massa parenteser här, 347 00:14:30,550 --> 00:14:32,970 malloc tar bara ett enda argument. 348 00:14:32,970 --> 00:14:37,250 Och jag ange strlen för s, så ge mig så många bytes som det finns i er, 349 00:14:37,250 --> 00:14:37,800 men lägga en. 350 00:14:37,800 --> 00:14:38,300 Varför? 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 >> Publik: Den omvända sned 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. MALAN: Exakt. 355 00:14:41,840 --> 00:14:43,423 Vi måste göra lite städning. 356 00:14:43,423 --> 00:14:45,970 Så eftersom det finns ett omvänt snedstreck 0, skulle vi bättre komma ihåg att. 357 00:14:45,970 --> 00:14:47,310 Annars kommer vi för att skapa en sträng som 358 00:14:47,310 --> 00:14:49,170 har inte den där speciella terminator. 359 00:14:49,170 --> 00:14:52,640 >> Under tiden, bara för att vara super anal, jag har sizeof (char), 360 00:14:52,640 --> 00:14:55,730 bara i fall någon kör min kod inte på CS50 apparaten, 361 00:14:55,730 --> 00:14:58,220 men kanske en annan dator sammanlagt där chars 362 00:14:58,220 --> 00:15:01,470 är en byte, enligt praxis, men två bytes, eller något större än så. 363 00:15:01,470 --> 00:15:04,490 Det är bara att vara super, super främmande för fel. 364 00:15:04,490 --> 00:15:06,940 Även om, i verkligheten är det mest sannolikt kommer att bli en 1. 365 00:15:06,940 --> 00:15:11,490 >> Nu, under tiden, jag gå vidare och kopiera sträng, t fäste i lika t fäste s. 366 00:15:11,490 --> 00:15:14,962 Och jag kommer att skjuta till förra veckans källkod för att se vad som händer. 367 00:15:14,962 --> 00:15:17,670 Men nyckeln takeaway, och Anledningen till att jag lägger koden nu i grönt, 368 00:15:17,670 --> 00:15:22,520 beror på att det allra sista raden, t bygel 0 lika TOUPPER, 369 00:15:22,520 --> 00:15:25,230 har effekten av att Aktivering vilken sträng? 370 00:15:25,230 --> 00:15:26,960 t och / eller s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Den sista raden i koden. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Bara t, eftersom det är hände den här gången, 375 00:15:35,560 --> 00:15:41,500 om jag ångrar något där sista steget, vad som har hänt är, när jag ringer malloc, 376 00:15:41,500 --> 00:15:45,380 Jag får i huvudsak en bit av minne det är samma storlek som originalet, 377 00:15:45,380 --> 00:15:47,020 eftersom det är det aritmetiska jag gjorde. 378 00:15:47,020 --> 00:15:50,920 Jag lagrar in t adressen av den del av minnet. 379 00:15:50,920 --> 00:15:53,370 Även om detta ser trevligt och vackra, trevliga och tom, 380 00:15:53,370 --> 00:15:56,882 verkligheten är att det finns, vad vi ska hålla ringer, sopp värden här. 381 00:15:56,882 --> 00:15:59,340 Denna bit av minnet kanske mycket väl har använts tidigare, 382 00:15:59,340 --> 00:16:00,940 några sekunder, för några minuter sedan. 383 00:16:00,940 --> 00:16:04,410 Så det kan absolut vara tal eller bokstäver där, bara av en slump. 384 00:16:04,410 --> 00:16:08,580 Men de är inte giltigt, tills jag själv fylla denna bit av minnet 385 00:16:08,580 --> 00:16:12,510 med de faktiska tecken, vilket jag göra på det för loop där. 386 00:16:12,510 --> 00:16:13,180 Okej? 387 00:16:13,180 --> 00:16:16,180 >> Så nu, klimax dessa tre exempel 388 00:16:16,180 --> 00:16:20,730 som till synes var bruten förra gången, Detta Swap exempel denna funktion 389 00:16:20,730 --> 00:16:23,670 arbetat i den meningen att den bytte a och b. 390 00:16:23,670 --> 00:16:25,620 Men det fungerade inte i vad andra mening? 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 >> PUBLIK: [ohörbart]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. MALAN: Exakt. 396 00:16:36,700 --> 00:16:39,530 Om jag skulle kalla denna funktion från another-- exempelvis 397 00:16:39,530 --> 00:16:42,870 från en funktion som huvud, där Jag har en variabel, x och y, som jag 398 00:16:42,870 --> 00:16:46,160 gjorde förra veckan, samma kod, och jag passerar på x och y 399 00:16:46,160 --> 00:16:49,860 till Pendla och sedan ringa Swap-- detta, naturligtvis, är den korrekta versionen 400 00:16:49,860 --> 00:16:52,220 är vad vi håller på att se-- det inte fungerade. 401 00:16:52,220 --> 00:16:53,770 Så vad är fix? 402 00:16:53,770 --> 00:16:56,850 >> Tja, så bara för att vara klart, låt mig gå vidare 403 00:16:56,850 --> 00:17:05,450 och-- ge mig en sekund här, och se om jag kan visa er den sista, som 404 00:17:05,450 --> 00:17:12,464 blir in-- låt oss se om jag kan hitta denna verkliga fast-- OK, [ohörbart]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, det är det. 407 00:17:19,240 --> 00:17:21,000 Så ignorera de kommandon jag bara skriva. 408 00:17:21,000 --> 00:17:23,780 Jag vill att det ska hämta på i sista minuten ett exempel 409 00:17:23,780 --> 00:17:27,960 från förra gången, vilket kallas nu ingen Swap. 410 00:17:27,960 --> 00:17:30,200 >> Så ingen Swap är där vi slutade förra gången, 411 00:17:30,200 --> 00:17:32,930 varigenom, initierad jag x till 1 och y till 2. 412 00:17:32,930 --> 00:17:35,840 Jag sedan ringa Swap, som går under 1 och 2. 413 00:17:35,840 --> 00:17:37,930 Och sedan denna funktion arbetat i någon mening, 414 00:17:37,930 --> 00:17:40,750 men det hade ingen permanent effekt på x och y. 415 00:17:40,750 --> 00:17:45,430 Så frågan till hands är, hur nu vi faktiskt åtgärda problemet? 416 00:17:45,430 --> 00:17:47,820 Vad är lösningen till hands? 417 00:17:47,820 --> 00:17:53,150 >> Tja, i swap.c, vilket är nytt i dag, märker ett par skillnader. 418 00:17:53,150 --> 00:17:54,700 x och y är samma. 419 00:17:54,700 --> 00:17:57,250 Men vad är helt klart annorlunda linje 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Vad är nytt där, om du kommer ihåg hur det såg ut en sekund sedan? 422 00:18:01,715 --> 00:18:02,565 >> PUBLIK: [ohörbart]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. MALAN: Ja. 424 00:18:03,440 --> 00:18:06,680 Så et-tecken är en ny bit av syntax inte bara i det här programmet, 425 00:18:06,680 --> 00:18:08,560 men också mer allmänt i CS50. 426 00:18:08,560 --> 00:18:10,680 Hittills tror jag inte Vi har sett några exempel 427 00:18:10,680 --> 00:18:14,070 eller egentligen talade om dem på något detalj, utom, kanske, i förebyggande syfte 428 00:18:14,070 --> 00:18:16,467 i snitt, ett et-tecken som den här. 429 00:18:16,467 --> 00:18:19,300 Tja, det visar sig et-tecken är ett av de sista bitarna av ny syntax 430 00:18:19,300 --> 00:18:20,174 vi kommer att lära sig. 431 00:18:20,174 --> 00:18:23,500 Allt det betyder är att adressen för en viss variabel. 432 00:18:23,500 --> 00:18:25,070 Vid vilken adress betyder x bor? 433 00:18:25,070 --> 00:18:26,510 Men vad adress betyder y bor? 434 00:18:26,510 --> 00:18:28,700 För om det grundläggande problem innan 435 00:18:28,700 --> 00:18:32,970 var att x och y gick vidare som kopior, vad vi verkligen vill göra 436 00:18:32,970 --> 00:18:38,780 är att ge Swap med som en skatt karta som leder till där x och y faktiskt 437 00:18:38,780 --> 00:18:41,910 finns i RAM, så att Swap kan följa den kartan 438 00:18:41,910 --> 00:18:47,760 och gå dit x eller y markerar fläcken och ändra de faktiska värdena 1 och 2 439 00:18:47,760 --> 00:18:48,270 där. 440 00:18:48,270 --> 00:18:50,710 >> Så Swap behöver förändras något för. 441 00:18:50,710 --> 00:18:53,760 Och vid första anblicken, denna styrka verkar lite liknande röding stjärna. 442 00:18:53,760 --> 00:18:54,850 Och faktiskt är det. 443 00:18:54,850 --> 00:18:59,635 Så en är en pekare till vilken typ av data, baserat på detta markerade delen? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Så det är en int. 446 00:19:01,620 --> 00:19:04,880 >> Så en är inte längre en int, det är adressen till en int. 447 00:19:04,880 --> 00:19:07,910 Och på samma sätt, är b nu går att vara adressen till en int. 448 00:19:07,910 --> 00:19:12,470 Så när jag nu kallar Swap från Main, Jag tänker inte ge Swap 1 och 2. 449 00:19:12,470 --> 00:19:15,540 Jag ska ge den som Ox-något och Ox-någonting, 450 00:19:15,540 --> 00:19:19,820 två adresser som kommer att leda Byt till deras verkliga placeringen 451 00:19:19,820 --> 00:19:21,310 i datorns minne. 452 00:19:21,310 --> 00:19:25,580 >> Så nu, min återstående genomförandet måste förändras en smula. 453 00:19:25,580 --> 00:19:28,650 Vad är naturligtvis annorlunda nu i dessa tre rader kod? 454 00:19:28,650 --> 00:19:31,350 Det finns dessa jävla stjärnor alla överallt, okej? 455 00:19:31,350 --> 00:19:33,014 Så vad händer här? 456 00:19:33,014 --> 00:19:33,514 Yeah? 457 00:19:33,514 --> 00:19:35,055 >> PUBLIK: Det är naturligtvis [ohörbart]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. MALAN: Exakt. 460 00:19:37,990 --> 00:19:41,560 Så i detta context-- och det var inte den bästa designen beslutet visserligen 461 00:19:41,560 --> 00:19:42,530 år sedan. 462 00:19:42,530 --> 00:19:45,110 I detta sammanhang, där du har bara en stjärna, 463 00:19:45,110 --> 00:19:48,240 och du inte har en datatyp, som int, omedelbart till vänster, 464 00:19:48,240 --> 00:19:53,146 stället har du ett likhetstecken, tydligt, i detta sammanhang, när du säger stjärna en, 465 00:19:53,146 --> 00:19:56,980 det innebär att gå till adress som är i en. 466 00:19:56,980 --> 00:19:58,870 Följ skattkarta, så att säga. 467 00:19:58,870 --> 00:20:01,720 >> Och under tiden, i linje 37, Det betyder samma sak. 468 00:20:01,720 --> 00:20:05,460 Gå till adress a, och satte det där? 469 00:20:05,460 --> 00:20:09,520 Vad är på plats som b anger. 470 00:20:09,520 --> 00:20:10,980 Med andra ord går till b. 471 00:20:10,980 --> 00:20:12,130 Få det värdet. 472 00:20:12,130 --> 00:20:15,620 Gå till en och, per den lika underteckna, uppdraget operatören, 473 00:20:15,620 --> 00:20:17,010 sätta det värde där. 474 00:20:17,010 --> 00:20:19,272 >> På samma sätt är int temp bara en int. 475 00:20:19,272 --> 00:20:20,730 Inget behöver förändras om temp. 476 00:20:20,730 --> 00:20:24,810 Det är bara en reservglas från Annenberg för lite mjölk eller apelsinjuice. 477 00:20:24,810 --> 00:20:27,630 Men jag måste säga, gå till miljarder. 478 00:20:27,630 --> 00:20:31,449 Gå till den destinationen och sätta värdet i temp där. 479 00:20:31,449 --> 00:20:32,490 Så vad händer då? 480 00:20:32,490 --> 00:20:36,540 När jag faktiskt kalla Swap den här gången, om denna första magasinet här representerar Main, 481 00:20:36,540 --> 00:20:42,270 denna andra bricka representerar Swap, när Jag passerar et-x och-tecken y 482 00:20:42,270 --> 00:20:47,150 från Main till Pendla, bara för att vara tydlig, vad är detta stackram mottagande? 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 >> PUBLIK: [ohörbart]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. MALAN: Exakt. 487 00:20:51,180 --> 00:20:53,129 Adressen x och adressen till y. 488 00:20:53,129 --> 00:20:55,170 Och du kan tänka på dessa som postadress. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street och 35 Oxford Street, och du 490 00:20:58,772 --> 00:21:01,230 vill flytta de två byggnaderna som finns på dessa platser. 491 00:21:01,230 --> 00:21:04,680 >> Det blir liksom en löjlig idé, men det är allt vi menar med adress. 492 00:21:04,680 --> 00:21:07,000 Var i världen kan du hittar dessa två Ints? 493 00:21:07,000 --> 00:21:09,470 Var i världen kan du hitta dessa två byggnader? 494 00:21:09,470 --> 00:21:15,170 Så om slutligen, efter all denna tid som jag gå in i dagens källkod och kompilera 495 00:21:15,170 --> 00:21:22,110 Byt och springa ./swap, slutligen, för den första gången gör vi faktiskt se att 496 00:21:22,110 --> 00:21:25,330 mina värderingar har faktiskt bytts framgång. 497 00:21:25,330 --> 00:21:30,860 Och nu kan vi även ta notera detta i t.ex. gdb. 498 00:21:30,860 --> 00:21:32,740 >> Så låt mig gå in i samma fil. 499 00:21:32,740 --> 00:21:35,010 Låt mig gå vidare och köra gdb för ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Och nu, i Swap, jag ska gå framåt och sätta en brytpunkt i Main. 502 00:21:40,547 --> 00:21:42,630 Och nu ska jag gå framåt och kör programmet. 503 00:21:42,630 --> 00:21:45,810 Och nu ser vi min kod pausats på den linjen. 504 00:21:45,810 --> 00:21:48,330 >> Om jag går vidare och skriva ut x, vad ska jag ser här? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Det är en fråga. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Säg igen? 509 00:21:51,530 --> 00:21:52,295 >> PUBLIK: [ohörbart]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. MALAN: Så slumptal, kanske. 511 00:21:53,910 --> 00:21:56,010 Kanske jag har tur, och det är trevligt och enkelt, som 0. 512 00:21:56,010 --> 00:21:57,230 Men kanske är det något slumptal. 513 00:21:57,230 --> 00:21:58,090 I det här fallet, jag hade tur. 514 00:21:58,090 --> 00:21:59,030 Det råkar bara vara 0. 515 00:21:59,030 --> 00:22:00,780 Men det är verkligen tur, eftersom inte förrän jag 516 00:22:00,780 --> 00:22:06,280 skriver nästa och sedan skriva ut x har att kodrad, rad 19, avrättats. 517 00:22:06,280 --> 00:22:10,942 >> Under tiden, om jag skriver nästa gång, och nu skriva ut y, jag ska se 2. 518 00:22:10,942 --> 00:22:13,900 Om jag skriver nästa, det kommer att bli lite förvirrande, för nu, 519 00:22:13,900 --> 00:22:17,250 printf kommer att visas på skärmen, som den gjorde. x är 1. 520 00:22:17,250 --> 00:22:18,606 >> Nu gör vi det igen. 521 00:22:18,606 --> 00:22:20,480 Och nu, här där det blir intressant. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Innan jag kallar Swap eller till steget in i den, låt oss ta en liten titt. 524 00:22:26,580 --> 00:22:28,980 x är, återigen, en. 525 00:22:28,980 --> 00:22:33,240 Y är, naturligtvis, en snabb förstånd kolla, 2, så inte svårt där. 526 00:22:33,240 --> 00:22:35,740 Men vad är et tecken x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Svar, det slags funky ser. 529 00:22:39,350 --> 00:22:43,500 Men int stjärnan inom parentes är bara BNP: s sätt att säga detta är en adress. 530 00:22:43,500 --> 00:22:48,290 Det är inte en int, det är en pekare till en int eller annars känd som en adress. 531 00:22:48,290 --> 00:22:49,742 >> Vad är denna galna sak? 532 00:22:49,742 --> 00:22:51,825 Vi har aldrig sett något riktigt som förut. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Så det här är adressen i datorns minnet av där x råkar leva. 535 00:22:58,120 --> 00:22:59,040 Det är Ox-någonting. 536 00:22:59,040 --> 00:23:01,290 Och det är, ärligt talat, varför Jag har börjat rita pilar, 537 00:23:01,290 --> 00:23:03,340 istället för siffror, för vem bryr sig egentligen 538 00:23:03,340 --> 00:23:06,890 att din int är på en viss adress som är så stor. 539 00:23:06,890 --> 00:23:12,160 Men bffff0c4, dessa är alla faktiskt hexadecimala siffror, 540 00:23:12,160 --> 00:23:13,720 som är 0 till f. 541 00:23:13,720 --> 00:23:16,590 >> Så vi ska inte uppehålla mig alltför länge på vad dessa saker är. 542 00:23:16,590 --> 00:23:19,400 Men om jag skriver ut y, Naturligtvis ser jag 2. 543 00:23:19,400 --> 00:23:22,440 Men et-tecken y, jag ser den här adressen. 544 00:23:22,440 --> 00:23:26,527 Och varsel, för den nyfikne, Hur långt ifrån varandra är x och y? 545 00:23:26,527 --> 00:23:27,985 Du kan ignorera de flesta av adressen. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Fyra byte. 548 00:23:29,920 --> 00:23:33,510 Och det är i linje med vår tidigare hävdar att hur stor är en int? 549 00:23:33,510 --> 00:23:34,130 Fyra byte. 550 00:23:34,130 --> 00:23:37,420 Så det ser ut som allt är kö fint, som ni kanske hoppas, i minnet. 551 00:23:37,420 --> 00:23:40,010 >> Så nu, låt oss bara snabbspolning framåt till slutet av denna berättelse. 552 00:23:40,010 --> 00:23:43,290 Låt oss gå vidare och skriva steg, att dyka i Swap-funktionen. 553 00:23:43,290 --> 00:23:46,880 Nu märker, om jag skriver en, det är identisk med adressen för x. 554 00:23:46,880 --> 00:23:52,130 Om jag skriver b, det är identiskt till adressen för y. 555 00:23:52,130 --> 00:23:57,020 Så vad ska jag se om jag säger, gå till adressen a? 556 00:23:57,020 --> 00:23:58,120 Så ut stjärna en. 557 00:23:58,120 --> 00:24:00,130 Så stjärnan betyder gå dit, i detta sammanhang. 558 00:24:00,130 --> 00:24:02,730 Ampersand betyder vad är adressen. 559 00:24:02,730 --> 00:24:05,000 Så stjärnan ett medel 1. 560 00:24:05,000 --> 00:24:09,590 Och skriv ut stjärnan b ger mig 2. 561 00:24:09,590 --> 00:24:15,750 >> Och låt mig anta, för tillfället, att åtminstone den kod som 562 00:24:15,750 --> 00:24:18,950 fortsätter att exekvera nu kan vara motiverade igenom på det sättet. 563 00:24:18,950 --> 00:24:21,150 Men vi ska se över denna idé snart. 564 00:24:21,150 --> 00:24:23,850 Så denna version av Swap är nu korrekt och tillåter 565 00:24:23,850 --> 00:24:26,650 oss att byta denna särskilda typ av data. 566 00:24:26,650 --> 00:24:29,120 >> Så några frågor då på Swap? 567 00:24:29,120 --> 00:24:29,890 På stjärna? 568 00:24:29,890 --> 00:24:30,690 På adress? 569 00:24:30,690 --> 00:24:33,270 Och du kommer att se, med Problemet set 4, sorts, 570 00:24:33,270 --> 00:24:37,310 men problemet set 5, definitivt, hur dessa saker är användbara och få mycket mer 571 00:24:37,310 --> 00:24:39,584 bekväm med dem, som följd. 572 00:24:39,584 --> 00:24:40,430 Vad som helst? 573 00:24:40,430 --> 00:24:40,930 Okej. 574 00:24:40,930 --> 00:24:44,350 Så malloc är, återigen, denna funktion som bara allokerar minne, minne 575 00:24:44,350 --> 00:24:45,330 tilldelning. 576 00:24:45,330 --> 00:24:47,024 Och varför är detta bra? 577 00:24:47,024 --> 00:24:48,940 Tja, hela tiden, du har använt malloc. 578 00:24:48,940 --> 00:24:52,230 Om du anser nu hur GetString verk, förmodligen, är det 579 00:24:52,230 --> 00:24:56,140 frågat någon för en bit av minne, när som helst användaren skriver en sträng 580 00:24:56,140 --> 00:24:59,040 in, eftersom vi verkligen visste inte, eftersom CS50 personal, 581 00:24:59,040 --> 00:25:02,710 hur stor de strängar som människor kommer att skriva kan vara. 582 00:25:02,710 --> 00:25:07,910 >> Så låt oss, för första gången, börjar skal tillbaka hur den CS50 biblioteket fungerar, 583 00:25:07,910 --> 00:25:10,990 med hjälp av ett par exempel som kommer att leda oss dit. 584 00:25:10,990 --> 00:25:15,300 Så om jag öppnar gedit och öppna upp scanf 0, 585 00:25:15,300 --> 00:25:17,055 vi kommer att se följande kod. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, finns på hemsidan för idag, har relativt få rader kod 588 00:25:23,530 --> 00:25:25,351 här, 14 genom 20. 589 00:25:25,351 --> 00:25:26,600 Och låt oss se vad den gör. 590 00:25:26,600 --> 00:25:28,920 Det förklarar en int, som kallas x. 591 00:25:28,920 --> 00:25:30,850 Den säger något i stil med, nummer tack. 592 00:25:30,850 --> 00:25:33,940 Och nu säger, scanf% i, och x. 593 00:25:33,940 --> 00:25:35,620 Så det finns en massa nya saker där. 594 00:25:35,620 --> 00:25:38,420 >> Men scanf, kan du typ av tro för som motsatsen till printf. 595 00:25:38,420 --> 00:25:40,090 printf naturligtvis utskrifter till skärmen. 596 00:25:40,090 --> 00:25:44,410 scanf slags skanningar från användarens tangentbords något han eller hon har skrivit. 597 00:25:44,410 --> 00:25:46,550 >> % I är precis som printf. 598 00:25:46,550 --> 00:25:49,410 Detta innebär förväntar användaren att skriva ett int. 599 00:25:49,410 --> 00:25:52,820 Och nu, varför tror du att jag kan passera scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Om syftet i livet för scanf är att få något från användaren, 602 00:25:57,770 --> 00:26:02,480 vad är meningen med passerar den, & x, nu? 603 00:26:02,480 --> 00:26:02,980 Yeah? 604 00:26:02,980 --> 00:26:03,896 >> PUBLIK: [ohörbart]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. MALAN: Exakt. 607 00:26:06,540 --> 00:26:12,900 Vad jag, människan, skriv in, min ingång kommer att sparas på den platsen. 608 00:26:12,900 --> 00:26:17,660 Det är inte tillräckligt, minns, att bara passera i x, för vi har sett redan, 609 00:26:17,660 --> 00:26:21,630 varje gång du passerar bara en rå variabel, som en int, till någon annan funktion, 610 00:26:21,630 --> 00:26:25,640 säker, det kan ändra på det variabel, men inte permanent. 611 00:26:25,640 --> 00:26:27,360 Det kan inte ha en effekt på Main. 612 00:26:27,360 --> 00:26:29,420 Det kan bara förändra sin egen lokala kopia. 613 00:26:29,420 --> 00:26:32,560 Men om man istället, du behöver inte ge mig den verkliga int, 614 00:26:32,560 --> 00:26:36,640 men du ger mig vägbeskrivning till att int jag nu, att vara scanf, 615 00:26:36,640 --> 00:26:41,050 säkert, kan jag följa det itu med och sätta ett nummer där 616 00:26:41,050 --> 00:26:43,280 så du har tillgång till det också. 617 00:26:43,280 --> 00:26:45,120 >> Så när jag kör det här programmet, låt oss se. 618 00:26:45,120 --> 00:26:49,660 Gör scanf 0 dot snedstreck, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Och om jag nu skriver ett nummer som 50, tack för 50. 620 00:26:54,030 --> 00:26:58,150 Om jag nu skriver ett nummer som negativ 1, för den negativa 1. 621 00:26:58,150 --> 00:27:04,200 Jag nu skriver ett nummer som 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Varför programmet ignorera mig? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Jo, för att helt enkelt, sa jag det att förvänta sig endast en int. 625 00:27:09,880 --> 00:27:10,380 Okej. 626 00:27:10,380 --> 00:27:11,630 Så det är en version av denna. 627 00:27:11,630 --> 00:27:16,600 Låt oss ta upp saker ett snäpp och föreslår att detta inte är bra. 628 00:27:16,600 --> 00:27:20,530 Och häri ligger ett mycket enkelt exempel om hur vi kan börja skriva kod 629 00:27:20,530 --> 00:27:24,450 att andra människor kan utnyttja eller kompromissa genom att göra dåliga saker. 630 00:27:24,450 --> 00:27:28,336 Så linje 16, så lika i anden till tidigare, 631 00:27:28,336 --> 00:27:29,960 men jag är inte förklara det int den här gången. 632 00:27:29,960 --> 00:27:32,970 Jag förklarar det röding stjärna, aka sträng. 633 00:27:32,970 --> 00:27:35,190 >> Men vad betyder det egentligen? 634 00:27:35,190 --> 00:27:38,790 Så om jag inte anger ett address-- och Jag kallar det godtyckligt, buffert, 635 00:27:38,790 --> 00:27:43,370 men jag kan kalla det är, att vara simple-- och då jag gör det, förklara för mig, 636 00:27:43,370 --> 00:27:48,630 om du kunde, baserat på tidigare logik, vad scanf gör i linje 18, 637 00:27:48,630 --> 00:27:55,000 Om passet% s och buffert, vilket är en adress? 638 00:27:55,000 --> 00:27:58,210 Vad är scanf, om man tillämpar exakt samma logik som version 0, 639 00:27:58,210 --> 00:28:00,640 ska försöka att göra här, när det användaren skriver något i? 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 >> PUBLIK: [ohörbart]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. MALAN: Exakt. 645 00:28:08,890 --> 00:28:11,577 Scanf, av logik tidigare, kommer att ta strängen 646 00:28:11,577 --> 00:28:13,410 att det mänskliga typbestämd in-- det nu en sträng, 647 00:28:13,410 --> 00:28:15,790 det är inte ett nummer, förmodligen, om han eller hon cooperates-- 648 00:28:15,790 --> 00:28:19,310 och det kommer att försöka sätta det sträng i minnet oavsett på vilken adress 649 00:28:19,310 --> 00:28:20,340 buffert anger. 650 00:28:20,340 --> 00:28:23,870 Och det här är bra, eftersom buffert verkligen är tänkt att vara en adress. 651 00:28:23,870 --> 00:28:30,470 >> Men jag hävdar detta program är buggy i en mycket allvarligt sätt, för vad värdet är 652 00:28:30,470 --> 00:28:31,330 buffert som standard? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Vad har jag initierat in? 655 00:28:34,790 --> 00:28:35,770 Vilken bit av minnet? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Jag har inte, eller hur? 658 00:28:38,620 --> 00:28:42,265 >> Så även om jag har tilldelats en char stjärna som inte längre kallas s, 659 00:28:42,265 --> 00:28:48,030 det istället kallas, buffer-- så Låt oss dra variabeln namn 660 00:28:48,030 --> 00:28:53,380 nu som buffer-- om jag har inte kallas getString eller malloc här, 661 00:28:53,380 --> 00:28:56,030 som effektivt innebär att buffert är bara några sopor värde. 662 00:28:56,030 --> 00:28:57,030 >> Nu vad betyder det? 663 00:28:57,030 --> 00:29:00,220 Det betyder att jag har berättat scanf att förvänta sig en sträng från användaren. 664 00:29:00,220 --> 00:29:01,300 Och vet du vad? 665 00:29:01,300 --> 00:29:03,883 Vad denna sak pekar att-- och jag drar frågetecken, 666 00:29:03,883 --> 00:29:07,060 men i verkligheten, det kommer att bli något som OX1, 2, 3, eller hur? 667 00:29:07,060 --> 00:29:10,730 Det är en falsk värde som bara råkar vara där från förr. 668 00:29:10,730 --> 00:29:13,440 Så med andra ord, det är som om bufferten är bara 669 00:29:13,440 --> 00:29:16,180 pekar på något i minnet. 670 00:29:16,180 --> 00:29:17,610 Jag har ingen aning om vad. 671 00:29:17,610 --> 00:29:24,130 >> Så om jag skriver in gabe nu, det kommer att försöka sätta g-a-b-e / 0 där. 672 00:29:24,130 --> 00:29:25,530 Men vem vet vad det är? 673 00:29:25,530 --> 00:29:27,480 Och i det förflutna, något gången vi har försökt att röra 674 00:29:27,480 --> 00:29:29,770 minne som inte tillhör för oss, vad som hänt? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Eller nästan varje gång. 677 00:29:32,870 --> 00:29:34,310 Segmente fel, eller hur? 678 00:29:34,310 --> 00:29:37,829 >> Denna pil, jag har ingen aning om var det är pekar. det är bara några slumpmässigt värde. 679 00:29:37,829 --> 00:29:40,370 Och naturligtvis, om man tolkar ett slumpmässigt värde som en adress, 680 00:29:40,370 --> 00:29:42,610 du kommer att gå till några random destination. 681 00:29:42,610 --> 00:29:46,810 Så gabe kanske faktiskt krasch mitt program i det här fallet. 682 00:29:46,810 --> 00:29:50,600 >> Så vad kan vi göra det är nästan lika illa? 683 00:29:50,600 --> 00:29:52,660 Tänk på detta tredje och sista exempel på scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Denna version är bättre på vilket sätt? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Om du är bekväm med det tidigare problem, det här är bättre. 688 00:30:01,400 --> 00:30:02,250 Varför? 689 00:30:02,250 --> 00:30:03,250 >> PUBLIK: [ohörbart]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. MALAN: Bra. 692 00:30:07,110 --> 00:30:09,970 Så här fallet av linje 16 är bättre, i den meningen 693 00:30:09,970 --> 00:30:12,030 att vi uttryckligen fördela en del minne. 694 00:30:12,030 --> 00:30:14,190 Vi använder inte malloc, vi använder vecka 2 695 00:30:14,190 --> 00:30:16,060 tillvägagångssätt för att bara förklara en matris. 696 00:30:16,060 --> 00:30:18,130 Och vi har sagt att en sträng är bara en rad av tecken, 697 00:30:18,130 --> 00:30:19,690 så detta är helt legitimt. 698 00:30:19,690 --> 00:30:22,910 Men det är, förstås, som du noterar, fast storlek, 16. 699 00:30:22,910 --> 00:30:25,440 >> Så det här programmet är helt säker, om jag skriver 700 00:30:25,440 --> 00:30:29,760 i en teckensträngar, två tecken strängar, 15 teckensträngar. 701 00:30:29,760 --> 00:30:34,970 Men så fort jag börjar skriva 16, 17, 18, 1000 teckensträngar, 702 00:30:34,970 --> 00:30:37,390 där den strängen kommer att hamna? 703 00:30:37,390 --> 00:30:39,570 Det kommer att hamna delvis här. 704 00:30:39,570 --> 00:30:42,820 Men vem vet vad är utanför gränserna 705 00:30:42,820 --> 00:30:44,270 av detta särskilda array? 706 00:30:44,270 --> 00:30:48,015 >> Det är som om jag har förklarade 16 lådor här. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Så i stället för att dra ut alla 16, vi ska bara låtsas att jag har dragit 16. 709 00:30:52,690 --> 00:30:56,540 Men om jag sedan försöker läsa en sträng det är mycket längre, liksom 50 tecken, 710 00:30:56,540 --> 00:31:01,270 Jag ska börja sätta a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Och det är förmodligen något annat minnessegment 712 00:31:04,916 --> 00:31:06,790 att, återigen, kan orsaka mitt program att krascha, 713 00:31:06,790 --> 00:31:10,600 eftersom jag inte har bett om något mer än bara 16 byte. 714 00:31:10,600 --> 00:31:12,260 >> Så vem bryr sig? 715 00:31:12,260 --> 00:31:13,880 Tja, här är CS50 biblioteket. 716 00:31:13,880 --> 00:31:17,220 Och de flesta av detta är bara liksom instruktioner upp överst. 717 00:31:17,220 --> 00:31:21,670 Den CS50 bibliotek, hela tiden, har haft denna linje i linje 52. 718 00:31:21,670 --> 00:31:23,680 Vi har sett typedef eller kommer du att se typedef 719 00:31:23,680 --> 00:31:27,930 i pset 4, som bara skapar en synonym vari char stjärnan kan vara mer 720 00:31:27,930 --> 00:31:29,290 enkelt till som sträng. 721 00:31:29,290 --> 00:31:31,540 Så detta är en av de några stödhjul 722 00:31:31,540 --> 00:31:34,120 vi har använt i hemlighet under huven. 723 00:31:34,120 --> 00:31:36,490 >> Under tiden, här är funktionen, getchar. 724 00:31:36,490 --> 00:31:38,190 Nu uppenbarligen, det finns ingen kropp till det. 725 00:31:38,190 --> 00:31:40,273 Och faktiskt, om jag håller rullning, det gör jag faktiskt inte 726 00:31:40,273 --> 00:31:42,080 ser några implementationer av dessa funktioner. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Som en sanity check, varför är det? 729 00:31:45,516 --> 00:31:46,795 >> PUBLIK: [ohörbart]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. MALAN: Ja. 731 00:31:47,670 --> 00:31:48,950 Så det här är rubrikfilen. 732 00:31:48,950 --> 00:31:52,520 Och huvudfiler innehåller prototyper, plus lite annat, tycks det, 733 00:31:52,520 --> 00:31:53,780 liknande typedefs. 734 00:31:53,780 --> 00:31:56,910 Men i CS50.c, som Prisjakt aldrig gett dig direkt, 735 00:31:56,910 --> 00:32:02,100 men har varit i CS50 apparaten alla den här gången, djupt inne i sina mappar, 736 00:32:02,100 --> 00:32:04,990 märker att det finns en hel gäng funktioner här. 737 00:32:04,990 --> 00:32:06,720 >> Faktum är, låt oss rulla nedåt. 738 00:32:06,720 --> 00:32:08,810 Låt oss bortse från de flesta av dem, för nu. 739 00:32:08,810 --> 00:32:12,670 Men bläddra ner till getInt och se hur getInt fungerar. 740 00:32:12,670 --> 00:32:13,890 Så här är getInt. 741 00:32:13,890 --> 00:32:17,727 Och om du någonsin verkligen brydde sig hur får int fungerar, här är dess dokumentation. 742 00:32:17,727 --> 00:32:19,560 Och bland de saker den säger är det talar om för dig 743 00:32:19,560 --> 00:32:21,340 vad de värdeintervall som den kan återvända. 744 00:32:21,340 --> 00:32:24,400 Det är i huvudsak negativt 2 miljarder till positiv 2 miljarder, ge eller ta. 745 00:32:24,400 --> 00:32:26,420 >> Och det visar sig, allt detta tid, även om vi har aldrig 746 00:32:26,420 --> 00:32:28,570 hade du kontrollera om det, Om något går fel, 747 00:32:28,570 --> 00:32:30,680 det visar sig att alla den här gången har getInt 748 00:32:30,680 --> 00:32:33,600 återvänder en speciell konstant, inte null, 749 00:32:33,600 --> 00:32:36,760 utan snarare int_max, vilket är bara en programmerare konvent. 750 00:32:36,760 --> 00:32:38,846 Det betyder här är ett speciellt värde. 751 00:32:38,846 --> 00:32:41,470 Se till att kontrollera för detta, bara om något går fel. 752 00:32:41,470 --> 00:32:43,261 Men vi har aldrig brytt med att hittills, 753 00:32:43,261 --> 00:32:45,200 eftersom igen, denna menas att förenkla. 754 00:32:45,200 --> 00:32:46,950 >> Men hur getInt får genomföras? 755 00:32:46,950 --> 00:32:48,450 Jo, man tar det inga argument. 756 00:32:48,450 --> 00:32:49,390 Vi vet att. 757 00:32:49,390 --> 00:32:50,820 Den returnerar en int. 758 00:32:50,820 --> 00:32:51,950 Vi vet att. 759 00:32:51,950 --> 00:32:54,460 Så hur fungerar det under huven? 760 00:32:54,460 --> 00:32:58,290 >> Så det finns uppenbarligen en oändlig slinga, åtminstone utseendet en. 761 00:32:58,290 --> 00:33:00,290 Lägg märke till att vi använder getString. 762 00:33:00,290 --> 00:33:04,000 Så det är intressant. getInt kallar vår egen funktion, getString. 763 00:33:04,000 --> 00:33:05,645 Och nu varför skulle detta vara fallet? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Varför blir jag defensiv här i linje 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Vad kan hända i linje 164, bara för att vara tydlig? 768 00:33:15,639 --> 00:33:16,930 Det är samma svar som tidigare. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Kan bara vara slut på minne. 771 00:33:20,089 --> 00:33:23,130 Något går fel med getString, vi måste kunna hantera det. 772 00:33:23,130 --> 00:33:27,070 Och anledningen till att jag inte återvänder null är att det tekniskt är null en pekare. 773 00:33:27,070 --> 00:33:29,120 getInt måste returnera en int. 774 00:33:29,120 --> 00:33:31,060 Så jag har godtyckligt beslutade, i huvudsak, 775 00:33:31,060 --> 00:33:34,600 att 2 miljarder, ge eller ta, går att vara ett speciellt värde som jag kan aldrig 776 00:33:34,600 --> 00:33:35,970 faktiskt få från användaren. 777 00:33:35,970 --> 00:33:39,930 Det är bara det ena värdet jag ska till spillo för att representera en felkod. 778 00:33:39,930 --> 00:33:41,540 >> Så nu, det blir lite finare. 779 00:33:41,540 --> 00:33:44,670 Och det är inte riktigt samma funktion som tidigare, men det är mycket lika. 780 00:33:44,670 --> 00:33:50,120 Så märker, förklarar jag här, i linje 172, både en int n och en char c. 781 00:33:50,120 --> 00:33:53,600 Sen använder jag denna funky linje, sscanf, som det visar sig 782 00:33:53,600 --> 00:33:55,990 inte igenom en sträng från tangentbordet. 783 00:33:55,990 --> 00:33:59,226 Den står en existerande sträng som användaren har redan skrivits in. 784 00:33:59,226 --> 00:34:02,100 Så jag har redan ringt getString, vilket betyder att jag har en sträng i minnet. 785 00:34:02,100 --> 00:34:05,020 sscanf är vad du skulle ringa en parsfunktion. 786 00:34:05,020 --> 00:34:07,760 Det ser ut på strängen jag har skrivit in, tecken för tecken, 787 00:34:07,760 --> 00:34:09,250 och gör något nyttigt. 788 00:34:09,250 --> 00:34:10,969 Denna sträng lagras i linje. 789 00:34:10,969 --> 00:34:13,560 Och jag vet att bara genom att gå backa upp här och säga: Åh, OK, 790 00:34:13,560 --> 00:34:15,143 Jag kallade det inte är den här gången, men linjen. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Och nu detta är lite annorlunda. 793 00:34:18,080 --> 00:34:22,480 Men det betyder i praktiken, av skäl vi något våg våra händer på i dag, 794 00:34:22,480 --> 00:34:26,070 att vi kontrollerar att se om användaren skrivit in 795 00:34:26,070 --> 00:34:29,909 och int och kanske ett annat tecken. 796 00:34:29,909 --> 00:34:33,610 Om användaren skrivit in en int, det är kommer att lagras i n, för att jag är 797 00:34:33,610 --> 00:34:36,739 passerar detta med adress, nytt trick som vi har sett i dag. 798 00:34:36,739 --> 00:34:41,570 Om användaren skrivit också i liknande 123x, att x 799 00:34:41,570 --> 00:34:45,060 kommer att hamna en bokstav i tecken c. 800 00:34:45,060 --> 00:34:48,739 >> Nu visar det sig att sscanf kommer att tala om för mig, intelligent, 801 00:34:48,739 --> 00:34:54,750 hur många variabler sscanf framgångsrikt kunna fylla. 802 00:34:54,750 --> 00:34:58,770 Så genom denna logik, om funktionen Jag genomförande är getInt, 803 00:34:58,770 --> 00:35:00,900 men jag kollar, potentiellt, för användaren 804 00:35:00,900 --> 00:35:04,190 att ha skrivit in en int följt av något annat, 805 00:35:04,190 --> 00:35:08,580 vad vill jag sscanf s returvärdet verkligen vara? 806 00:35:08,580 --> 00:35:10,950 Om syftet är att få bara en int från användaren? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Så om sscanf returer 2, vad betyder det? 809 00:35:19,300 --> 00:35:21,660 Användaren skrivit in något som, bokstavligen, 810 00:35:21,660 --> 00:35:24,770 123x, vilket är bara nonsens. 811 00:35:24,770 --> 00:35:27,490 Det är ett fel, och Jag vill kontrollera om det. 812 00:35:27,490 --> 00:35:32,960 >> Så om användaren skriver detta, genom denna logik, vad gör sscanf återvända, 813 00:35:32,960 --> 00:35:33,740 skulle du säga? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Så det kommer att gå tillbaka 2, eftersom 123 kommer att gå in här, 816 00:35:39,130 --> 00:35:41,580 och x kommer att hamna här. 817 00:35:41,580 --> 00:35:43,970 Men jag vill inte att x att få fylld. 818 00:35:43,970 --> 00:35:48,580 Jag vill sscanf bara lyckas fyller den första av dess variabler. 819 00:35:48,580 --> 00:35:52,490 Och så det är därför jag vill sscanf att returnera en. 820 00:35:52,490 --> 00:35:55,750 >> Och om detta är lite över huvudet för tillfället, det är helt bra. 821 00:35:55,750 --> 00:36:00,030 Inse dock att en av de värden av getInt och getString 822 00:36:00,030 --> 00:36:03,630 är att vi gör en fan av mycket felkontroll så här så 823 00:36:03,630 --> 00:36:07,130 att det hittills, kan du ganska mycket skriver något på tangentbordet, 824 00:36:07,130 --> 00:36:08,490 och vi kommer att fånga den. 825 00:36:08,490 --> 00:36:10,592 Och vi säkert, det personal, kommer definitivt inte 826 00:36:10,592 --> 00:36:13,300 vara källan till ett fel i ditt programmet, eftersom vi är på defensiven 827 00:36:13,300 --> 00:36:16,270 kontroll av alla de dumma saker som en användare kan göra, 828 00:36:16,270 --> 00:36:18,900 som att skriva en sträng, då du verkligen ville int. 829 00:36:18,900 --> 00:36:21,350 Så för nu-- vi kommer tillbaka till detta innan long-- 830 00:36:21,350 --> 00:36:23,710 men hela tiden, getString och getInt har 831 00:36:23,710 --> 00:36:29,950 varit under huven med hjälp av denna grundidé adresser i minnet. 832 00:36:29,950 --> 00:36:32,580 >> Så nu ska vi göra det hela lite mer användarvänliga. 833 00:36:32,580 --> 00:36:38,740 Som ni kanske minns, från Binky förra time-- om min mus kommer cooperate-- så 834 00:36:38,740 --> 00:36:42,560 Vi hade denna kod, som ärligt talat, är ganska meningslöst. 835 00:36:42,560 --> 00:36:45,330 Denna kod ger inget användbar, men det var det exempel 836 00:36:45,330 --> 00:36:48,330 som professor Parlante används för att representera 837 00:36:48,330 --> 00:36:51,840 vad som pågår i en Programmet omfattar minne. 838 00:36:51,840 --> 00:36:54,850 >> Så låt oss återberätta detta story super kort. 839 00:36:54,850 --> 00:36:58,720 Dessa två första raderna, i Engelska, vet vad, skulle du säga? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Precis i någorlunda mänskligt, men något tekniska termer, ta en stab. 842 00:37:05,430 --> 00:37:06,346 PUBLIK: [ohörbart]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. MALAN: OK, du är upprättandet adresser för din x och y variabler. 845 00:37:11,080 --> 00:37:15,520 Inte riktigt, eftersom x och y inte är variabler i traditionell mening. 846 00:37:15,520 --> 00:37:18,054 x och y är adresser eller kommer att lagra adressen. 847 00:37:18,054 --> 00:37:19,220 Så låt oss prova det här en gång till. 848 00:37:19,220 --> 00:37:21,010 Inte en dålig start, men. 849 00:37:21,010 --> 00:37:21,510 Yeah? 850 00:37:21,510 --> 00:37:22,426 >> PUBLIK: [ohörbart]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. MALAN: Bra. 853 00:37:24,840 --> 00:37:26,173 Jag tror det är lite renare. 854 00:37:26,173 --> 00:37:28,630 Deklarera två pekare, två heltal. 855 00:37:28,630 --> 00:37:30,150 Och vi kallar dem x och y. 856 00:37:30,150 --> 00:37:32,790 Eller om vi skulle dra detta som en bild, återigen, 857 00:37:32,790 --> 00:37:36,410 minns helt enkelt att alla vi gör med den första linjen 858 00:37:36,410 --> 00:37:39,690 drar en ruta som denna, med lite skräp värde i det, 859 00:37:39,690 --> 00:37:41,920 och kalla det X, sen en annan låda som denna, 860 00:37:41,920 --> 00:37:43,880 med några sopor värde i den, kalla det y. 861 00:37:43,880 --> 00:37:45,810 Vi har förklarat två pekare som slutligen 862 00:37:45,810 --> 00:37:47,860 kommer att lagra adressen till en int. 863 00:37:47,860 --> 00:37:49,170 Så det är alla där. 864 00:37:49,170 --> 00:37:53,290 >> Så när Binky gjorde detta, den lera precis såg ut så här. 865 00:37:53,290 --> 00:37:55,350 Och Nick bara typ av insvept pilarna, 866 00:37:55,350 --> 00:37:57,590 som om de inte pekar någonstans i synnerhet eftersom de är bara 867 00:37:57,590 --> 00:37:58,250 sopor värden. 868 00:37:58,250 --> 00:38:01,670 De är inte explicit initierad någonstans i synnerhet. 869 00:38:01,670 --> 00:38:03,980 >> Nu nästa rad av kod, minns, var det här. 870 00:38:03,980 --> 00:38:07,510 Så i någorlunda användarvänligt, men något teknisk engelska, 871 00:38:07,510 --> 00:38:09,790 vad är det här kodraden gör? 872 00:38:09,790 --> 00:38:10,391 Yeah? 873 00:38:10,391 --> 00:38:11,333 >> PUBLIK: [ohörbart]. 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 Den fördelning av bit av minne som är storleken på en int. 877 00:38:17,016 --> 00:38:18,140 Och det är halva svaret. 878 00:38:18,140 --> 00:38:20,056 Du svarade rätt halv av uttrycket. 879 00:38:20,056 --> 00:38:22,473 Vad som händer på vänster om likhetstecknet? 880 00:38:22,473 --> 00:38:22,972 Yeah? 881 00:38:22,972 --> 00:38:24,814 PUBLIK: Och delar den till variabeln x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. MALAN: Och delar den till variabeln x. 883 00:38:27,690 --> 00:38:31,650 Så för att Recap, höger allokerar tillräckligt med minne för att lagra en int. 884 00:38:31,650 --> 00:38:34,150 Men malloc specifikt returnerar adressen 885 00:38:34,150 --> 00:38:37,270 av denna bit av minnet, som du har just föreslagit får lagras i x. 886 00:38:37,270 --> 00:38:42,560 >> Så vad Nick gjorde förra gången med Binky är Han släpade att pekaren ut, leran, 887 00:38:42,560 --> 00:38:46,820 att peka nu på en vit bit av minnet som är lika med storleken på en int. 888 00:38:46,820 --> 00:38:49,360 Och faktiskt, det är tänkt att representera fyra byte. 889 00:38:49,360 --> 00:38:55,310 >> Nu, nästa kodrad gjorde detta, blir stjärn x 42. 890 00:38:55,310 --> 00:38:58,530 Så 42 är enkel på höger sida, meningen med livet. 891 00:38:58,530 --> 00:39:00,500 Vänster sida, betyder stjärna x vad? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Det kan också ha gone-- det är OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> PUBLIK: I grund och botten, gå till [ohörbart] 896 00:39:06,875 --> 00:39:07,750 DAVID J. MALAN: Bra. 897 00:39:07,750 --> 00:39:08,760 PUBLIK: [ohörbart]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. MALAN: Exakt. 899 00:39:09,760 --> 00:39:11,979 Vänster sida betyder gå till x. 900 00:39:11,979 --> 00:39:12,520 x är adressen. 901 00:39:12,520 --> 00:39:15,520 Det är som 33 Oxford Street, eller OX1. 902 00:39:15,520 --> 00:39:18,690 Och stjärnan x betyder gå till den itu med och sätta vad där? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Så ja, det är precis vad Nick gjorde. 905 00:39:21,290 --> 00:39:23,740 Han började med med, väsentligen, mentalt 906 00:39:23,740 --> 00:39:26,270 pekar ett finger mot x, efter pilen 907 00:39:26,270 --> 00:39:30,670 till den vita rutan till höger sidan, och sätta nummer 42 där. 908 00:39:30,670 --> 00:39:34,120 Men sedan det blev ett lite farligt, eller hur? 909 00:39:34,120 --> 00:39:35,860 Binky är på väg att förlora sitt huvud. 910 00:39:35,860 --> 00:39:39,465 >> Star y är lika med 13, otur, betyder vad? 911 00:39:39,465 --> 00:39:43,620 Så stjärniga y medel går till adressen i y. 912 00:39:43,620 --> 00:39:45,630 Men vad är adressen i y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Okej, det är skräp värde, eller hur? 915 00:39:49,440 --> 00:39:50,800 Jag ritade det som ett frågetecken. 916 00:39:50,800 --> 00:39:54,850 Nick drog det som en hoprullad pil. 917 00:39:54,850 --> 00:39:59,600 Och så fort du försöker gör stjärnan y, sade åka dit, 918 00:39:59,600 --> 00:40:03,872 men det finns inte en legitim adress, det är lite falsk plats, 919 00:40:03,872 --> 00:40:05,080 Programmet kommer att krascha. 920 00:40:05,080 --> 00:40:08,580 Och Binky huvud går att flyga bort här, som den gjorde. 921 00:40:08,580 --> 00:40:12,130 >> Så i slutändan, det här programmet var bara platta ut fel. 922 00:40:12,130 --> 00:40:13,540 Det var en buggy program. 923 00:40:13,540 --> 00:40:14,760 Och det behövde fastställas. 924 00:40:14,760 --> 00:40:18,260 Och det enda sättet, egentligen, för att åtgärda det skulle vara, till exempel, denna linje, 925 00:40:18,260 --> 00:40:21,010 som vi inte ens få till, eftersom programmet kraschade för tidigt. 926 00:40:21,010 --> 00:40:26,170 Men om vi skulle fixa det här, vad Effekten gör gör y lika x har? 927 00:40:26,170 --> 00:40:30,010 Tja, det i huvudsak pekar y på oavsett värde x pekar på. 928 00:40:30,010 --> 00:40:32,430 >> Så i Nick berättelse, eller Binky berättelse, både 929 00:40:32,430 --> 00:40:34,640 x och y pekade på den vita bit av minnet, 930 00:40:34,640 --> 00:40:38,300 så att, slutligen, när du do stjärnan y är lika med 13 igen, 931 00:40:38,300 --> 00:40:43,080 du hamnar sätta 13 i lämplig plats. 932 00:40:43,080 --> 00:40:47,640 Så alla dessa linjer är perfekt legitimt, utom den här, 933 00:40:47,640 --> 00:40:51,730 när det hände innan du faktiskt tilldelats y något värde. 934 00:40:51,730 --> 00:40:54,290 >> Nu tack och lov, du behöver inte måste resonera igenom alla 935 00:40:54,290 --> 00:40:56,560 av dessa typer av frågor på egen hand. 936 00:40:56,560 --> 00:40:59,310 Låt mig gå vidare och öppna upp ett terminalfönster här 937 00:40:59,310 --> 00:41:03,050 och öppna upp för en liten stund, en super kort program som 938 00:41:03,050 --> 00:41:04,360 också är en slags meningslöst. 939 00:41:04,360 --> 00:41:05,152 Det är fult. 940 00:41:05,152 --> 00:41:06,610 Det behöver inte uppnå något användbart. 941 00:41:06,610 --> 00:41:10,180 Men det visar frågor minne, så låt oss ta en titt. 942 00:41:10,180 --> 00:41:11,830 >> Main, super enkelt. 943 00:41:11,830 --> 00:41:14,830 Den uppmanar tydligen en funktion, f och sedan returnerar 0. 944 00:41:14,830 --> 00:41:16,310 Det är typ av svårt att förstöra detta. 945 00:41:16,310 --> 00:41:18,540 Så Main är ganska bra, än så länge. 946 00:41:18,540 --> 00:41:20,100 >> Så f är problematiskt. 947 00:41:20,100 --> 00:41:22,120 Och bara inte lägga mycket möda på att namnge den 948 00:41:22,120 --> 00:41:23,990 här, för att hålla fokus på koden. 949 00:41:23,990 --> 00:41:25,740 f har två rader. 950 00:41:25,740 --> 00:41:27,610 Och låt oss se vad som nu händer. 951 00:41:27,610 --> 00:41:29,840 Så å ena sidan här-- och låt mig göra 952 00:41:29,840 --> 00:41:32,680 Detta överensstämmer med tidigare example-- å ena sidan, 953 00:41:32,680 --> 00:41:35,830 den vänstra sidan är gör vad, på engelska? 954 00:41:35,830 --> 00:41:36,493 Det är-- 955 00:41:36,493 --> 00:41:37,701 PUBLIK: Att skapa en pekare. 956 00:41:37,701 --> 00:41:40,830 DAVID J. MALAN: Att skapa en pekare till en int och kalla det x. 957 00:41:40,830 --> 00:41:43,789 Så det skapar en av dessa boxar Jag håller rita på pekskärmen. 958 00:41:43,789 --> 00:41:45,913 Och nu, på den högra sida, malloc, naturligtvis, 959 00:41:45,913 --> 00:41:47,420 avsätter en del av minnet. 960 00:41:47,420 --> 00:41:49,989 Och bara för att vara tydlig, hur mycket minne är det tydligen 961 00:41:49,989 --> 00:41:52,030 tilldela, om du bara slags gör matten här? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Så det är 40 byte. 964 00:41:54,040 --> 00:41:57,400 Och jag vet att bara för att jag vet att en int å CS50 apparaten åtminstone 965 00:41:57,400 --> 00:41:58,060 är fyra byte. 966 00:41:58,060 --> 00:41:59,610 Så 10 gånger 4 är 40. 967 00:41:59,610 --> 00:42:04,924 Så detta lagrar en x, adressen den första av 40 Ints som 968 00:42:04,924 --> 00:42:07,340 har tilldelats utrymme tillbaka, att backa, backa, till baksidan. 969 00:42:07,340 --> 00:42:08,470 >> Och det är det som är nyckeln om malloc. 970 00:42:08,470 --> 00:42:11,261 Det tar inte en lite minne Här, lite här, lite här. 971 00:42:11,261 --> 00:42:14,220 Det ger dig en bit av minnet, intill varandra, från den operativa 972 00:42:14,220 --> 00:42:15,240 systemet. 973 00:42:15,240 --> 00:42:18,500 >> Nu vad om det här, x fäste 10 är lika med 0? 974 00:42:18,500 --> 00:42:19,470 Godtyckligt kodrad. 975 00:42:19,470 --> 00:42:21,100 Det behöver inte uppnå något användbart. 976 00:42:21,100 --> 00:42:26,128 Men det är intressant, eftersom x bygel 10--? 977 00:42:26,128 --> 00:42:26,628 Yeah? 978 00:42:26,628 --> 00:42:27,912 >> PUBLIK: [ohörbart]? 979 00:42:27,912 --> 00:42:30,500 >> David J. MALAN: x bygel 10 inte behöver vara noll. 980 00:42:30,500 --> 00:42:35,070 Noll detalj bara kommer in i bilden med strängar, vid slutet av en sträng. 981 00:42:35,070 --> 00:42:36,700 Men en bra tanke. 982 00:42:36,700 --> 00:42:39,615 >> Hur stor är denna matris, även även om jag har tilldelats 40 bytes? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Det är 0 till nio, eller hur? 985 00:42:43,690 --> 00:42:45,120 Det är 10 Ints, totalt. 986 00:42:45,120 --> 00:42:48,790 40 byte, men 10 ints, indexeras 0 till 0. 987 00:42:48,790 --> 00:42:50,930 >> Så vad är att x fäste 10? 988 00:42:50,930 --> 00:42:53,090 Det är faktiskt en del okänt sopor värde. 989 00:42:53,090 --> 00:42:54,780 Det är minnet som inte tillhör mig. 990 00:42:54,780 --> 00:42:59,650 Jag ska inte röra det byte nummer 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Jag ska lite för långt. 992 00:43:01,420 --> 00:43:04,490 >> Och faktiskt, om jag kör det här program, kan det mycket väl krascha. 993 00:43:04,490 --> 00:43:05,790 Men ibland, vi har tur. 994 00:43:05,790 --> 00:43:07,706 Och så bara för att visa detta-- och ärligt talat, 995 00:43:07,706 --> 00:43:11,000 du aldrig veta innan du gör det-- låt oss köra. 996 00:43:11,000 --> 00:43:12,480 Det faktiskt inte krascha. 997 00:43:12,480 --> 00:43:15,032 >> Men om jag ändrar detta, för exempel vara som 1000, 998 00:43:15,032 --> 00:43:16,740 för att göra detta verkligen avsiktlig, låt oss se 999 00:43:16,740 --> 00:43:18,710 om vi kan få det att krascha den här gången. 1000 00:43:18,710 --> 00:43:20,070 OK, det inte krascha. 1001 00:43:20,070 --> 00:43:22,600 Vad sägs om 100.000? 1002 00:43:22,600 --> 00:43:25,000 Låt oss göra om det, och nu kör den. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Phew. 1005 00:43:25,960 --> 00:43:26,460 Okej. 1006 00:43:26,460 --> 00:43:29,090 Så uppenbarligen återigen, dessa segment av minnet, så att säga, 1007 00:43:29,090 --> 00:43:32,660 är ganska stora, så vi kan ha tur och om igen. 1008 00:43:32,660 --> 00:43:36,510 Men till slut, när du får löjligt och verkligen gå långt ut på skärmen, 1009 00:43:36,510 --> 00:43:39,120 du rör minne som verkligen, verkligen tillhör inte dig. 1010 00:43:39,120 --> 00:43:40,870 >> Men ärligt talat, dessa typer av buggar kommer 1011 00:43:40,870 --> 00:43:43,020 att vara svårare och svårare att räkna ut på egen hand. 1012 00:43:43,020 --> 00:43:47,880 Men tack och lov, som programmerare, vi har verktyg som tillåter oss att göra detta för oss. 1013 00:43:47,880 --> 00:43:50,140 Så detta är kanske en av de värsta program, 1014 00:43:50,140 --> 00:43:52,060 ännu fulare än gdb produktion. 1015 00:43:52,060 --> 00:43:55,670 Men det har alltid en linje eller två som är super bra. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind är ett program som hjälper du inte felsöka ett program, per se, 1017 00:44:00,310 --> 00:44:03,500 men finner minnesrelaterade problem, specifikt. 1018 00:44:03,500 --> 00:44:07,590 Det kommer automatiskt att köra din kod för du leta efter åtminstone två saker. 1019 00:44:07,590 --> 00:44:10,680 Ett, har du gjort något oavsiktlig liknande kontakten minne 1020 00:44:10,680 --> 00:44:11,980 som inte tillhör dig? 1021 00:44:11,980 --> 00:44:13,590 Det kommer att hjälpa dig att hitta dessa fall. 1022 00:44:13,590 --> 00:44:15,710 >> Och två, kommer det att hjälpa du hittar något som kallas 1023 00:44:15,710 --> 00:44:19,270 minnesläckor, vilket vi har helt ignoreras, naivt, 1024 00:44:19,270 --> 00:44:21,380 under en tid och tänkt. 1025 00:44:21,380 --> 00:44:23,140 Men det visar sig, alla denna tid, närhelst 1026 00:44:23,140 --> 00:44:26,620 du har ringt getString in så många av våra program, 1027 00:44:26,620 --> 00:44:28,930 du frågar operativsystemet system för minne, 1028 00:44:28,930 --> 00:44:32,070 men du har någon minnesbild av att någonsin ge det 1029 00:44:32,070 --> 00:44:36,169 tillbaka, gör unalloc, eller gratis, som det kallas. 1030 00:44:36,169 --> 00:44:37,960 Nej, för vi har aldrig bett dig att göra det. 1031 00:44:37,960 --> 00:44:41,250 >> Men all denna tid, de program du har skrivit i C 1032 00:44:41,250 --> 00:44:43,800 har läcker minne, frågar rörelse 1033 00:44:43,800 --> 00:44:46,190 Systemet för allt fler minne för stråkar och allt, 1034 00:44:46,190 --> 00:44:47,870 men aldrig lämna tillbaka den. 1035 00:44:47,870 --> 00:44:50,080 Och nu detta är lite av en överförenkling, 1036 00:44:50,080 --> 00:44:53,550 men om du någonsin köra din Mac eller din dator under en längre tid, öppning 1037 00:44:53,550 --> 00:44:55,790 massor av program, kanske stänga program, 1038 00:44:55,790 --> 00:44:57,795 och även om din Datorn har inte kraschat, 1039 00:44:57,795 --> 00:45:01,690 det blir så mycket långsammare, som om det är riktigt 1040 00:45:01,690 --> 00:45:04,290 använder mycket minne eller källor, även om, 1041 00:45:04,290 --> 00:45:06,070 om du inte ens röra tangentbordet, 1042 00:45:06,070 --> 00:45:10,430 som kunde vara-- men inte always-- kunde vara att programmen du kör 1043 00:45:10,430 --> 00:45:11,920 har själva minnesläckor. 1044 00:45:11,920 --> 00:45:15,645 Och de håller ber operativsystemet för mer och mer minne, men glömmer det, 1045 00:45:15,645 --> 00:45:18,470 faktiskt inte använder den, men Därför tar minnet bort 1046 00:45:18,470 --> 00:45:20,500 från andra program som kanske vill det. 1047 00:45:20,500 --> 00:45:23,940 Så det är en vanlig förklaring. 1048 00:45:23,940 --> 00:45:25,940 Nu här är där Valgrind s utsignal är helt 1049 00:45:25,940 --> 00:45:29,290 ohyggliga till de mindre och bekvämare lika. 1050 00:45:29,290 --> 00:45:32,690 Men det intressanta grejer är rätt upp här. 1051 00:45:32,690 --> 00:45:37,060 Det säger mig en ogiltig skrivning av storlek fyra händer i det här programmet, 1052 00:45:37,060 --> 00:45:40,640 i synnerhet, på rad 21 i memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Om jag går till rad 21, hm, det faktiskt är en ogiltig skrivning av storlek fyra. 1054 00:45:45,450 --> 00:45:46,250 Varför storlek fyra? 1055 00:45:46,250 --> 00:45:49,500 Nåväl, detta number-- och det skulle kunna vara anything-- är en int. 1056 00:45:49,500 --> 00:45:50,450 Så det är fyra byte. 1057 00:45:50,450 --> 00:45:52,550 Så jag sätter fyra byte där de hör inte. 1058 00:45:52,550 --> 00:45:55,080 Det är vad Valgrind är faktiskt talar om för mig. 1059 00:45:55,080 --> 00:45:57,600 Dessutom kommer det också säg mig, så vi får se, 1060 00:45:57,600 --> 00:46:01,490 som du kör det i en framtida pset, om och när du har läckt minne, vilket faktiskt 1061 00:46:01,490 --> 00:46:05,300 Jag har, för jag har ringt malloc, men jag har faktiskt inte 1062 00:46:05,300 --> 00:46:08,010 heter, i det här fallet, gratis, som vi så småningom får se 1063 00:46:08,010 --> 00:46:09,830 är motsatsen till malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Så nu, tror jag, ett sista exempel. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Så här är lite mer svårbegripliga, men det är kanske 1068 00:46:16,690 --> 00:46:19,180 den största anledningen till var försiktig med minnet, 1069 00:46:19,180 --> 00:46:24,490 och anledningen till att många program och / eller webbservrar, även till denna dag, 1070 00:46:24,490 --> 00:46:28,200 övertas av skurkar någonstans på internet som är på något sätt 1071 00:46:28,200 --> 00:46:33,390 skicka falska paket till din server försöker kompromissa dina konton, 1072 00:46:33,390 --> 00:46:36,420 eller ta dina data, eller bara allmänhet tar över en maskin. 1073 00:46:36,420 --> 00:46:38,910 Buffer overflow, som namnet antyder, medel 1074 00:46:38,910 --> 00:46:40,740 fyllda inte en int, men en buffert. 1075 00:46:40,740 --> 00:46:43,490 Och en buffert är bara ett finare sätt att säga att det är en massa minne. 1076 00:46:43,490 --> 00:46:46,710 >> Och faktiskt, ringde jag en sträng före buffert, istället för s. 1077 00:46:46,710 --> 00:46:49,234 För om det är en buffert, som i YouTube mening, 1078 00:46:49,234 --> 00:46:52,400 eller någon tid som du tittar på en video, du kanske har sett ordet buffring, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, punkt. 1080 00:46:53,040 --> 00:46:54,240 Det är otroligt irriterande. 1081 00:46:54,240 --> 00:46:55,990 Och det betyder bara att videospelare 1082 00:46:55,990 --> 00:46:58,710 försöker ladda ner massor av byte, massor av byte 1083 00:46:58,710 --> 00:47:00,170 från en video från Internet. 1084 00:47:00,170 --> 00:47:02,920 Men det är långsam, så det försöker att ladda ner ett gäng av dem 1085 00:47:02,920 --> 00:47:06,430 att fylla en buffert, en behållare, så att du har tillräckligt med byte som den kan då 1086 00:47:06,430 --> 00:47:09,174 visa videon, utan paus hela tiden. 1087 00:47:09,174 --> 00:47:11,340 Men det visar sig, kan du ha en buffert för detta stora. 1088 00:47:11,340 --> 00:47:15,710 Men försök att sätta denna mycket data i det, och mycket dåliga saker kan hända. 1089 00:47:15,710 --> 00:47:22,780 Så till exempel, låt oss titta på denna slutliga teaser av ett exempel. 1090 00:47:22,780 --> 00:47:24,720 Detta är ett annat program att det vid första anblicken, 1091 00:47:24,720 --> 00:47:26,540 inte göra något super bra. 1092 00:47:26,540 --> 00:47:29,590 Det har fått en huvudfunktion som anropar den funktionen, f. 1093 00:47:29,590 --> 00:47:36,640 Och den funktionen, f, här uppe, har en char array, som kallas c, i storlek 12. 1094 00:47:36,640 --> 00:47:39,340 Och då är det med hjälp av denna ny funktion kallad strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Det visar sig att, med denna enkla, enkel rad kod, bara två rader, 1097 00:47:45,190 --> 00:47:49,130 Vi har gjort min hela programmet, och därmed hela min dator, 1098 00:47:49,130 --> 00:47:54,000 och mitt användarkonto och min hårda köra potentiellt sårbara för alla 1099 00:47:54,000 --> 00:47:58,170 som vet och är tillräckligt bra för att köra detta program med en viss kommandorad 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 Med andra ord, om denna onde sätter insida argvargv [1] genom att skriva 1102 00:48:03,400 --> 00:48:08,750 vid tangentbordet en mycket speciellt utformad sträng, inte abc, 123, men i huvudsak 1103 00:48:08,750 --> 00:48:15,180 binära symboler som representerar körbara kod, ett program som han eller hon skrev, 1104 00:48:15,180 --> 00:48:19,190 med denna enkla program, vilket är representativ för tusentals program 1105 00:48:19,190 --> 00:48:23,610 som är lika sårbar, förmodar, han eller hon kan slutligen bort alla 1106 00:48:23,610 --> 00:48:26,680 filerna på min hårddisk, få en blinkande prompt så att han eller hon kan 1107 00:48:26,680 --> 00:48:30,170 skriva kommandon på egen hand, maila alla filer till mig själv. 1108 00:48:30,170 --> 00:48:34,660 Allt som jag kan göra, han eller hon kan göra med denna kod. 1109 00:48:34,660 --> 00:48:36,575 >> Vi kommer inte riktigt lösa detta ännu. 1110 00:48:36,575 --> 00:48:38,700 Och faktiskt, det kommer att innebära en liten bild 1111 00:48:38,700 --> 00:48:41,470 så här, som vi snart kommer att förstå allt bättre. 1112 00:48:41,470 --> 00:48:44,480 Men för idag, låt oss sluta den vad är, förhoppningsvis, en något mer 1113 00:48:44,480 --> 00:48:48,360 förståe XKCD skämt, tills vi återupptar nästa gång. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Okej. 1116 00:48:51,600 --> 00:48:53,446 Vi ses på onsdag. 1117 00:48:53,446 --> 00:48:54,754 >> [MUSIK SPELA] 1118 00:48:54,754 --> 00:48:57,790 >> Speak: Och nu, djupt tankar, av Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Minnet är som att hoppa in i en hög med gyllene löv på en söndag eftermiddag. 1121 00:49:04,770 --> 00:49:09,000 Vind blåser, gungade din hair-- åh, jag saknar dagarna when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [LAUGHTER] 1124 00:49:12,650 --> 00:49:13,750