1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Musik spiller] 3 00:00:11,261 --> 00:00:12,640 >> David J. MALAN: Okay. 4 00:00:12,640 --> 00:00:14,525 Dette er CS50. 5 00:00:14,525 --> 00:00:16,009 Og dette er starten på ugen 5. 6 00:00:16,009 --> 00:00:18,050 Og som du måske har bemærket, noget af det materiale 7 00:00:18,050 --> 00:00:21,050 er at få en lidt mere komplekset, lidt tættere. 8 00:00:21,050 --> 00:00:24,560 >> Og det er meget let, især hvis du har haft for vane i nogen tid, 9 00:00:24,560 --> 00:00:28,600 at være at forsøge at skrible ned det meste noget, vi gør, vi siger i klassen. 10 00:00:28,600 --> 00:00:31,626 Men indse, det er måske ikke den ideelle pædagogisk tilgang 11 00:00:31,626 --> 00:00:34,250 at lære denne form for materiale, og materiale mere generelt. 12 00:00:34,250 --> 00:00:37,250 Og så vi er glade for at meddele, at CS50 egen Gheng 13 00:00:37,250 --> 00:00:39,780 Gong er begyndt at forberede en kanonisk sæt af noter 14 00:00:39,780 --> 00:00:42,100 for kurset, håbet om hvilket er, at man disse 15 00:00:42,100 --> 00:00:44,030 ikke blot tjene som en reference og en ressource 16 00:00:44,030 --> 00:00:47,410 for at gennemgå materiale og går tilbage gennem materiale, der kan have 17 00:00:47,410 --> 00:00:51,230 undslap dig første gang omkring, men også for at jeres hoveder kan være mere 18 00:00:51,230 --> 00:00:53,740 op end ned, når det drejer sig tid til at belære, 19 00:00:53,740 --> 00:00:56,960 så du kan engagere mere eftertænksomt, som 20 00:00:56,960 --> 00:00:59,170 modsætning til mere scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Med det sagt, hvad du finder på hjemmesiden er sådanne dokumenter som dette. 22 00:01:02,510 --> 00:01:04,660 Og varsel, øverst til venstre, der er ikke kun en indholdsfortegnelse, 23 00:01:04,660 --> 00:01:06,920 men også tid koder, vil straks hoppe dig 24 00:01:06,920 --> 00:01:09,077 til den relevante del i video online. 25 00:01:09,077 --> 00:01:11,410 Og hvad Chang her har gjort er væsentlige, dokumenterede 26 00:01:11,410 --> 00:01:13,340 hvad der skete i denne særlig forelæsning. 27 00:01:13,340 --> 00:01:16,370 Og mange af forelæsningerne er allerede er online nu med denne webadresse. 28 00:01:16,370 --> 00:01:20,110 Og vi vil fortsætte med at skrive resten af dem, der ved udgangen af ​​denne uge, 29 00:01:20,110 --> 00:01:22,380 så drage fordel af denne ressource. 30 00:01:22,380 --> 00:01:25,740 >> Så uden videre, vi begyndte at skrælle 31 00:01:25,740 --> 00:01:28,180 det lag, der har været streng i nogen tid. 32 00:01:28,180 --> 00:01:30,670 Og hvad gjorde vi sige en streng faktisk er i sidste uge? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Så char stjerne. 35 00:01:32,900 --> 00:01:34,900 Og char stjerne, godt, hvad gjorde det egentlig? 36 00:01:34,900 --> 00:01:37,150 Nå, al denne tid, hvis vi har krævet en funktion, 37 00:01:37,150 --> 00:01:40,450 Ligesom getString og opbevaring den såkaldte afkast 38 00:01:40,450 --> 00:01:42,910 værdi getString i en variable-- det hedder 39 00:01:42,910 --> 00:01:47,721 S Type string-- vi har skrevet den linje kode deroppe ovenfor. 40 00:01:47,721 --> 00:01:49,970 Og det er kun, når jeg ser min håndskrift forstørret her 41 00:01:49,970 --> 00:01:51,930 gør jeg indse, hvor grusomme dette er. 42 00:01:51,930 --> 00:01:54,180 >> Men lad os antage, på højre side 43 00:01:54,180 --> 00:01:57,070 er ikke desto mindre en rimelig skildring af, hvad der er 44 00:01:57,070 --> 00:01:58,880 stået på alt dette tid med getString. 45 00:01:58,880 --> 00:02:00,380 getString naturligvis bliver en streng. 46 00:02:00,380 --> 00:02:01,691 Men hvad betyder det egentlig? 47 00:02:01,691 --> 00:02:04,190 Det betyder, at det får en luns af hukommelse fra operativsystemet 48 00:02:04,190 --> 00:02:06,040 ved at kalde en funktion, kaldet malloc. 49 00:02:06,040 --> 00:02:07,390 Men mere om det senere. 50 00:02:07,390 --> 00:02:09,139 Og så er det udfylder at bid af hukommelse 51 00:02:09,139 --> 00:02:11,764 med bogstaverne brugeren har indtastet efterfulgt af naturligvis 52 00:02:11,764 --> 00:02:14,800 en null-tegn, eller backslash nul til allersidst. 53 00:02:14,800 --> 00:02:18,280 >> I mellemtiden, på venstre side af denne historie, al denne tid, 54 00:02:18,280 --> 00:02:20,850 vi har erklæret en variabel, ligesom sek. 55 00:02:20,850 --> 00:02:24,770 Og denne variabel er, hvad der nu vil begynde at kalde en pegepind. 56 00:02:24,770 --> 00:02:29,190 Det er ikke en kasse inde i hvilke vi sætter strengen, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 men vi sætter i kvadratet boksen til venstre, hvad der præcist? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Ja? 60 00:02:35,390 --> 00:02:37,118 >> PUBLIKUM: Adressen på hvor det er placeret i hukommelsen. 61 00:02:37,118 --> 00:02:38,118 >> David J. MALAN: Præcis. 62 00:02:38,118 --> 00:02:40,690 Den adresse, hvor Daven er placeret i hukommelsen. 63 00:02:40,690 --> 00:02:44,650 Og ikke hvor alle Daven ligger, per se, men specifikt adresse 64 00:02:44,650 --> 00:02:45,150 af hvad? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Ja? 67 00:02:46,810 --> 00:02:47,460 >> Publikum: Første karakter. 68 00:02:47,460 --> 00:02:50,209 >> David J. MALAN: Det første tegn i Daven, som i dette tilfælde, 69 00:02:50,209 --> 00:02:53,820 Jeg foreslog var vilkårligt og urealistisk 1 OX1, 70 00:02:53,820 --> 00:02:55,910 som netop betyder hexadecimale tal 1. 71 00:02:55,910 --> 00:02:57,993 Men det er nok at gå at være en langt større tal 72 00:02:57,993 --> 00:03:01,260 at vi måske drage med en 0x som et præfiks, 73 00:03:01,260 --> 00:03:02,806 repræsenterer en hexadecimal karakter. 74 00:03:02,806 --> 00:03:05,930 Og fordi vi ikke brug for at vide, hvor resten af ​​tegnene i Daven 75 00:03:05,930 --> 00:03:09,860 er, på grund af det enkle design beslutning, der blev lavet for mange år siden? 76 00:03:09,860 --> 00:03:10,548 Ja? 77 00:03:10,548 --> 00:03:11,651 >> Publikum: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 David J. MALAN: Ja, præcis. 79 00:03:12,900 --> 00:03:18,100 Backslash 0 har du mulighed, omend i lineær tid, til at krydse streng, 80 00:03:18,100 --> 00:03:20,400 gå fra venstre mod højre, med en for-løkke, eller et stykke 81 00:03:20,400 --> 00:03:22,608 løkke, eller noget lignende det, og bestemme, åh, her 82 00:03:22,608 --> 00:03:24,751 er i slutningen af ​​denne streng. 83 00:03:24,751 --> 00:03:27,000 Så med blot den adresse begyndelsen af ​​en streng, 84 00:03:27,000 --> 00:03:30,290 Vi kan få adgang til i sin helhed det, fordi alt dette samtidig, 85 00:03:30,290 --> 00:03:32,030 en streng har netop været en char stjerne. 86 00:03:32,030 --> 00:03:36,370 >> Så det er sikkert fint at fortsætte med at bruge det CS50 bibliotek og denne abstraktion, 87 00:03:36,370 --> 00:03:38,440 så at sige, men vi vil begynde at se præcis 88 00:03:38,440 --> 00:03:41,230 hvad der er foregået på under hele dette tidspunkt. 89 00:03:41,230 --> 00:03:45,260 Så du måske husker dette eksempel, også fra sidste gang, sammenligne 0, 90 00:03:45,260 --> 00:03:47,300 som faktisk ikke sammenligne. 91 00:03:47,300 --> 00:03:49,070 Men vi begyndte at løse dette. 92 00:03:49,070 --> 00:03:52,020 >> Men som måske en genopfriskningskursus, kan jeg friste nogen 93 00:03:52,020 --> 00:03:54,261 i en lyserød elefant dag, også lavet af Chang? 94 00:03:54,261 --> 00:03:55,760 Hvad med dig foran? [Uhørligt]. 95 00:03:55,760 --> 00:03:56,660 Kom op. 96 00:03:56,660 --> 00:03:58,740 >> Og i mellemtiden, som du kommer op, lad os 97 00:03:58,740 --> 00:04:01,670 overveje for bare et øjeblik, hvad denne kode blev faktisk gør. 98 00:04:01,670 --> 00:04:04,917 Det er at erklære to variabler op top, s og t, og kalder getString. 99 00:04:04,917 --> 00:04:08,250 Dette er ikke et meget brugervenligt program, fordi det ikke fortælle dig, hvad du skal gøre. 100 00:04:08,250 --> 00:04:10,541 Men lad os bare antage, at vi er fokus på den saftige side. 101 00:04:10,541 --> 00:04:14,470 Og så gør vi, hvis S er lig lig t, bør det sige printf, 102 00:04:14,470 --> 00:04:16,170 du har skrevet det samme. 103 00:04:16,170 --> 00:04:16,670 Hej. 104 00:04:16,670 --> 00:04:17,050 Hvad er dit navn? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 David J. MALAN: Janelle, rart at møde dig. 107 00:04:19,529 --> 00:04:21,800 Så din udfordring på hånd for denne elefant 108 00:04:21,800 --> 00:04:25,230 er først at tegne et billede af, hvad der er være repræsenteret i de første to 109 00:04:25,230 --> 00:04:25,970 linjer. 110 00:04:25,970 --> 00:04:28,139 Så s og t kan være repræsenterede hvordan på skærmen? 111 00:04:28,139 --> 00:04:30,680 Og du kan bare trække det med fingeren på denne storskærm. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Så der er to halvdele til hver side af ligningen. 114 00:04:34,510 --> 00:04:37,760 Så der er s til venstre, og derefter getString til højre. 115 00:04:37,760 --> 00:04:40,540 Og så er der t til venstre, og derefter getString til højre. 116 00:04:40,540 --> 00:04:42,630 Så hvordan kan vi begynde tegne et billede, der 117 00:04:42,630 --> 00:04:46,340 repræsenterer, hvad der foregår her i hukommelsen, ville du sige? 118 00:04:46,340 --> 00:04:49,150 Og lad mig fortælle dig forklare hvad du laver, 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 Nå, først, det ville være at spørge dig at få input streng. 121 00:04:58,890 --> 00:05:00,439 Og det ville store-- åh, undskyld. 122 00:05:00,439 --> 00:05:01,230 David J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Godt. 124 00:05:01,730 --> 00:05:03,330 Og dette kaldes hvad? 125 00:05:03,330 --> 00:05:03,950 Åh, OK. 126 00:05:03,950 --> 00:05:04,450 Keep going. 127 00:05:04,450 --> 00:05:05,575 Jeg ville ikke afbryde. 128 00:05:05,575 --> 00:05:07,060 Janelle: Undskyld. 129 00:05:07,060 --> 00:05:14,237 Så det ville input det ind adressen af-- ikke sikker. 130 00:05:14,237 --> 00:05:17,320 Jeg kan ikke ligefrem huske nummeret, men jeg tror, ​​det var begyndt med 0. 131 00:05:17,320 --> 00:05:18,420 >> David J. MALAN: Det er i orden, fordi jeg gjorde tallene op, 132 00:05:18,420 --> 00:05:19,650 så der er ingen rigtige svar. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Fra og med 0 bue. 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 Selvfølgelig. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: Og hvis var ligesom blot en to-letter-- 137 00:05:28,295 --> 00:05:30,496 >> David J. MALAN: OK, tilbage til dig. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Så element 0, og derefter elementet 1 eller elementet 2. 139 00:05:33,629 --> 00:05:36,670 David J. MALAN: Og hvilke stykke billedet tegner du lige nu? 140 00:05:36,670 --> 00:05:37,690 Opfordringen til getString? 141 00:05:37,690 --> 00:05:38,830 Eller erklæringen om s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Erklæringen af S, tror jeg. 143 00:05:42,890 --> 00:05:45,980 Åh, getString, fordi det ville indlæses i hver [? område. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. MALAN: Godt. 145 00:05:46,510 --> 00:05:47,051 Præcis. 146 00:05:47,051 --> 00:05:49,300 Selvom dette effektivt returnerer et array, tilbagekaldelse, 147 00:05:49,300 --> 00:05:53,300 når vi kommer tilbage en streng, kan vi indekset i denne streng ved hjælp af 01 og 2. 148 00:05:53,300 --> 00:05:56,180 Teknisk disse er formentlig repræsenteret af enkelte adresser, 149 00:05:56,180 --> 00:05:57,100 men det er fint. 150 00:05:57,100 --> 00:06:00,170 >> Så formoder, hvis jeg kan bare hurtigt sende til hvor vi slap 151 00:06:00,170 --> 00:06:04,320 sidste gang, hvis en af strengene var g a b e, 152 00:06:04,320 --> 00:06:10,337 backslash 0, og derved repræsenterer Gabes input, hvordan kan vi repræsenterer s nu? 153 00:06:10,337 --> 00:06:12,670 Hvis dette er den hukommelse, der er blevet returneret af getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Ville det være repræsenteret af en bue? 156 00:06:17,610 --> 00:06:18,750 >> David J. MALAN: Efter en bue? 157 00:06:18,750 --> 00:06:19,130 Nå, nej. 158 00:06:19,130 --> 00:06:21,171 Lad os bare sige, billedligt, lad mig bare gå videre 159 00:06:21,171 --> 00:06:25,710 og foreslår, at hvis dette er s, dette er returværdien af ​​getString. 160 00:06:25,710 --> 00:06:29,482 Og du har tegnet dette være 0, 1, 2, som er helt rimeligt, fordi vi 161 00:06:29,482 --> 00:06:30,940 kan indekset i strengen, som sådan. 162 00:06:30,940 --> 00:06:33,340 Men bare for at være i overensstemmelse med sidste gang, lad mig gå videre 163 00:06:33,340 --> 00:06:37,310 og vilkårligt foreslår, at dette er adressen 1, dette er adressen 2, 164 00:06:37,310 --> 00:06:39,597 dette er adresse 3, og så videre. 165 00:06:39,597 --> 00:06:41,430 Og så, bare for at være super klart, hvad der sker 166 00:06:41,430 --> 00:06:44,580 at gå i s som følge af denne første linje kode, ville du sige? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: adresse 1? 168 00:06:45,420 --> 00:06:46,420 >> David J. MALAN: Præcis. 169 00:06:46,420 --> 00:06:47,190 Så fat 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Og i mellemtiden, lad mig gå videre og duplikere meget af hvad du har gjort 172 00:06:51,230 --> 00:06:52,740 og tilføje min egen T her. 173 00:06:52,740 --> 00:06:56,340 Hvis jeg skulle skrive i gabe igen, en anden gang, 174 00:06:56,340 --> 00:07:01,530 når du bliver bedt med getString, hvor er naturligvis gabe kommer til at gå? 175 00:07:01,530 --> 00:07:02,280 Nå, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Ligesom på her? 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 er også i de samme kasser? 180 00:07:08,516 --> 00:07:11,940 David J. MALAN: Lad mig foreslå, ja, præcis, så i disse ekstra bokse. 181 00:07:11,940 --> 00:07:15,230 Men hvad er afgørende nu, er, at selv selvom jeg har tegnet disse temmelig tæt 182 00:07:15,230 --> 00:07:18,650 together-- 0x1 dette er 0x2-- i virkeligheden, 183 00:07:18,650 --> 00:07:25,750 det nu kunne være adresse 0x10, for eksempel, og 0x11 og 0x12, 184 00:07:25,750 --> 00:07:26,870 og så videre. 185 00:07:26,870 --> 00:07:29,955 Og så, hvis det er tilfældet, hvad der kommer til at ende her 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: Præcis. 188 00:07:31,830 --> 00:07:33,180 Så 0x10. 189 00:07:33,180 --> 00:07:34,570 Og så nu, sidste spørgsmål. 190 00:07:34,570 --> 00:07:37,510 Du har, langt, måtte arbejde den sværeste for en elefant hidtil. 191 00:07:37,510 --> 00:07:42,650 Ved nu, hvis jeg trækker op koden igen, når jeg gør det, på linje tre, 192 00:07:42,650 --> 00:07:47,630 hvis s er lig lig t, hvad er jeg faktisk sammenligne, at vi har tegnet her? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: De to adresser? 194 00:07:49,271 --> 00:07:50,270 David J. MALAN: Præcis. 195 00:07:50,270 --> 00:07:53,350 Så jeg siger er S lig lig til t? 196 00:07:53,350 --> 00:07:56,210 Med andre ord er en lige lig med 10? 197 00:07:56,210 --> 00:07:59,710 Og selvfølgelig, indlysende svar er nu, nej. 198 00:07:59,710 --> 00:08:02,920 Og så dette program er i sidste ende kommer til at udskrive hvad ville du sige? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Ville det være, du har skrevet det samme? 201 00:08:08,405 --> 00:08:11,446 >> David J. MALAN: Så hvis s er 1 og t er 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Du har skrevet forskellige ting. 203 00:08:13,320 --> 00:08:13,570 >> David J. MALAN: Præcis. 204 00:08:13,570 --> 00:08:14,480 Du har skrevet forskellige ting. 205 00:08:14,480 --> 00:08:14,850 Okay. 206 00:08:14,850 --> 00:08:16,714 Så en runde af bifald, hvis vi kunne, her. 207 00:08:16,714 --> 00:08:17,214 [Applaus] 208 00:08:17,214 --> 00:08:17,708 Det var smertefuldt. 209 00:08:17,708 --> 00:08:18,208 Jeg kender. 210 00:08:18,208 --> 00:08:19,684 Pænt gjort. 211 00:08:19,684 --> 00:08:24,690 Så lad os nu se om vi ikke kan drille hinanden hvad rettelsen var. 212 00:08:24,690 --> 00:08:28,040 Og selvfølgelig, når vi fast denne-- som jeg vil nu repræsentere i green-- 213 00:08:28,040 --> 00:08:29,690 Vi gjorde et par forbedringer her. 214 00:08:29,690 --> 00:08:32,409 Først, ligesom en fornuft kontrollere, jeg først kontrollere 215 00:08:32,409 --> 00:08:35,110 hvis s er lig nul og t er lig med nul. 216 00:08:35,110 --> 00:08:39,440 Og bare for at være klar, når måske s eller t være null i kode som denne? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Hvornår kan s eller t være null. 219 00:08:44,490 --> 00:08:44,990 Ja? 220 00:08:44,990 --> 00:08:45,990 >> Publikum: [uhørligt]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. MALAN: Præcis. 223 00:08:50,510 --> 00:08:52,840 Hvis strengen at brugeren indtastet, er alt for lang 224 00:08:52,840 --> 00:08:56,140 at passe ind i hukommelsen, eller nogle underlige hjørne tilfælde som det, 225 00:08:56,140 --> 00:08:59,010 getString, som vi skal se, bogstaveligt i dag, i dokumentationen, 226 00:08:59,010 --> 00:09:02,330 siger, at det vil vende tilbage null som en særlig sentinel værdi, 227 00:09:02,330 --> 00:09:05,417 eller bare slags et særligt symbol der betyder noget gik galt. 228 00:09:05,417 --> 00:09:07,500 Så vi ønsker at kontrollere for det, fordi det viser sig 229 00:09:07,500 --> 00:09:09,720 at nul er en meget farlig værdi. 230 00:09:09,720 --> 00:09:14,250 >> Ofte hvis du forsøger at gøre noget med null involverer en function-- passerer det 231 00:09:14,250 --> 00:09:17,470 som input til instance-- denne funktion kan meget vil gå ned, og med det, 232 00:09:17,470 --> 00:09:19,090 tage hele dit program ned. 233 00:09:19,090 --> 00:09:22,570 Så denne tredje linje nu er blot en tilregnelighed kontrollere, fejlkontrol, hvis du vil. 234 00:09:22,570 --> 00:09:25,450 Det er en god vane nu for os at komme ind i nogen tid, vi 235 00:09:25,450 --> 00:09:28,050 forsøger at bruge en værdi, kunne potentielt være null. 236 00:09:28,050 --> 00:09:32,000 >> Nu, i fjerde linje her, "Hvis strcmp (s, t)," godt, 237 00:09:32,000 --> 00:09:33,180 hvad er det at henvise til? 238 00:09:33,180 --> 00:09:36,750 Godt, vi sagde det var en meget kortfattet opkaldt funktion for streng sammenligning. 239 00:09:36,750 --> 00:09:40,370 Og dens formål i livet er at sammenligne det første argument mod det andet, 240 00:09:40,370 --> 00:09:44,640 men ikke i form af deres adresser, som vi gjorde utilsigtet et øjeblik 241 00:09:44,640 --> 00:09:48,270 siden med det røde kode, men snarere at sammenligne disse to 242 00:09:48,270 --> 00:09:53,210 strenge i menneskeligt intuitivt måde ved at sammenligne dette mod dette, 243 00:09:53,210 --> 00:09:56,690 imod dette, imod dette, og derefter stoppe, hvis og når man 244 00:09:56,690 --> 00:09:59,590 eller begge af mine fingre rammer en omvendt skråstreg 0. 245 00:09:59,590 --> 00:10:04,530 Så nogen år siden gennemført strcmp at gennemføre til os funktionaliteten 246 00:10:04,530 --> 00:10:08,890 at vi håbede, vi ville have fået ved blot at sammenligne to enkle værdier. 247 00:10:08,890 --> 00:10:14,929 >> Nu ærligt, jeg holder tegning alle disse forskellige tal. 248 00:10:14,929 --> 00:10:17,470 Men virkeligheden er, jeg har været gøre disse op hele tiden. 249 00:10:17,470 --> 00:10:19,580 Og så lad mig bare gå videre og skrible disse ud 250 00:10:19,580 --> 00:10:23,100 at et punkt, som i slutningen af dagen og bevæger sig fremad, 251 00:10:23,100 --> 00:10:30,160 vi er ikke rigtig kommer til at bekymre sig om hvad behandler ting er faktisk 252 00:10:30,160 --> 00:10:30,790 i hukommelsen. 253 00:10:30,790 --> 00:10:34,320 Så jeg har ikke tænkt mig at trække disse typer af tal, så meget mere, 254 00:10:34,320 --> 00:10:38,970 Jeg er bare en abstrakt dette væk en lidt mere venligt med kun pile. 255 00:10:38,970 --> 00:10:42,060 >> Med andre ord, hvis s er en pointer, godt, lad os bare trække det, bogstaveligt talt, 256 00:10:42,060 --> 00:10:45,430 som en pegepind, en pil, der peger fra sig selv til noget andet, 257 00:10:45,430 --> 00:10:48,280 og ikke bekymre dig for meget mere om minutia af disse adresser 258 00:10:48,280 --> 00:10:49,910 som igen, jeg gjorde op alligevel. 259 00:10:49,910 --> 00:10:52,680 Men vi vil se disse adresser, Nogle gange, når debugging kode. 260 00:10:52,680 --> 00:10:56,450 >> Nu mellemtiden, dette program her rettelser, selvfølgelig, 261 00:10:56,450 --> 00:10:58,720 ved at sammenligne dette problem disse to strenge. 262 00:10:58,720 --> 00:11:00,260 Men vi løb ind i et andet problem. 263 00:11:00,260 --> 00:11:03,180 Dette var fra kopien programmere sidste gang, 264 00:11:03,180 --> 00:11:06,880 hvorved jeg forsøgte at kapitalisere bare det første tegn i en streng. 265 00:11:06,880 --> 00:11:09,620 Men hvad var det symptom vi så sidste gang, da 266 00:11:09,620 --> 00:11:14,150 en bruger har indtastet en værdi, ligesom gabe med små bogstaver, for s, 267 00:11:14,150 --> 00:11:19,310 så vi tildelt s mod t, som i den tredje linje der, 268 00:11:19,310 --> 00:11:22,900 og derefter forsøgte jeg at kapitalisere t beslag 0? 269 00:11:22,900 --> 00:11:25,950 Hvad var effekten af skiftende t beslag 0 her? 270 00:11:25,950 --> 00:11:27,150 >> PUBLIKUM: Det ændrede sek. 271 00:11:27,150 --> 00:11:29,360 >> David J. MALAN: Ja, Jeg skiftede s, så godt. 272 00:11:29,360 --> 00:11:31,050 Fordi hvad der virkelig foregår? 273 00:11:31,050 --> 00:11:34,130 Nå, lad mig se om jeg kan rense op dette billede, som følger. 274 00:11:34,130 --> 00:11:41,390 >> Hvis s er igen ordet g a, b, e, backslash, 0 og s 275 00:11:41,390 --> 00:11:44,084 vi vil fortsætte med at tegne som en kasse her, men ikke mere adresser. 276 00:11:44,084 --> 00:11:45,250 Lad os holde op med at gøre tingene op. 277 00:11:45,250 --> 00:11:47,510 Lad os bare tegne et billede at forenkle verden. 278 00:11:47,510 --> 00:11:52,640 >> Når jeg erklærer t med snor t, der skaber denne bid af hukommelse. 279 00:11:52,640 --> 00:11:55,850 Square sker for at være 32 bits i de fleste computere. 280 00:11:55,850 --> 00:11:59,530 I virkeligheden, hvis du nogensinde har hørt om en computer med en 32-bit arkitektur, 281 00:11:59,530 --> 00:12:03,000 virkelig fancy-tale, der bare betyder, at det anvender 32-bit adresser. 282 00:12:03,000 --> 00:12:05,370 Og som en teknisk side, Hvis du nogensinde har spekuleret 283 00:12:05,370 --> 00:12:09,630 hvorfor ældre computere, hvis du rent faktisk forsøgte at suppe dem op med masser af RAM, 284 00:12:09,630 --> 00:12:12,360 kunne kun have en maksimal af fire gigabyte RAM, 285 00:12:12,360 --> 00:12:14,860 godt det er fordi, bogstaveligt talt, din gamle computer kunne kun 286 00:12:14,860 --> 00:12:17,250 tæller så høj som 4 milliard, 4 milliarder byte, 287 00:12:17,250 --> 00:12:20,590 fordi det var ved hjælp af 32-bit numre for adresser. 288 00:12:20,590 --> 00:12:23,260 >> Men i hvert fald i dette eksempel fortællingens meget enklere. 289 00:12:23,260 --> 00:12:27,250 t er bare en anden pointer, eller virkelig en char stjerne, alias streng. 290 00:12:27,250 --> 00:12:30,860 Og hvordan gør jeg ønsker at opdatere dette billede nu med denne anden linje kode, 291 00:12:30,860 --> 00:12:31,950 efter prik, prik, prik? 292 00:12:31,950 --> 00:12:35,845 Når jeg gør streng t er lig med s semikolon, hvordan dette billede ændre sig? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Ja? 295 00:12:38,000 --> 00:12:38,916 >> Publikum: [uhørligt]. 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 Præcis. 299 00:12:42,600 --> 00:12:45,620 Jeg har lige sat en pil fra t boksen til samme adresse, 300 00:12:45,620 --> 00:12:47,570 det samme første bogstav i gav. 301 00:12:47,570 --> 00:12:50,850 Eller teknisk, hvis dette fyr var stadig på 0x1, 302 00:12:50,850 --> 00:12:53,052 det er som om jeg havde 0x1 her og 0x1 her. 303 00:12:53,052 --> 00:12:54,760 Men igen, hvem bekymrer sig om adresserne? 304 00:12:54,760 --> 00:12:56,345 Det er bare tanken om, at nu betyder noget. 305 00:12:56,345 --> 00:12:57,720 Så dette er hvad der sker her. 306 00:12:57,720 --> 00:13:02,690 Så selvfølgelig, hvis du gør t beslag 0, hvilket er matrix notation 307 00:13:02,690 --> 00:13:05,650 af course-- og helt ærligt, det ser som om der er en bred vifte herovre, 308 00:13:05,650 --> 00:13:07,340 men nu er der denne underlige ting. 309 00:13:07,340 --> 00:13:11,160 Vid, at programmeringssprog, C, tilbyder dig denne funktion, 310 00:13:11,160 --> 00:13:14,650 hvorved, selv hvis t er en markøren, eller s er en pointer, 311 00:13:14,650 --> 00:13:18,050 du kan stadig bruge det velkendte, komfortabel firkantet beslag 312 00:13:18,050 --> 00:13:22,520 notation for at gå til det første element, eller det andet element eller en del 313 00:13:22,520 --> 00:13:26,130 at denne pointer peger til, fordi formentlig det 314 00:13:26,130 --> 00:13:29,410 er, som i denne sag, peger på nogle array. 315 00:13:29,410 --> 00:13:30,340 >> Så hvordan kan vi løse dette? 316 00:13:30,340 --> 00:13:33,660 Helt ærligt, det er, hvor det fik en lidt overvældende ved første øjekast. 317 00:13:33,660 --> 00:13:35,340 Men her er en ny og forbedret udgave. 318 00:13:35,340 --> 00:13:37,460 >> Så først, jeg får slippe af med CS50 biblioteket 319 00:13:37,460 --> 00:13:41,170 blot at afsløre, at s er faktisk en char stjerne, bare et synonym. 320 00:13:41,170 --> 00:13:43,540 Og t er også en char stjerne. 321 00:13:43,540 --> 00:13:48,290 Men hvad der foregår på højre side af denne linje 322 00:13:48,290 --> 00:13:49,970 hvor t er tildelt en værdi? 323 00:13:49,970 --> 00:13:50,790 >> Hvad er malloc? 324 00:13:50,790 --> 00:13:51,630 Hvad er det strlen? 325 00:13:51,630 --> 00:13:52,547 Hvad er sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Hvorfor dælen gør dette linie ser så kompliceret? 327 00:13:54,380 --> 00:13:55,713 Hvad laver den på et højt niveau? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Hvad er det lagring i t? 330 00:13:57,440 --> 00:13:58,646 Ja? 331 00:13:58,646 --> 00:14:01,104 PUBLIKUM: Det er at tildele en bestemt mængde hukommelse plads. 332 00:14:01,104 --> 00:14:03,032 Det er til at gemme, jeg gætte, breve [uhørligt]. 333 00:14:03,032 --> 00:14:04,032 >> David J. MALAN: Perfect. 334 00:14:04,032 --> 00:14:04,540 Perfekt. 335 00:14:04,540 --> 00:14:06,650 Det er tildeling af en bestemt mængde hukommelse 336 00:14:06,650 --> 00:14:08,940 at gemme formentlig fremtidige bogstaver. 337 00:14:08,940 --> 00:14:11,310 Og i særdeleshed, malloc Derfor vender hvad? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Publikum: Returnering af [uhørligt]? 340 00:14:14,851 --> 00:14:15,850 David J. MALAN: Præcis. 341 00:14:15,850 --> 00:14:18,850 Returnering adressen på hukommelse, som er en fancy måde at sige, 342 00:14:18,850 --> 00:14:21,640 returnerer adressen på den første byte i denne hukommelse. 343 00:14:21,640 --> 00:14:25,460 Det er op til mig at huske hvor meget hukommelse jeg faktisk 344 00:14:25,460 --> 00:14:27,140 tildelt eller bedt malloc om. 345 00:14:27,140 --> 00:14:28,384 >> Nu hvor meget er det? 346 00:14:28,384 --> 00:14:30,550 Nå, selv om der er en masse af parenteser her, 347 00:14:30,550 --> 00:14:32,970 malloc tager bare et enkelt argument. 348 00:14:32,970 --> 00:14:37,250 Og jeg angive strlen af ​​s, så giv mig så mange bytes, som der er i s, 349 00:14:37,250 --> 00:14:37,800 men tilføje en. 350 00:14:37,800 --> 00:14:38,300 Hvorfor? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Ja? 353 00:14:39,530 --> 00:14:40,840 >> PUBLIKUM: Skråstregen 0. 354 00:14:40,840 --> 00:14:41,840 David J. MALAN: Præcis. 355 00:14:41,840 --> 00:14:43,423 Vi er nødt til at gøre lidt rengøring. 356 00:14:43,423 --> 00:14:45,970 Så fordi der er en omvendt skråstreg 0, ville vi bedre huske. 357 00:14:45,970 --> 00:14:47,310 Ellers vil vi at skabe en streng, 358 00:14:47,310 --> 00:14:49,170 ikke har denne særlige terminator. 359 00:14:49,170 --> 00:14:52,640 >> I mellemtiden, bare for at være super anal, jeg har sizeof (char) 360 00:14:52,640 --> 00:14:55,730 bare i tilfælde nogen kører min kode ikke på CS50 apparat, 361 00:14:55,730 --> 00:14:58,220 men måske en anden computer i alt, hvor tegn 362 00:14:58,220 --> 00:15:01,470 er en byte, efter sædvane, men to byte, eller noget større end det. 363 00:15:01,470 --> 00:15:04,490 Det er bare at være super, Super utilbøjelig til fejl. 364 00:15:04,490 --> 00:15:06,940 Selv om det i virkeligheden er det mest sandsynligt vil være en 1. 365 00:15:06,940 --> 00:15:11,490 >> Nu, i mellemtiden, jeg gå videre og kopiere streng, t beslag jeg lig t beslag filtre. 366 00:15:11,490 --> 00:15:14,962 Og jeg vil udsætte til sidste uges kildekoden for at se, hvad der foregår. 367 00:15:14,962 --> 00:15:17,670 Men det vigtigste takeaway, og Grunden til at jeg sætter koden nu i grøn, 368 00:15:17,670 --> 00:15:22,520 skyldes, at meget sidste linje, t beslag 0 er lig toupper, 369 00:15:22,520 --> 00:15:25,230 har den virkning kapitalisere som snor? 370 00:15:25,230 --> 00:15:26,960 t og / eller s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Det sidste linje kode. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Bare t, fordi det er skete denne gang, 375 00:15:35,560 --> 00:15:41,500 hvis jeg lidt fortryde det sidste skridt, hvad der er sket, er, når jeg kalder malloc, 376 00:15:41,500 --> 00:15:45,380 Jeg hovedsagelig får en luns af hukommelse det er den samme størrelse som originalen, 377 00:15:45,380 --> 00:15:47,020 fordi det er den aritmetiske jeg gjorde. 378 00:15:47,020 --> 00:15:50,920 Jeg lagring i t adressen denne bid af hukommelse. 379 00:15:50,920 --> 00:15:53,370 Selvom dette ser nice og smuk, pæn og blank, 380 00:15:53,370 --> 00:15:56,882 virkeligheden er der er, hvad vi vil holde ringer, skrald værdier her. 381 00:15:56,882 --> 00:15:59,340 Denne luns af hukommelsen, kan meget godt have været brugt før, 382 00:15:59,340 --> 00:16:00,940 et par sekunder, et par minutter siden. 383 00:16:00,940 --> 00:16:04,410 Så der kunne absolut være tal eller bogstaver der, bare ved et uheld. 384 00:16:04,410 --> 00:16:08,580 Men de er ikke gyldige, indtil jeg selv befolke denne luns af hukommelse 385 00:16:08,580 --> 00:16:12,510 med de faktiske tegn, som jeg gøre i denne for-løkke der. 386 00:16:12,510 --> 00:16:13,180 Okay? 387 00:16:13,180 --> 00:16:16,180 >> Så nu, klimaks disse tre eksempler 388 00:16:16,180 --> 00:16:20,730 der tilsyneladende var brudt sidste gang, denne Swap eksempel denne funktion 389 00:16:20,730 --> 00:16:23,670 arbejdede i den forstand, at det byttet a og b. 390 00:16:23,670 --> 00:16:25,620 Men det virkede ikke i hvad andre mening? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Ja? 393 00:16:28,614 --> 00:16:29,612 >> Publikum: [uhørligt]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. MALAN: Præcis. 396 00:16:36,700 --> 00:16:39,530 Hvis jeg skulle kalde denne funktion fra another-- for eksempel 397 00:16:39,530 --> 00:16:42,870 fra en funktion som vigtigste, hvor Jeg har en variabel, x og y, som jeg 398 00:16:42,870 --> 00:16:46,160 gjorde i sidste uge, samme kode, og jeg går i x og y 399 00:16:46,160 --> 00:16:49,860 til Skift, og derefter kalde Swap-- dette, selvfølgelig er den korrekte version 400 00:16:49,860 --> 00:16:52,220 er, hvad vi er ved at see-- det virkede ikke. 401 00:16:52,220 --> 00:16:53,770 Så hvad er den fix? 402 00:16:53,770 --> 00:16:56,850 >> Nå, så bare for at være klar, lad mig gå videre 403 00:16:56,850 --> 00:17:05,450 og-- giver mig et øjeblik her, og se hvis jeg kan vise dig den sidste, som 404 00:17:05,450 --> 00:17:12,464 vil være in-- lad os se om jeg kan finde denne virkelige fast-- OK, [uhørligt]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, der er det. 407 00:17:19,240 --> 00:17:21,000 Så ignorere de kommandoer jeg bare skrive. 408 00:17:21,000 --> 00:17:23,780 Jeg vil have det til at hente på sidste øjeblik et eksempel 409 00:17:23,780 --> 00:17:27,960 fra sidste gang, som kaldes nu ingen Swap. 410 00:17:27,960 --> 00:17:30,200 >> Så ingen Swap er hvor vi slap sidste gang, 411 00:17:30,200 --> 00:17:32,930 hvorved jeg initialiseret x 1 og y til 2. 412 00:17:32,930 --> 00:17:35,840 Jeg derefter kalde Swap, der passerer i 1 og 2. 413 00:17:35,840 --> 00:17:37,930 Og så er denne funktion arbejdet i en vis forstand, 414 00:17:37,930 --> 00:17:40,750 men det havde ikke noget fast effekt på x og y. 415 00:17:40,750 --> 00:17:45,430 Så Spørgsmålet er, hvordan nu vi faktisk løse dette problem? 416 00:17:45,430 --> 00:17:47,820 Hvad er løsningen lige ved hånden? 417 00:17:47,820 --> 00:17:53,150 >> Tja, i swap.c, der er nyt i dag, bemærke et par forskelle. 418 00:17:53,150 --> 00:17:54,700 x og y er de samme. 419 00:17:54,700 --> 00:17:57,250 Men hvad er klart anderledes ved linje 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Hvad er nyt der, hvis du kan huske hvad det lignede et sekund siden? 422 00:18:01,715 --> 00:18:02,565 >> Publikum: [uhørligt]. 423 00:18:02,565 --> 00:18:03,440 >> David J. MALAN: Ja. 424 00:18:03,440 --> 00:18:06,680 Så ampersands er et nyt stykke af syntaks ikke kun i dette program, 425 00:18:06,680 --> 00:18:08,560 men også mere generelt i CS50. 426 00:18:08,560 --> 00:18:10,680 Til dato, tror jeg ikke vi har set nogen eksempler 427 00:18:10,680 --> 00:18:14,070 eller virkelig talte om dem i enhver detalje, bortset, måske, forebyggende 428 00:18:14,070 --> 00:18:16,467 i snit et og-tegn som denne. 429 00:18:16,467 --> 00:18:19,300 Tja, det viser sig-tegn er en af de sidste stykker af ny syntaks 430 00:18:19,300 --> 00:18:20,174 vi kommer til at lære. 431 00:18:20,174 --> 00:18:23,500 Alt det betyder, er den adresse nogle variabel. 432 00:18:23,500 --> 00:18:25,070 På hvilken adresse betyder x leve? 433 00:18:25,070 --> 00:18:26,510 Men hvad adresse betyder y leve? 434 00:18:26,510 --> 00:18:28,700 For hvis grundlæggende problem før 435 00:18:28,700 --> 00:18:32,970 var, at x og y blev videregivet som kopier, hvad vi virkelig ønsker at gøre 436 00:18:32,970 --> 00:18:38,780 er give Swap med som en skat kort, der fører til hvor x og y faktisk 437 00:18:38,780 --> 00:18:41,910 er RAM, således at Swap kan følge dette kort 438 00:18:41,910 --> 00:18:47,760 og gå til hvor X eller Y, markerer stedet og ændre de aktuelle værdier 1 og 2. 439 00:18:47,760 --> 00:18:48,270 der. 440 00:18:48,270 --> 00:18:50,710 >> Så Swap nødt til at ændre sig en smule også. 441 00:18:50,710 --> 00:18:53,760 Og ved første øjekast, kan dette virke lidt ligner char stjerne. 442 00:18:53,760 --> 00:18:54,850 Og det er faktisk. 443 00:18:54,850 --> 00:18:59,635 Så et er en pegepind til hvilken type data, baseret på denne fremhævede del? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Så det er en int. 446 00:19:01,620 --> 00:19:04,880 >> Så et er ikke længere en int, Det er adressen på en int. 447 00:19:04,880 --> 00:19:07,910 Og på samme måde, b er nu går at være adressen på en int. 448 00:19:07,910 --> 00:19:12,470 Så når jeg nu kalder Swap fra Main, Jeg har ikke tænkt mig at give Swap 1 og 2. 449 00:19:12,470 --> 00:19:15,540 Jeg har tænkt mig at give det ligesom Ox-noget og Ox-noget, 450 00:19:15,540 --> 00:19:19,820 to adresser, der vil føre Swap til deres faktiske steder 451 00:19:19,820 --> 00:19:21,310 i min computers hukommelse. 452 00:19:21,310 --> 00:19:25,580 >> Så nu, min resterende implementering behov for at ændre en smule. 453 00:19:25,580 --> 00:19:28,650 Hvad er selvfølgelig anderledes nu i disse tre linjer kode? 454 00:19:28,650 --> 00:19:31,350 Der er i disse forbandede stjerner alle over stedet, okay? 455 00:19:31,350 --> 00:19:33,014 Så hvad sker der her? 456 00:19:33,014 --> 00:19:33,514 Ja? 457 00:19:33,514 --> 00:19:35,055 >> PUBLIKUM: Det er naturligvis [uhørligt]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. MALAN: Præcis. 460 00:19:37,990 --> 00:19:41,560 Så i denne context-- og dette var ikke det bedste design beslutning, ganske vist, 461 00:19:41,560 --> 00:19:42,530 år siden. 462 00:19:42,530 --> 00:19:45,110 I denne sammenhæng, hvor du bare have en stjerne, 463 00:19:45,110 --> 00:19:48,240 og du ikke har en datatype, ligesom int, umiddelbart til venstre, 464 00:19:48,240 --> 00:19:53,146 i stedet har du et lighedstegn, tydeligt, i denne sammenhæng, når du siger stjerne en, 465 00:19:53,146 --> 00:19:56,980 det betyder at gå til adresse, der er i en. 466 00:19:56,980 --> 00:19:58,870 Følg skattekort, så at sige. 467 00:19:58,870 --> 00:20:01,720 >> Og i mellemtiden, på linje 37, det betyder det samme. 468 00:20:01,720 --> 00:20:05,460 Gå til adressen a, og lægge, hvad der? 469 00:20:05,460 --> 00:20:09,520 Uanset hvad er på placering, b angiver. 470 00:20:09,520 --> 00:20:10,980 Med andre ord, gå til b. 471 00:20:10,980 --> 00:20:12,130 Få det værdi. 472 00:20:12,130 --> 00:20:15,620 Gå til en, og pr lige underskrive opgaven operatør, 473 00:20:15,620 --> 00:20:17,010 sætte denne værdi der. 474 00:20:17,010 --> 00:20:19,272 >> Tilsvarende int temp er bare en int. 475 00:20:19,272 --> 00:20:20,730 Intet behov for at ændre om temp. 476 00:20:20,730 --> 00:20:24,810 Det er bare et ekstra glas fra Annenberg for nogle mælk eller appelsinjuice. 477 00:20:24,810 --> 00:20:27,630 Men jeg behøver at sige, gå til B. 478 00:20:27,630 --> 00:20:31,449 Gå til denne destination og sætte værdien i temp der. 479 00:20:31,449 --> 00:20:32,490 Så hvad sker der så? 480 00:20:32,490 --> 00:20:36,540 Da jeg faktisk kalde Swap denne gang, hvis denne første bakke her repræsenterer Main, 481 00:20:36,540 --> 00:20:42,270 denne anden bakke repræsenterer Swap, når Jeg passerer Ampersand x og tegnet y 482 00:20:42,270 --> 00:20:47,150 fra Main til Swap, bare for at være klar, hvad er dette stakramme modtager? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Ja? 485 00:20:49,200 --> 00:20:50,180 >> Publikum: [uhørligt]. 486 00:20:50,180 --> 00:20:51,180 David J. MALAN: Præcis. 487 00:20:51,180 --> 00:20:53,129 Adressen af ​​x og adressen af ​​y. 488 00:20:53,129 --> 00:20:55,170 Og du kan tænke på disse ligesom postadresser. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street og 35 Oxford Street, og du 490 00:20:58,772 --> 00:21:01,230 ønsker at flytte de to bygninger der er på disse steder. 491 00:21:01,230 --> 00:21:04,680 >> Det er en slags en latterlig idé, men det er alt, vi mener med adresse. 492 00:21:04,680 --> 00:21:07,000 Hvor i verden kan du finde disse to int'er? 493 00:21:07,000 --> 00:21:09,470 Hvor i verden kan du finde disse to bygninger? 494 00:21:09,470 --> 00:21:15,170 Så hvis endelig, efter al denne tid, jeg gå ind i nutidens kildekode og kompilere 495 00:21:15,170 --> 00:21:22,110 Swap og køre ./swap endelig til første gang vi faktisk se, at 496 00:21:22,110 --> 00:21:25,330 mine værdier har faktisk blevet byttet med succes. 497 00:21:25,330 --> 00:21:30,860 Og nu kan vi selv tage dette til efterretning i f.eks gdb. 498 00:21:30,860 --> 00:21:32,740 >> Så lad mig gå ind i den samme fil. 499 00:21:32,740 --> 00:21:35,010 Lad mig gå videre og køre gdb af ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Og nu, i bytte, jeg har tænkt mig at gå fremad og sætte en pause punkt i Main. 502 00:21:40,547 --> 00:21:42,630 Og nu jeg har tænkt mig at gå videre og køre programmet. 503 00:21:42,630 --> 00:21:45,810 Og nu ser vi min kode pause på denne linje. 504 00:21:45,810 --> 00:21:48,330 >> Hvis jeg går videre og udskrive x, hvad skal jeg se her? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Det er et spørgsmål. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Sig det igen? 509 00:21:51,530 --> 00:21:52,295 >> Publikum: [uhørligt]. 510 00:21:52,295 --> 00:21:53,910 >> David J. MALAN: So tilfældige tal, måske. 511 00:21:53,910 --> 00:21:56,010 Måske får jeg heldig, og det er nice og enkel, ligesom 0. 512 00:21:56,010 --> 00:21:57,230 Men måske er det nogle tilfældige tal. 513 00:21:57,230 --> 00:21:58,090 I dette tilfælde, jeg fik heldig. 514 00:21:58,090 --> 00:21:59,030 Det sker bare at være 0. 515 00:21:59,030 --> 00:22:00,780 Men det er faktisk held, fordi ikke før jeg 516 00:22:00,780 --> 00:22:06,280 skrive næste og derefter udskrive x har at linje kode, linje 19, er blevet henrettet. 517 00:22:06,280 --> 00:22:10,942 >> I mellemtiden, hvis jeg skriver næste gang, og nu udskrive y, jeg har tænkt mig at se 2. 518 00:22:10,942 --> 00:22:13,900 Nu, hvis jeg skriver næste, går det til få en lidt forvirrende, for nu, 519 00:22:13,900 --> 00:22:17,250 printf vil blive vist på skærmen, som den gjorde. x er 1. 520 00:22:17,250 --> 00:22:18,606 >> Lad os gøre det igen. 521 00:22:18,606 --> 00:22:20,480 Og nu, her er hvor tingene bliver interessante. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Før jeg kalder Swap eller endda skridt ind i det, lad os tage et lille kig. 524 00:22:26,580 --> 00:22:28,980 x er igen 1. 525 00:22:28,980 --> 00:22:33,240 Y er naturligvis hurtig fornuft kontrollere, 2, så ikke svært der. 526 00:22:33,240 --> 00:22:35,740 Men hvad er tegnet x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Svar, det er slags funky ud. 529 00:22:39,350 --> 00:22:43,500 Men int stjerne i parentes er lige BNP måde at sige dette er en adresse. 530 00:22:43,500 --> 00:22:48,290 Det er ikke en int, det er en pointer til en int, eller på anden måde kendt som en adresse. 531 00:22:48,290 --> 00:22:49,742 >> Hvad er denne vanvittige ting? 532 00:22:49,742 --> 00:22:51,825 Vi har aldrig set noget helt som før. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Så dette er adressen på min computer mindet om hvor x sker til at leve. 535 00:22:58,120 --> 00:22:59,040 Det er Ox-noget. 536 00:22:59,040 --> 00:23:01,290 Og det er helt ærligt, hvorfor Jeg er begyndt at tegne pile, 537 00:23:01,290 --> 00:23:03,340 i stedet for tal, fordi der virkelig bekymrer 538 00:23:03,340 --> 00:23:06,890 at din int er på et bestemt adresse, der er så store. 539 00:23:06,890 --> 00:23:12,160 Men bffff0c4, disse er alle faktisk hexadecimale cifre, 540 00:23:12,160 --> 00:23:13,720 der er 0 til f. 541 00:23:13,720 --> 00:23:16,590 >> Så vi kommer ikke til at dvæle for længe på hvad disse ting er. 542 00:23:16,590 --> 00:23:19,400 Men hvis jeg udskrive y, selvfølgelig, jeg se 2. 543 00:23:19,400 --> 00:23:22,440 Men ampersand y, ser jeg denne adresse. 544 00:23:22,440 --> 00:23:26,527 Og varsel, for de nysgerrige, hvor langt fra hinanden er x og y? 545 00:23:26,527 --> 00:23:27,985 Du kan ignorere de fleste af adressen. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Fire byte. 548 00:23:29,920 --> 00:23:33,510 Og det er i overensstemmelse med vores tidligere hævder, at hvor stor er en int? 549 00:23:33,510 --> 00:23:34,130 Fire byte. 550 00:23:34,130 --> 00:23:37,420 Så det ser ud som alt er foring op pænt, som du måske håbe, i hukommelsen. 551 00:23:37,420 --> 00:23:40,010 >> Så nu, lad os bare hurtigt fremad til slutningen af ​​denne historie. 552 00:23:40,010 --> 00:23:43,290 Lad os gå videre og skrive skridt, at dykke ned i swap-funktionen. 553 00:23:43,290 --> 00:23:46,880 Bemærk nu, hvis jeg skriver en, det er identisk med adressen på x. 554 00:23:46,880 --> 00:23:52,130 Hvis jeg skriver B, det er identisk til adressen af ​​y. 555 00:23:52,130 --> 00:23:57,020 Så hvad skal jeg se, om jeg sige, gå til den adresse, en? 556 00:23:57,020 --> 00:23:58,120 Så udskrive stjerne en. 557 00:23:58,120 --> 00:24:00,130 Så stjerne betyder derned, i denne sammenhæng. 558 00:24:00,130 --> 00:24:02,730 Ampersand betyder hvad er adressen. 559 00:24:02,730 --> 00:24:05,000 Så stjerne et middel 1. 560 00:24:05,000 --> 00:24:09,590 Og print stjernede b giver mig 2. 561 00:24:09,590 --> 00:24:15,750 >> Og lad mig antage, for øjeblikket, at mindst den kode, 562 00:24:15,750 --> 00:24:18,950 fortsætter med at udføre nu kan være begrundet igennem på den måde. 563 00:24:18,950 --> 00:24:21,150 Men vi vil revidere denne idé inden længe. 564 00:24:21,150 --> 00:24:23,850 Så denne version af swap er nu korrekt og tillader 565 00:24:23,850 --> 00:24:26,650 os at bytte denne datatype. 566 00:24:26,650 --> 00:24:29,120 >> Så nogen spørgsmål så på Swap? 567 00:24:29,120 --> 00:24:29,890 På stjerne? 568 00:24:29,890 --> 00:24:30,690 På adressen på? 569 00:24:30,690 --> 00:24:33,270 Og du vil se, med Problemet sæt 4, en slags, 570 00:24:33,270 --> 00:24:37,310 men problemet sæt 5, afgjort, hvordan disse tingene er nyttige og få meget mere 571 00:24:37,310 --> 00:24:39,584 komfortable med dem, som et resultat. 572 00:24:39,584 --> 00:24:40,430 Noget overhovedet? 573 00:24:40,430 --> 00:24:40,930 Okay. 574 00:24:40,930 --> 00:24:44,350 Så malloc er, igen, denne funktion der bare allokerer hukommelse, hukommelse 575 00:24:44,350 --> 00:24:45,330 tildeling. 576 00:24:45,330 --> 00:24:47,024 Og hvorfor er det nyttigt? 577 00:24:47,024 --> 00:24:48,940 Nå, alt dette tidspunkt, du har brugt malloc. 578 00:24:48,940 --> 00:24:52,230 Hvis du mener nu, hvordan getString værker, formentlig, det er 579 00:24:52,230 --> 00:24:56,140 har spurgt nogen for en luns af hukommelse, når som helst brugeren skriver en streng 580 00:24:56,140 --> 00:24:59,040 i, fordi vi helt sikkert vidste ikke, da CS50 personale, 581 00:24:59,040 --> 00:25:02,710 hvor stor disse strenge, at mennesker kommer til at skrive kunne være. 582 00:25:02,710 --> 00:25:07,910 >> Så lad os, for første gang, begynder at Riv hvordan CS50 bibliotekets værker, 583 00:25:07,910 --> 00:25:10,990 ved hjælp af et par eksempler som vil føre os derhen. 584 00:25:10,990 --> 00:25:15,300 Så hvis jeg åbner op gedit og åbne op scanf 0, 585 00:25:15,300 --> 00:25:17,055 vi kommer til at se følgende kode. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, tilgængelig på hjemmesiden for i dag, har relativt få linjer kode 588 00:25:23,530 --> 00:25:25,351 her, 14 til 20. 589 00:25:25,351 --> 00:25:26,600 Og lad os se, hvad det gør. 590 00:25:26,600 --> 00:25:28,920 Det erklærer en int, kaldet x. 591 00:25:28,920 --> 00:25:30,850 Det siger noget lignende, tal venligst. 592 00:25:30,850 --> 00:25:33,940 Og nu siger scanf% i, og x. 593 00:25:33,940 --> 00:25:35,620 Så der er en masse nye ting der. 594 00:25:35,620 --> 00:25:38,420 >> Men scanf, kan du slags tænke af som det modsatte af printf. 595 00:25:38,420 --> 00:25:40,090 printf naturligvis udskriver til skærmen. 596 00:25:40,090 --> 00:25:44,410 scanf slags scanninger fra brugerens tastatur noget, han eller hun har skrevet. 597 00:25:44,410 --> 00:25:46,550 >> % I er ligesom printf. 598 00:25:46,550 --> 00:25:49,410 Dette betyder, forventer brugeren at indtaste en int. 599 00:25:49,410 --> 00:25:52,820 Og nu, hvorfor tror du, jeg kunne passere scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Hvis formålet med livet i scanf er at få noget fra brugeren, 602 00:25:57,770 --> 00:26:02,480 hvad er betydningen af passerer det, og x, nu? 603 00:26:02,480 --> 00:26:02,980 Ja? 604 00:26:02,980 --> 00:26:03,896 >> Publikum: [uhørligt]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. MALAN: Præcis. 607 00:26:06,540 --> 00:26:12,900 Uanset hvad jeg, de menneskelige, skrive i, mit input vil blive gemt på det sted. 608 00:26:12,900 --> 00:26:17,660 Det er ikke nok, husker, at bare passere i x, fordi vi har set allerede, 609 00:26:17,660 --> 00:26:21,630 enhver tid du passerer bare en rå variabel, ligesom en int til en anden funktion, 610 00:26:21,630 --> 00:26:25,640 sikker, kan det ændre det variabel, men ikke permanent. 611 00:26:25,640 --> 00:26:27,360 Det kan ikke have en effekt på Main. 612 00:26:27,360 --> 00:26:29,420 Det kan kun ændre sin egen lokale kopi. 613 00:26:29,420 --> 00:26:32,560 Men hvis man i stedet, det gør du ikke giv mig den egentlige int, 614 00:26:32,560 --> 00:26:36,640 men du giver mig retninger til at int, jeg nu, bliver scanf, 615 00:26:36,640 --> 00:26:41,050 sikkert, kan jeg følge at adresse og sætte et nummer der 616 00:26:41,050 --> 00:26:43,280 så du har adgang til det så godt. 617 00:26:43,280 --> 00:26:45,120 >> Så når jeg køre dette program, lad os se. 618 00:26:45,120 --> 00:26:49,660 Gør scanf 0 dot skråstreg, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Og hvis jeg nu skrive et nummer ligesom 50, tak for 50. 620 00:26:54,030 --> 00:26:58,150 Hvis jeg nu skrive et tal som negativ 1, for den negative 1. 621 00:26:58,150 --> 00:27:04,200 Jeg vil nu skrive et tal som 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Hvorfor har mit program ignorere mig? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Tja, fordi blot, jeg fortalte det forventer kun en int. 625 00:27:09,880 --> 00:27:10,380 Okay. 626 00:27:10,380 --> 00:27:11,630 Så det er en version af dette. 627 00:27:11,630 --> 00:27:16,600 Lad os tage tingene op et hak og foreslår, at dette ikke er godt. 628 00:27:16,600 --> 00:27:20,530 Og heri ligger et meget simpelt eksempel af, hvordan vi kan begynde at skrive kode 629 00:27:20,530 --> 00:27:24,450 at andre mennesker kan udnytte eller kompromis ved at gøre dårlige ting. 630 00:27:24,450 --> 00:27:28,336 Så linie 16, så ens i ånden til før, 631 00:27:28,336 --> 00:27:29,960 men jeg er ikke erklære det int denne gang. 632 00:27:29,960 --> 00:27:32,970 Jeg erklære det char stjerne, alias streng. 633 00:27:32,970 --> 00:27:35,190 >> Men hvad betyder det egentlig? 634 00:27:35,190 --> 00:27:38,790 Så hvis jeg ikke angiver en address-- og Jeg kalder det vilkårligt, buffer, 635 00:27:38,790 --> 00:27:43,370 men jeg kunne kalde det s, at være simple-- og så vil jeg gøre det, forklare mig, 636 00:27:43,370 --> 00:27:48,630 hvis du kunne, baseret på den tidligere logik, hvad scanf gør i linje 18, 637 00:27:48,630 --> 00:27:55,000 hvis pass% s og puffer, der er en adresse? 638 00:27:55,000 --> 00:27:58,210 Hvad er scanf, hvis du anvender nøjagtig samme logik som versionen 0, 639 00:27:58,210 --> 00:28:00,640 vil forsøge at gøre her, når brugeren skriver noget i? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Ja? 642 00:28:03,409 --> 00:28:04,407 >> Publikum: [uhørligt]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. MALAN: Præcis. 645 00:28:08,890 --> 00:28:11,577 Scanf ved logikken tidligere, vil tage strengen 646 00:28:11,577 --> 00:28:13,410 at den menneskelige maskinskrevne in-- det er nu en streng, 647 00:28:13,410 --> 00:28:15,790 det er ikke et tal, formentlig, hvis han eller hun cooperates-- 648 00:28:15,790 --> 00:28:19,310 og det kommer til at forsøge at sætte det snor i hukommelsen på uanset adresse 649 00:28:19,310 --> 00:28:20,340 buffer angiver. 650 00:28:20,340 --> 00:28:23,870 Og det er fantastisk, fordi buffer er faktisk beregnet til at være en adresse. 651 00:28:23,870 --> 00:28:30,470 >> Men jeg hævder dette program er buggy i en meget alvorlig måde, fordi det værdi er 652 00:28:30,470 --> 00:28:31,330 buffer som standard? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Hvad har jeg initialiseret ind? 655 00:28:34,790 --> 00:28:35,770 Hvilken luns af hukommelse? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Jeg har ikke, vel? 658 00:28:38,620 --> 00:28:42,265 >> Så selvom jeg har afsat en char stjerne, der er ikke længere kaldes s, 659 00:28:42,265 --> 00:28:48,030 det i stedet hedder, buffer-- så lad os trække variablens navn 660 00:28:48,030 --> 00:28:53,380 nu som buffer-- hvis jeg ikke har kaldet getString eller malloc her, 661 00:28:53,380 --> 00:28:56,030 der effektivt betyder, at buffer er blot nogle skrald værdi. 662 00:28:56,030 --> 00:28:57,030 >> Nu, hvad betyder det? 663 00:28:57,030 --> 00:29:00,220 Det betyder, at jeg har fortalt scanf at forvente en streng fra brugeren. 664 00:29:00,220 --> 00:29:01,300 Og ved du hvad? 665 00:29:01,300 --> 00:29:03,883 Uanset denne ting peger at-- og jeg trækker spørgsmålstegn, 666 00:29:03,883 --> 00:29:07,060 men i virkeligheden, går det at være noget lignende OX1, 2, 3, right? 667 00:29:07,060 --> 00:29:10,730 Det er nogle falske værdi, der bare sker for at være der fra før. 668 00:29:10,730 --> 00:29:13,440 Så sagt på en anden måde, det er som om bufferen er lige 669 00:29:13,440 --> 00:29:16,180 peger på noget i hukommelsen. 670 00:29:16,180 --> 00:29:17,610 Jeg aner ikke hvad. 671 00:29:17,610 --> 00:29:24,130 >> Så hvis jeg skriver i Gabe nu, går det at forsøge at sætte g-a-b-e / 0 der. 672 00:29:24,130 --> 00:29:25,530 Men hvem ved, hvad det er? 673 00:29:25,530 --> 00:29:27,480 Og i fortiden, enhver gang vi har prøvet at røre 674 00:29:27,480 --> 00:29:29,770 hukommelse, der ikke hører for os, hvad der er sket? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Eller næsten hver gang. 677 00:29:32,870 --> 00:29:34,310 Segmenteringsfejl, right? 678 00:29:34,310 --> 00:29:37,829 >> Denne pil, jeg har ingen idé om, hvor det er peger. det er bare nogle tilfældige værdi. 679 00:29:37,829 --> 00:29:40,370 Og selvfølgelig, hvis du fortolker en tilfældig værdi som en adresse, 680 00:29:40,370 --> 00:29:42,610 du kommer til at gå til nogle tilfældige destination. 681 00:29:42,610 --> 00:29:46,810 Så gabe måske faktisk nedbrud mit program i dette tilfælde her. 682 00:29:46,810 --> 00:29:50,600 >> Så hvad kan vi gøre, det er næsten lige så slemt? 683 00:29:50,600 --> 00:29:52,660 Overvej dette tredje og sidste eksempel på scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Denne version er bedre i hvilken forstand? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Hvis du er fortrolig med tidligere problem, det er bedre. 688 00:30:01,400 --> 00:30:02,250 Hvorfor? 689 00:30:02,250 --> 00:30:03,250 >> Publikum: [uhørligt]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 David J. MALAN: Godt. 692 00:30:07,110 --> 00:30:09,970 Så dette tilfælde linie 16 er bedre i den forstand, 693 00:30:09,970 --> 00:30:12,030 at vi er udtrykkeligt afsætte en del hukommelse. 694 00:30:12,030 --> 00:30:14,190 Vi bruger ikke malloc, vi bruger den uge 2 695 00:30:14,190 --> 00:30:16,060 tilgang af blot erklære et array. 696 00:30:16,060 --> 00:30:18,130 Og vi har sagt før, at en streng er blot et array af tegn, 697 00:30:18,130 --> 00:30:19,690 så det er helt legitimt. 698 00:30:19,690 --> 00:30:22,910 Men det er naturligvis, som du bemærke, fast størrelse, 16. 699 00:30:22,910 --> 00:30:25,440 >> Så er dette program helt sikkert, hvis jeg skriver 700 00:30:25,440 --> 00:30:29,760 i én tegnstrenge, to tegn strygere, 15 tegnstrenge. 701 00:30:29,760 --> 00:30:34,970 Men så snart jeg begynder at skrive 16, 17, 18, 1000 tegnstrenge 702 00:30:34,970 --> 00:30:37,390 hvor denne streng vil ende? 703 00:30:37,390 --> 00:30:39,570 Det kommer til at ende op delvis her. 704 00:30:39,570 --> 00:30:42,820 Men hvem ved hvad er ud over grænserne 705 00:30:42,820 --> 00:30:44,270 særlig dette array? 706 00:30:44,270 --> 00:30:48,015 >> Det er som om jeg har erklæret 16 kasser her. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Så i stedet for at trække ud alt 16, vil vi bare lade som om jeg har tegnet 16. 709 00:30:52,690 --> 00:30:56,540 Men hvis jeg så forsøger at læse en streng der er meget længere, ligesom 50 tegn, 710 00:30:56,540 --> 00:31:01,270 Jeg har tænkt mig at begynde at sætte a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Og det er formentlig anden lagersegment 712 00:31:04,916 --> 00:31:06,790 der igen kan forårsage mit program til at gå ned, 713 00:31:06,790 --> 00:31:10,600 fordi jeg ikke har bedt om noget mere end blot 16 bytes. 714 00:31:10,600 --> 00:31:12,260 >> Så hvem bekymrer sig? 715 00:31:12,260 --> 00:31:13,880 Nå, her er den CS50 biblioteket. 716 00:31:13,880 --> 00:31:17,220 Og de fleste af dette er blot ligesom vejledningen op øverst. 717 00:31:17,220 --> 00:31:21,670 Den CS50 bibliotek, al denne tid, har haft denne linje på linje 52. 718 00:31:21,670 --> 00:31:23,680 Vi har set typedef eller vil du se typedef 719 00:31:23,680 --> 00:31:27,930 i pset 4, som blot skaber en synonym hvorved char stjerne kan være mere 720 00:31:27,930 --> 00:31:29,290 simpelthen benævnt streng. 721 00:31:29,290 --> 00:31:31,540 Så dette er en af ​​de få støttehjul 722 00:31:31,540 --> 00:31:34,120 vi har brugt hemmeligt under motorhjelmen. 723 00:31:34,120 --> 00:31:36,490 >> I mellemtiden, her er den funktion, getchar. 724 00:31:36,490 --> 00:31:38,190 Nu åbenbart er der ingen krop til det. 725 00:31:38,190 --> 00:31:40,273 Og i virkeligheden, hvis jeg holder rulning, det gør jeg faktisk ikke 726 00:31:40,273 --> 00:31:42,080 se nogen implementeringer af disse funktioner. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Som tilregnelighed check, hvorfor er der? 729 00:31:45,516 --> 00:31:46,795 >> Publikum: [uhørligt]. 730 00:31:46,795 --> 00:31:47,670 David J. MALAN: Ja. 731 00:31:47,670 --> 00:31:48,950 Så dette er header fil. 732 00:31:48,950 --> 00:31:52,520 Og header filer indeholder prototyper, plus nogle andre ting, synes det, 733 00:31:52,520 --> 00:31:53,780 Ligesom typedefs. 734 00:31:53,780 --> 00:31:56,910 Men i CS50.c, som vi har aldrig givet dig direkte, 735 00:31:56,910 --> 00:32:02,100 men har været i CS50 apparatet alle denne gang, dybt inde i sine mapper, 736 00:32:02,100 --> 00:32:04,990 bemærke, at der er en hel bundt af funktioner i her. 737 00:32:04,990 --> 00:32:06,720 >> Faktisk, lad os rulle ned. 738 00:32:06,720 --> 00:32:08,810 Lad os ignorere de fleste af dem, for nu. 739 00:32:08,810 --> 00:32:12,670 Men rul ned til getInt og se, hvordan getInt fungerer. 740 00:32:12,670 --> 00:32:13,890 Så her er getInt. 741 00:32:13,890 --> 00:32:17,727 Og hvis du nogensinde virkelig plejet hvordan får int virker, her er dens dokumentation. 742 00:32:17,727 --> 00:32:19,560 Og blandt de ting det siger, er det fortæller dig 743 00:32:19,560 --> 00:32:21,340 hvad de værdier, det kan vende tilbage. 744 00:32:21,340 --> 00:32:24,400 Det er overvejende negativt 2 mia til positiv 2 milliarder, give eller tage. 745 00:32:24,400 --> 00:32:26,420 >> Og det viser sig, alt dette gang, selvom vi har aldrig 746 00:32:26,420 --> 00:32:28,570 du havde tjekke for det, hvis noget går galt, 747 00:32:28,570 --> 00:32:30,680 det viser sig, at alle denne gang, getInt har 748 00:32:30,680 --> 00:32:33,600 været tilbage en særlig konstant, ikke null, 749 00:32:33,600 --> 00:32:36,760 men int_max, som er bare en programmør konvention. 750 00:32:36,760 --> 00:32:38,846 Det betyder her er en særlig værdi. 751 00:32:38,846 --> 00:32:41,470 Sørg for at tjekke for dette, bare hvis noget går galt. 752 00:32:41,470 --> 00:32:43,261 Men vi har aldrig gidet med, at det hidtil 753 00:32:43,261 --> 00:32:45,200 fordi igen, denne menes at forenkle. 754 00:32:45,200 --> 00:32:46,950 >> Men hvordan getInt bliver gennemført? 755 00:32:46,950 --> 00:32:48,450 Tja, en, det tager ingen argumenter. 756 00:32:48,450 --> 00:32:49,390 Vi ved, at. 757 00:32:49,390 --> 00:32:50,820 Den returnerer en int. 758 00:32:50,820 --> 00:32:51,950 Vi ved, at. 759 00:32:51,950 --> 00:32:54,460 Så hvordan fungerer det under kølerhjelmen? 760 00:32:54,460 --> 00:32:58,290 >> Så der er tilsyneladende et uendeligt løkke mindst udseendet af en. 761 00:32:58,290 --> 00:33:00,290 Bemærk, at vi bruger getString. 762 00:33:00,290 --> 00:33:04,000 Så det er interessant. getInt kalder vores egen funktion, getString. 763 00:33:04,000 --> 00:33:05,645 Og nu, hvorfor kan dette være tilfældet? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Hvorfor bliver jeg defensiv her på linje 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Hvad kan der ske i overensstemmelse 164, bare for at være klar? 768 00:33:15,639 --> 00:33:16,930 Det er det samme svar som før. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Måske bare være ud af hukommelsen. 771 00:33:20,089 --> 00:33:23,130 Noget går galt med getString, vi er nødt til at kunne håndtere det. 772 00:33:23,130 --> 00:33:27,070 Og grunden til at jeg ikke vender tilbage null er at teknisk, null er en pointer. 773 00:33:27,070 --> 00:33:29,120 getInt har til at returnere en int. 774 00:33:29,120 --> 00:33:31,060 Så jeg har vilkårligt besluttede det væsentlige, 775 00:33:31,060 --> 00:33:34,600 at 2 milliarder, give eller tage, går at være en særlig værdi, som jeg kan aldrig 776 00:33:34,600 --> 00:33:35,970 faktisk komme fra brugeren. 777 00:33:35,970 --> 00:33:39,930 Det er bare den ene værdi, jeg har tænkt mig at spilde at repræsentere en fejlkode. 778 00:33:39,930 --> 00:33:41,540 >> Så nu, tingene bliver lidt fancy. 779 00:33:41,540 --> 00:33:44,670 Og det er ikke helt den samme funktion som før, men det er meget ens. 780 00:33:44,670 --> 00:33:50,120 Så bemærker, erklærer jeg her, på linje 172 både en int n og en char c. 781 00:33:50,120 --> 00:33:53,600 Og så bruger jeg denne funky linje, sscanf, som det viser sig 782 00:33:53,600 --> 00:33:55,990 scanner ikke en streng fra tastaturet. 783 00:33:55,990 --> 00:33:59,226 Det står en eksisterende streng, brugeren har allerede indtastet. 784 00:33:59,226 --> 00:34:02,100 Så jeg har allerede ringet getString, som betyder, at jeg har en streng i hukommelsen. 785 00:34:02,100 --> 00:34:05,020 sscanf er, hvad du ville kalde en parsing funktion. 786 00:34:05,020 --> 00:34:07,760 Det ser på strengen, jeg har indtastet, tegn for tegn, 787 00:34:07,760 --> 00:34:09,250 og gør noget nyttigt. 788 00:34:09,250 --> 00:34:10,969 Denne streng er lagret i linje. 789 00:34:10,969 --> 00:34:13,560 Og jeg ved, at kun ved at gå sikkerhedskopiere her og sige, åh, OK, 790 00:34:13,560 --> 00:34:15,143 Jeg kaldte det ikke er denne gang, men linje. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Og nu er det lidt anderledes. 793 00:34:18,080 --> 00:34:22,480 Men det betyder i realiteten, af grunde vi vil noget vinke vores hænder på i dag, 794 00:34:22,480 --> 00:34:26,070 at vi tjekker til se, om brugeren har indtastet 795 00:34:26,070 --> 00:34:29,909 og int og måske en anden karakter. 796 00:34:29,909 --> 00:34:33,610 Hvis brugeren har indtastet i en int, er det skal oplagres i n, fordi jeg 797 00:34:33,610 --> 00:34:36,739 passerer denne efter adresse, det nyt trick, vi har set i dag. 798 00:34:36,739 --> 00:34:41,570 Hvis brugeren også indtastet i lignende 123x, at x 799 00:34:41,570 --> 00:34:45,060 kommer til at ende med et brev karakter C. 800 00:34:45,060 --> 00:34:48,739 >> Nu viser det sig, at sscanf vil fortælle mig, intelligent, 801 00:34:48,739 --> 00:34:54,750 hvor mange variabler blev sscanf der er i stand til at udfylde. 802 00:34:54,750 --> 00:34:58,770 Så ved denne logik, hvis funktionen Jeg gennemførelse er getInt, 803 00:34:58,770 --> 00:35:00,900 men jeg tjekker, potentielt for brugeren 804 00:35:00,900 --> 00:35:04,190 at have skrevet i en int efterfulgt af noget andet, 805 00:35:04,190 --> 00:35:08,580 hvad vil jeg sscanf s returværdi virkelig være? 806 00:35:08,580 --> 00:35:10,950 Hvis formålet er at få bare en int fra brugeren? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Så hvis sscanf afkast 2, hvad betyder det? 809 00:35:19,300 --> 00:35:21,660 Brugeren har indtastet i noget lignende, bogstaveligt talt, 810 00:35:21,660 --> 00:35:24,770 123x, hvilket er lige noget vrøvl. 811 00:35:24,770 --> 00:35:27,490 Det er en fejl, og Jeg vil se efter det. 812 00:35:27,490 --> 00:35:32,960 >> Så hvis brugeren skriver dette i, ved denne logik, hvad betyder sscanf vende tilbage, 813 00:35:32,960 --> 00:35:33,740 ville du sige? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Så det kommer til at vende tilbage 2, fordi 123 kommer til at gå i her, 816 00:35:39,130 --> 00:35:41,580 og x kommer til at ende op i her. 817 00:35:41,580 --> 00:35:43,970 Men jeg ønsker ikke, at x for at få fyldt. 818 00:35:43,970 --> 00:35:48,580 Jeg ønsker at sscanf kun lykkes fylde den første af sine variabler. 819 00:35:48,580 --> 00:35:52,490 Og så det er derfor jeg ønsker sscanf at returnere 1. 820 00:35:52,490 --> 00:35:55,750 >> Og hvis det er en smule over hovedet for øjeblikket, det er helt fint. 821 00:35:55,750 --> 00:36:00,030 Indse dog, at en af ​​de værdier af getInt og getString 822 00:36:00,030 --> 00:36:03,630 er, at vi laver en pokkers af en masser af fejlkontrol ligesom dette så 823 00:36:03,630 --> 00:36:07,130 at der til dato, kan du temmelig meget skrive noget på dit tastatur, 824 00:36:07,130 --> 00:36:08,490 og vi vil fange den. 825 00:36:08,490 --> 00:36:10,592 Og vi bestemt, personale, vil helt sikkert ikke 826 00:36:10,592 --> 00:36:13,300 være kilde til en fejl i dit program, fordi vi er de defensive 827 00:36:13,300 --> 00:36:16,270 kontrol for alle de dumme ting, som en bruger kan gøre, 828 00:36:16,270 --> 00:36:18,900 ligesom at skrive en snor, når du virkelig ønskede int. 829 00:36:18,900 --> 00:36:21,350 Så for nu-- vi vil komme tilbage til dette før long-- 830 00:36:21,350 --> 00:36:23,710 men al denne tid, getString og getInt har 831 00:36:23,710 --> 00:36:29,950 været under hætten ved hjælp af denne grundlæggende idé om adresser på hukommelse. 832 00:36:29,950 --> 00:36:32,580 >> Så nu, lad os gøre tingene lidt mere brugervenligt. 833 00:36:32,580 --> 00:36:38,740 Som du måske husker, fra Binky sidste time-- hvis min mus vil samarbejde-- så 834 00:36:38,740 --> 00:36:42,560 vi havde denne kode, som helt ærligt, er temmelig meningsløst. 835 00:36:42,560 --> 00:36:45,330 Denne kode opnår intet nyttige, men det var eksempel 836 00:36:45,330 --> 00:36:48,330 at professor Parlante anvendes til at repræsentere 837 00:36:48,330 --> 00:36:51,840 hvad der foregik i en program med hukommelse. 838 00:36:51,840 --> 00:36:54,850 >> Så lad os genfortælle dette historie super kort. 839 00:36:54,850 --> 00:36:58,720 Disse første to linjer, i Engelsk, gør hvad, ville du sige? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Bare i rimeligt menneske, men lidt tekniske termer, tage et stik. 842 00:37:05,430 --> 00:37:06,346 Publikum: [uhørligt]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. MALAN: OK, du er oprettelse adresser til din variablerne x og y. 845 00:37:11,080 --> 00:37:15,520 Ikke helt, fordi x og y er ikke variabler i traditionel forstand. 846 00:37:15,520 --> 00:37:18,054 x og y er adresser eller gemmer adresse. 847 00:37:18,054 --> 00:37:19,220 Så lad os prøve en gang til. 848 00:37:19,220 --> 00:37:21,010 Ikke en dårlig start, selv om. 849 00:37:21,010 --> 00:37:21,510 Ja? 850 00:37:21,510 --> 00:37:22,426 >> Publikum: [uhørligt]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 David J. MALAN: Godt. 853 00:37:24,840 --> 00:37:26,173 Jeg tror, ​​det er en lidt renere. 854 00:37:26,173 --> 00:37:28,630 Erklære to pegepinde, to heltal. 855 00:37:28,630 --> 00:37:30,150 Og vi kalder dem x og y. 856 00:37:30,150 --> 00:37:32,790 Eller hvis vi skulle tegne dette som et billede, igen, 857 00:37:32,790 --> 00:37:36,410 husker ganske enkelt, at alle vi gør med den første linje 858 00:37:36,410 --> 00:37:39,690 trækker en boks som denne, med nogle skrald værdi i det, 859 00:37:39,690 --> 00:37:41,920 og kalder det x, og derefter anden boks som denne, 860 00:37:41,920 --> 00:37:43,880 med nogle skrald værdi i det, kalder det y. 861 00:37:43,880 --> 00:37:45,810 Vi har erklæret to pejlemærker, som i sidste ende 862 00:37:45,810 --> 00:37:47,860 vil gemme adressen på en int. 863 00:37:47,860 --> 00:37:49,170 Så det hele er der. 864 00:37:49,170 --> 00:37:53,290 >> Så når Binky gjorde dette, det ler bare lignede dette. 865 00:37:53,290 --> 00:37:55,350 Og Nick lige slags indhylles pilene, 866 00:37:55,350 --> 00:37:57,590 som om de ikke er peger overalt især fordi de er bare 867 00:37:57,590 --> 00:37:58,250 skrald værdier. 868 00:37:58,250 --> 00:38:01,670 De er ikke eksplicit initialiseret overalt i særdeleshed. 869 00:38:01,670 --> 00:38:03,980 >> Nu næste linje kode, husker, var dette. 870 00:38:03,980 --> 00:38:07,510 Så i rimelig brugervenlig, men noget teknisk engelsk, 871 00:38:07,510 --> 00:38:09,790 hvad er denne linje kode gør? 872 00:38:09,790 --> 00:38:10,391 Ja? 873 00:38:10,391 --> 00:38:11,333 >> Publikum: [uhørligt]. 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 Det er fordelingen af ​​den luns af hukommelse, der er på størrelse med en int. 877 00:38:17,016 --> 00:38:18,140 Og det er halvdelen svaret. 878 00:38:18,140 --> 00:38:20,056 Du svarede ret halvdelen af ​​udtrykket. 879 00:38:20,056 --> 00:38:22,473 Hvad der sker på venstre side af lighedstegnet? 880 00:38:22,473 --> 00:38:22,972 Ja? 881 00:38:22,972 --> 00:38:24,814 Publikum: Og tildeler den til variablen x? 882 00:38:24,814 --> 00:38:27,690 >> David J. MALAN: og erhververe den til variablen x. 883 00:38:27,690 --> 00:38:31,650 Så for at opsummere, højre side allokerer nok hukommelse til at gemme en int. 884 00:38:31,650 --> 00:38:34,150 Men malloc specifikt returnerer adresse 885 00:38:34,150 --> 00:38:37,270 af denne luns af hukommelse, som du har netop foreslået bliver gemt i x. 886 00:38:37,270 --> 00:38:42,560 >> Så hvad Nick gjorde sidste gang med Binky er han trak at pointer ud, leret, 887 00:38:42,560 --> 00:38:46,820 at pege nu på en hvid luns af hukommelse der er lig med størrelsen af ​​en int. 888 00:38:46,820 --> 00:38:49,360 Og ja, der er beregnet at repræsentere fire byte. 889 00:38:49,360 --> 00:38:55,310 >> Nu næste linje kode gjorde dette, stjerne x får 42. 890 00:38:55,310 --> 00:38:58,530 Så 42 er ligetil på højre side, meningen med livet. 891 00:38:58,530 --> 00:39:00,500 Venstre side, stjerne x betyder hvad? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Det også kan have gone-- det er OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> PUBLIKUM: Dybest set, gå til [uhørligt] 896 00:39:06,875 --> 00:39:07,750 David J. MALAN: Godt. 897 00:39:07,750 --> 00:39:08,760 Publikum: [uhørligt]. 898 00:39:08,760 --> 00:39:09,760 David J. MALAN: Præcis. 899 00:39:09,760 --> 00:39:11,979 Venstre side betyder gå til x. 900 00:39:11,979 --> 00:39:12,520 x er adresse. 901 00:39:12,520 --> 00:39:15,520 Det er ligesom 33 Oxford Street, eller OX1. 902 00:39:15,520 --> 00:39:18,690 Og stjerne x betyder at gå til det adresse og sætte det der? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Så ja, det er præcis, hvad Nick gjorde. 905 00:39:21,290 --> 00:39:23,740 Han startede med ved, væsentlige, mentalt 906 00:39:23,740 --> 00:39:26,270 peger en finger på x, efter pilen 907 00:39:26,270 --> 00:39:30,670 til den hvide boks på højre hånd side, og sætte nummer 42 der. 908 00:39:30,670 --> 00:39:34,120 Men så ting fik en lidt farligt, right? 909 00:39:34,120 --> 00:39:35,860 Binky er ved at miste sit hoved. 910 00:39:35,860 --> 00:39:39,465 >> Stjerne y lig 13, uheld, betyder hvad? 911 00:39:39,465 --> 00:39:43,620 Så stjerne y midler gå til adressen i y. 912 00:39:43,620 --> 00:39:45,630 Men hvad er adressen på y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Okay, det er skrald værdi, right? 915 00:39:49,440 --> 00:39:50,800 Jeg tegnede det som et spørgsmålstegn. 916 00:39:50,800 --> 00:39:54,850 Nick trak det som en krøllet pil op. 917 00:39:54,850 --> 00:39:59,600 Og så snart du forsøger at gøre stjerne y, siger derned, 918 00:39:59,600 --> 00:40:03,872 men der er ikke et legitimt adresse, det er nogle falske placering, 919 00:40:03,872 --> 00:40:05,080 programmet kommer til at gå ned. 920 00:40:05,080 --> 00:40:08,580 Og Binky hoved går at flyve fra her, som det gjorde. 921 00:40:08,580 --> 00:40:12,130 >> Så i sidste ende, dette program var bare flade ud fejl. 922 00:40:12,130 --> 00:40:13,540 Det var et fejlbehæftet program. 923 00:40:13,540 --> 00:40:14,760 Og det skulle fastsættes. 924 00:40:14,760 --> 00:40:18,260 Og den eneste måde, virkelig, at ordne det ville være, for eksempel, denne linje, 925 00:40:18,260 --> 00:40:21,010 som vi ikke engang komme til, fordi programmet styrtede for tidligt. 926 00:40:21,010 --> 00:40:26,170 Men hvis vi skulle løse dette, hvad virkning har at gøre y lige x have? 927 00:40:26,170 --> 00:40:30,010 Tja, i det væsentlige peger y på uanset værdi x peger på. 928 00:40:30,010 --> 00:40:32,430 >> Så i Nicks historie, eller Binky historie, både 929 00:40:32,430 --> 00:40:34,640 x og y pegede på hvid klump hukommelse, 930 00:40:34,640 --> 00:40:38,300 så endelig, når man gør stjerne y lig 13 igen, 931 00:40:38,300 --> 00:40:43,080 du ender med at sætte 13 i det rigtige sted. 932 00:40:43,080 --> 00:40:47,640 Så alle disse linjer er perfekt legitimt, bortset fra denne ene, 933 00:40:47,640 --> 00:40:51,730 når det er sket, før du faktisk tildelt å vis værdi. 934 00:40:51,730 --> 00:40:54,290 >> Nu heldigvis, behøver du ikke nødt til at ræsonnere gennem alle 935 00:40:54,290 --> 00:40:56,560 af disse former for problemer på egen hånd. 936 00:40:56,560 --> 00:40:59,310 Lad mig gå videre og åbne op en terminal vindue her 937 00:40:59,310 --> 00:41:03,050 og åbne op, for et øjeblik, en super kort program, 938 00:41:03,050 --> 00:41:04,360 også er en slags meningsløst. 939 00:41:04,360 --> 00:41:05,152 Det er grimt. 940 00:41:05,152 --> 00:41:06,610 Det betyder ikke opnå noget nyttigt. 941 00:41:06,610 --> 00:41:10,180 Men det betyder demonstrere spørgsmål hukommelse, så lad os tage et kig. 942 00:41:10,180 --> 00:41:11,830 >> Main, super enkel. 943 00:41:11,830 --> 00:41:14,830 Det opfordrer tilsyneladende en funktion, f, og derefter returnerer 0. 944 00:41:14,830 --> 00:41:16,310 Det er lidt svært at rod dette op. 945 00:41:16,310 --> 00:41:18,540 Så Main er temmelig godt, så langt. 946 00:41:18,540 --> 00:41:20,100 >> Så f er problematisk. 947 00:41:20,100 --> 00:41:22,120 Og bare ikke sætte meget kræfter ind på at navngive den 948 00:41:22,120 --> 00:41:23,990 her, for at holde fokus på koden. 949 00:41:23,990 --> 00:41:25,740 f har to linjer. 950 00:41:25,740 --> 00:41:27,610 Og lad os se, hvad der nu sker. 951 00:41:27,610 --> 00:41:29,840 Så på den ene side her-- og lad mig gøre 952 00:41:29,840 --> 00:41:32,680 dette er i overensstemmelse med den tidligere example-- på den ene side, 953 00:41:32,680 --> 00:41:35,830 venstre side er gør hvad, på engelsk? 954 00:41:35,830 --> 00:41:36,493 Det er-- 955 00:41:36,493 --> 00:41:37,701 PUBLIKUM: Oprettelse af en pegepind. 956 00:41:37,701 --> 00:41:40,830 David J. MALAN: Oprettelse af en pegepind til en int og kalder det x. 957 00:41:40,830 --> 00:41:43,789 Så det er at skabe en af ​​disse bokse Jeg bliver ved med at trække på den berøringsfølsomme skærm. 958 00:41:43,789 --> 00:41:45,913 Og nu, på højre hånd side allokere naturligvis 959 00:41:45,913 --> 00:41:47,420 afsætter en luns af hukommelse. 960 00:41:47,420 --> 00:41:49,989 Og bare for at være klar, hvordan meget hukommelse er det tilsyneladende 961 00:41:49,989 --> 00:41:52,030 fordeling, hvis du bare slags gøre det math her? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Så det er 40 byte. 964 00:41:54,040 --> 00:41:57,400 Og jeg ved, at kun fordi jeg kender en int på CS50 apparatet mindst 965 00:41:57,400 --> 00:41:58,060 er fire byte. 966 00:41:58,060 --> 00:41:59,610 Så 10 gange 4 er 40. 967 00:41:59,610 --> 00:42:04,924 Så dette er lagring en x, adressen af den første ud af 40 int'er der 968 00:42:04,924 --> 00:42:07,340 har fået tildelt plads tilbage, til tilbage, til at bakke, til ryggen. 969 00:42:07,340 --> 00:42:08,470 >> Og det er, hvad der er nøglen om malloc. 970 00:42:08,470 --> 00:42:11,261 Det behøver ikke tage en lille hukommelse her, lidt her, lidt her. 971 00:42:11,261 --> 00:42:14,220 Det giver dig en luns af hukommelse, tilstødende, fra operativsystemet 972 00:42:14,220 --> 00:42:15,240 systemet. 973 00:42:15,240 --> 00:42:18,500 >> Nu hvad dette, x konsollen 10 er lig med 0? 974 00:42:18,500 --> 00:42:19,470 Vilkårlig linje kode. 975 00:42:19,470 --> 00:42:21,100 Det betyder ikke opnå noget nyttigt. 976 00:42:21,100 --> 00:42:26,128 Men det er interessant, da x beslag 10--? 977 00:42:26,128 --> 00:42:26,628 Ja? 978 00:42:26,628 --> 00:42:27,912 >> Publikum: [uhørligt]? 979 00:42:27,912 --> 00:42:30,500 >> David J. MALAN: x beslag 10 behøver ikke at være nul. 980 00:42:30,500 --> 00:42:35,070 Null detalje kun kommer i spil med strenge, ved slutningen af ​​en streng. 981 00:42:35,070 --> 00:42:36,700 Men en god tanke. 982 00:42:36,700 --> 00:42:39,615 >> Hvor stort er dette array, selv selvom jeg har afsat 40 bytes? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Det er 0 gennem ni, right? 985 00:42:43,690 --> 00:42:45,120 Det er 10 ints, alt. 986 00:42:45,120 --> 00:42:48,790 40 bytes, men 10 int'er, indekseret 0 gennem 0. 987 00:42:48,790 --> 00:42:50,930 >> Så hvad er det x beslag 10? 988 00:42:50,930 --> 00:42:53,090 Det er faktisk nogle ukendt skrald værdi. 989 00:42:53,090 --> 00:42:54,780 Det er hukommelse, der ikke tilhører mig. 990 00:42:54,780 --> 00:42:59,650 Jeg skal ikke røre det byte nummer 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Jeg har tænkt mig lidt for langt. 992 00:43:01,420 --> 00:43:04,490 >> Og ja, hvis jeg køre denne programmet, kan det meget vel gå ned. 993 00:43:04,490 --> 00:43:05,790 Men nogle gange, får vi heldige. 994 00:43:05,790 --> 00:43:07,706 Og så bare for at demonstrere denne-- og helt ærligt, 995 00:43:07,706 --> 00:43:11,000 du aldrig vide, før du gør det-- lad os køre dette. 996 00:43:11,000 --> 00:43:12,480 Det gjorde faktisk ikke ned. 997 00:43:12,480 --> 00:43:15,032 >> Men hvis jeg ændre det, for Eksempelvis at være som 1000, 998 00:43:15,032 --> 00:43:16,740 at gøre dette virkelig bevidst, lad os se 999 00:43:16,740 --> 00:43:18,710 hvis vi kan få det til at gå ned denne gang. 1000 00:43:18,710 --> 00:43:20,070 OK, det ikke ned. 1001 00:43:20,070 --> 00:43:22,600 Hvordan omkring 100.000? 1002 00:43:22,600 --> 00:43:25,000 Lad os lave den, og nu kør det. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Pyha. 1005 00:43:25,960 --> 00:43:26,460 Okay. 1006 00:43:26,460 --> 00:43:29,090 Så tilsyneladende igen, disse segmenter af hukommelse, så at sige, 1007 00:43:29,090 --> 00:43:32,660 er rimelig store, så vi kan få heldige igen og igen. 1008 00:43:32,660 --> 00:43:36,510 Men til sidst, når du får latterligt og virkelig gå langt ud på skærmen, 1009 00:43:36,510 --> 00:43:39,120 du rører hukommelse, der virkelig, virkelig ikke tilhører dig. 1010 00:43:39,120 --> 00:43:40,870 >> Men helt ærligt, disse typer af fejl går 1011 00:43:40,870 --> 00:43:43,020 at blive sværere og sværere at finde ud af på egen hånd. 1012 00:43:43,020 --> 00:43:47,880 Men heldigvis, som programmører, vi har værktøjer, der giver os mulighed for at gøre dette for os. 1013 00:43:47,880 --> 00:43:50,140 Så dette er måske en af de grimmeste programmer 1014 00:43:50,140 --> 00:43:52,060 endnu grimmere end gdb output. 1015 00:43:52,060 --> 00:43:55,670 Men det altid har en linje eller to, der er super nyttige. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind er et program, der hjælper ikke debug et program i sig selv, 1017 00:44:00,310 --> 00:44:03,500 men find hukommelsesrelateret problemer, specifikt. 1018 00:44:03,500 --> 00:44:07,590 Det vil automatisk køre din kode til dig og se efter mindst to ting. 1019 00:44:07,590 --> 00:44:10,680 En, gjorde du noget utilsigtet føles som hukommelse 1020 00:44:10,680 --> 00:44:11,980 der ikke tilhører dig? 1021 00:44:11,980 --> 00:44:13,590 Det vil hjælpe dig med at finde disse sager. 1022 00:44:13,590 --> 00:44:15,710 >> Og to, vil det hjælpe du finder noget, der hedder 1023 00:44:15,710 --> 00:44:19,270 memory leaks, som vi har fuldstændig ignoreret, naivt, 1024 00:44:19,270 --> 00:44:21,380 i nogen tid og saligt. 1025 00:44:21,380 --> 00:44:23,140 Men det viser sig, alle dette tidspunkt, når 1026 00:44:23,140 --> 00:44:26,620 du har kaldt getString i så mange af vores programmer, 1027 00:44:26,620 --> 00:44:28,930 du spørger operativsystemet for hukommelse, 1028 00:44:28,930 --> 00:44:32,070 men du har nogen erindring om nogensinde at give det 1029 00:44:32,070 --> 00:44:36,169 tilbage, laver UFORDELT eller fri, som det hedder. 1030 00:44:36,169 --> 00:44:37,960 Nej, fordi vi har aldrig bedt dig om at gøre det. 1031 00:44:37,960 --> 00:44:41,250 >> Men alt dette tid, programmerne du har skrevet i C 1032 00:44:41,250 --> 00:44:43,800 har været utæt hukommelse, beder operativsystemet 1033 00:44:43,800 --> 00:44:46,190 system til mere og mere hukommelse for strygere og whatnot, 1034 00:44:46,190 --> 00:44:47,870 men aldrig at aflevere det tilbage. 1035 00:44:47,870 --> 00:44:50,080 Og nu er det en smule af en forsimpling, 1036 00:44:50,080 --> 00:44:53,550 men hvis du nogensinde har kørt din Mac eller din pc i temmelig lang tid, åbning 1037 00:44:53,550 --> 00:44:55,790 masser af programmer, måske lukke programmer, 1038 00:44:55,790 --> 00:44:57,795 og selvom din Computeren har ikke styrtede ned, 1039 00:44:57,795 --> 00:45:01,690 det er at få så meget langsommere, som om det er virkelig 1040 00:45:01,690 --> 00:45:04,290 ved hjælp af en masse hukommelse eller midler, selv om 1041 00:45:04,290 --> 00:45:06,070 hvis du ikke er selv røre ved tastaturet, 1042 00:45:06,070 --> 00:45:10,430 at kunne være-- men ikke always-- kunne være, at de programmer, du kører 1043 00:45:10,430 --> 00:45:11,920 har selv memory leaks. 1044 00:45:11,920 --> 00:45:15,645 Og de holde beder OS om mere og mere hukommelse, men glemmer det, 1045 00:45:15,645 --> 00:45:18,470 faktisk ikke bruge det, men derfor tage hukommelse væk 1046 00:45:18,470 --> 00:45:20,500 fra andre programmer, der måtte ønske det. 1047 00:45:20,500 --> 00:45:23,940 Så det er en fælles forklaring. 1048 00:45:23,940 --> 00:45:25,940 Nu her er hvor Valgrind s udgang fuldstændig 1049 00:45:25,940 --> 00:45:29,290 grusomme til de mindre og mere komfortabel ens. 1050 00:45:29,290 --> 00:45:32,690 Men det interessante ting er lige heroppe. 1051 00:45:32,690 --> 00:45:37,060 Det fortæller mig en ugyldig skrive af størrelse fire sker i dette program, 1052 00:45:37,060 --> 00:45:40,640 især på linje 21 i memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Hvis jeg går til linje 21, hm, der faktisk er et ugyldigt skrive størrelse fire. 1054 00:45:45,450 --> 00:45:46,250 Hvorfor størrelse fire? 1055 00:45:46,250 --> 00:45:49,500 Nå, dette number-- og det kunne være noget, vi kan, er en int. 1056 00:45:49,500 --> 00:45:50,450 Så det er fire byte. 1057 00:45:50,450 --> 00:45:52,550 Så jeg sætte fire bytes hvor de ikke hører til. 1058 00:45:52,550 --> 00:45:55,080 Det er, hvad Valgrind er faktisk fortæller mig. 1059 00:45:55,080 --> 00:45:57,600 Desuden vil det også fortælle mig, som vi skal se, 1060 00:45:57,600 --> 00:46:01,490 som du kører dette i en fremtidig pset, hvis og når du har lækket hukommelse, hvilket faktisk 1061 00:46:01,490 --> 00:46:05,300 Jeg har, fordi jeg har kaldt malloc, men jeg har faktisk ikke 1062 00:46:05,300 --> 00:46:08,010 kaldes, i dette tilfælde, fri som vi vil til sidst se 1063 00:46:08,010 --> 00:46:09,830 er det modsatte af malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Så nu, tror jeg, et sidste eksempel. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Så denne ene er lidt mere mystisk, men det er måske 1068 00:46:16,690 --> 00:46:19,180 den største grund til være forsigtig med hukommelse, 1069 00:46:19,180 --> 00:46:24,490 og årsagen til, at mange programmer og / eller web-servere, selv til denne dag, 1070 00:46:24,490 --> 00:46:28,200 bliver overtaget af skurkene sted på internettet, der er en eller anden måde 1071 00:46:28,200 --> 00:46:33,390 sende falske pakker til din server forsøger at kompromittere dine konti, 1072 00:46:33,390 --> 00:46:36,420 eller tage dine data, eller bare generelt overtage en maskine. 1073 00:46:36,420 --> 00:46:38,910 Bufferoverløb, som navnet antyder, betyder 1074 00:46:38,910 --> 00:46:40,740 overfyldte ikke en int, men en buffer. 1075 00:46:40,740 --> 00:46:43,490 Og en buffer er bare en fancy måde at sige det er en masse hukommelse. 1076 00:46:43,490 --> 00:46:46,710 >> Og ja, jeg kaldte en streng før puffer i stedet for filtre. 1077 00:46:46,710 --> 00:46:49,234 For hvis det er en buffer, ligesom i YouTube forstand, 1078 00:46:49,234 --> 00:46:52,400 eller hver gang du ser en video, Du har måske set ordet bufferkapacitet, 1079 00:46:52,400 --> 00:46:53,040 prik, prik, prik. 1080 00:46:53,040 --> 00:46:54,240 Det er utroligt irriterende. 1081 00:46:54,240 --> 00:46:55,990 Og det betyder bare at din video afspiller 1082 00:46:55,990 --> 00:46:58,710 forsøger at hente masser byte, masser af bytes 1083 00:46:58,710 --> 00:47:00,170 fra en video fra internettet. 1084 00:47:00,170 --> 00:47:02,920 Men det er langsom, så det forsøger at downloade en masse af dem 1085 00:47:02,920 --> 00:47:06,430 at fylde en buffer, en beholder, således at du har nok bytes, at det derefter kan 1086 00:47:06,430 --> 00:47:09,174 vise dig videoen, uden at holde pause konstant. 1087 00:47:09,174 --> 00:47:11,340 Men det viser sig, du kan har en buffer til denne store. 1088 00:47:11,340 --> 00:47:15,710 Men prøv at sætte så meget data det, og meget dårlige ting kan ske. 1089 00:47:15,710 --> 00:47:22,780 Så for eksempel, lad os se på denne sidste teaser af et eksempel. 1090 00:47:22,780 --> 00:47:24,720 Dette er et andet program at, ved første øjekast, 1091 00:47:24,720 --> 00:47:26,540 ikke gør noget super nyttigt. 1092 00:47:26,540 --> 00:47:29,590 Det har fået en Hovedfunktion der kalder denne funktion, f. 1093 00:47:29,590 --> 00:47:36,640 Og denne funktion, f, op her, har en char array, kaldet C, i størrelse 12. 1094 00:47:36,640 --> 00:47:39,340 Og så er det ved hjælp af denne ny funktion kaldet strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Det viser sig, at der med denne simple, enkel linje kode, blot to linjer, 1097 00:47:45,190 --> 00:47:49,130 vi har gjort hele mit program, og derfor hele min computer, 1098 00:47:49,130 --> 00:47:54,000 og min brugerkonto, og min hårdt køre potentielt sårbare over for nogen 1099 00:47:54,000 --> 00:47:58,170 der kender og er god nok til at køre dette program med en vis kommandolinje 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 Med andre ord, hvis denne dårlige fyr lægger inde i argvargv [1] ved at skrive 1102 00:48:03,400 --> 00:48:08,750 på tastaturet et meget særligt udformet streng, ikke ABC, 123, men i det væsentlige, 1103 00:48:08,750 --> 00:48:15,180 binære symboler, der repræsenterer eksekverbare kode, et program, som han eller hun skrev, 1104 00:48:15,180 --> 00:48:19,190 med dette enkle program, der er repræsentant for tusindvis af programmer 1105 00:48:19,190 --> 00:48:23,610 der er ligeledes sårbare, daresay, han eller hun kan i sidste ende slette alle 1106 00:48:23,610 --> 00:48:26,680 filerne på min harddisk, få en blinkende prompt, så han eller hun kan 1107 00:48:26,680 --> 00:48:30,170 skrive kommandoer på egen hånd, e-mail alle filer til mig selv. 1108 00:48:30,170 --> 00:48:34,660 Alt, hvad jeg kan gøre, han eller hun kan gøre med denne kode. 1109 00:48:34,660 --> 00:48:36,575 >> Vi vil ikke helt løse dette endnu. 1110 00:48:36,575 --> 00:48:38,700 Og i virkeligheden, går det til involvere et lille billede 1111 00:48:38,700 --> 00:48:41,470 som dette, som vi vil snart komme at forstå alle de bedre. 1112 00:48:41,470 --> 00:48:44,480 Men i dag, lad os slutte på hvad er forhåbentlig en lidt mere 1113 00:48:44,480 --> 00:48:48,360 forståeligt XKCD vittighed, indtil vi genoptager næste gang. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Okay. 1116 00:48:51,600 --> 00:48:53,446 Se dig på onsdag. 1117 00:48:53,446 --> 00:48:54,754 >> [Musik spiller] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: Og nu, dyb tanker, ved Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Hukommelse er som at hoppe ind i en bunke af gyldne blade på en søndag eftermiddag. 1121 00:49:04,770 --> 00:49:09,000 Vinden, smide din hair-- Åh, jeg savner de dage when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Latter] 1124 00:49:12,650 --> 00:49:13,750