1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Prehrávanie hudby] 3 00:00:11,261 --> 00:00:12,640 >> David J. Malan: Dobre. 4 00:00:12,640 --> 00:00:14,525 To je CS50. 5 00:00:14,525 --> 00:00:16,009 A to je začiatok týždňa 5. 6 00:00:16,009 --> 00:00:18,050 A ako ste si možno všimli, niektoré z materiálu 7 00:00:18,050 --> 00:00:21,050 je stále o niečo viac komplexné, trochu hustejšia. 8 00:00:21,050 --> 00:00:24,560 >> A je to veľmi jednoduché, a to najmä v prípade, ste boli vo zvyku na nejakú dobu, 9 00:00:24,560 --> 00:00:28,600 že sa snaží čmárať po väčšinu niečo, čo robíme, hovoríme v triede. 10 00:00:28,600 --> 00:00:31,626 Ale uvedomiť si, že nie je potrebné Ideálne pedagogický prístup 11 00:00:31,626 --> 00:00:34,250 k učeniu, tento druh materiálu, a materiály všeobecne. 12 00:00:34,250 --> 00:00:37,250 A tak sme radi, že oznamuje, že CS50 vlastné Gheng 13 00:00:37,250 --> 00:00:39,780 Gong začala pripravovať kánonický súbor poznámok 14 00:00:39,780 --> 00:00:42,100 do kurzu, nádeje , Ktorý je, že, jedna, táto 15 00:00:42,100 --> 00:00:44,030 slúži nielen ako referencie a zdroje 16 00:00:44,030 --> 00:00:47,410 pre preskúmanie materiálu a bude späť prostredníctvom materiálu, ktorý môže mať 17 00:00:47,410 --> 00:00:51,230 Utiekol ste na prvýkrát, ale tiež preto, že vaše hlavy môže byť viac 18 00:00:51,230 --> 00:00:53,740 hore ako dole, keď ho príde čas na prednášku, 19 00:00:53,740 --> 00:00:56,960 tak, že by ste mohli zapojiť viac zamyslene, ako 20 00:00:56,960 --> 00:00:59,170 na rozdiel od viacerých Scribble. 21 00:00:59,170 --> 00:01:02,510 >> Vďaka, že povedal, čo nájdete na Webové stránky sú tieto dokumenty ako tento. 22 00:01:02,510 --> 00:01:04,660 A oznámenia, v ľavom hornom rohu, tam je nielen obsah, 23 00:01:04,660 --> 00:01:06,920 ale aj časové kódy, ktoré okamžite skočíte 24 00:01:06,920 --> 00:01:09,077 na príslušnú časť vo video on-line. 25 00:01:09,077 --> 00:01:11,410 A čo Chang tu urobil je, v podstate, dokumentácia 26 00:01:11,410 --> 00:01:13,340 čo sa stalo v tomto Najmä prednáška. 27 00:01:13,340 --> 00:01:16,370 A mnoho z prednášok Už teraz online s týmto URL. 28 00:01:16,370 --> 00:01:20,110 A budeme pokračovať, aby ste mohli písať zvyšok z tých, do konca tohto týždňa, 29 00:01:20,110 --> 00:01:22,380 takže sa využiť tohto zdroja. 30 00:01:22,380 --> 00:01:25,740 >> Takže bez ďalších okolkov, sme začali lúpať späť 31 00:01:25,740 --> 00:01:28,180 vrstva, ktorá je string na nejakú dobu. 32 00:01:28,180 --> 00:01:30,670 A to, čo sme si povedali reťazec je vlastne minulý týždeň? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Takže char hviezda. 35 00:01:32,900 --> 00:01:34,900 A char hviezda, no, čo sa to vlastne znamená? 36 00:01:34,900 --> 00:01:37,150 No, tentoraz, ak máme bolo volanie funkcie, 37 00:01:37,150 --> 00:01:40,450 ako getString a skladovanie tak zvané vratnej 38 00:01:40,450 --> 00:01:42,910 Hodnota getString v proměnná-- sa to volá 39 00:01:42,910 --> 00:01:47,721 s Typ string-- sme písali riadok kódu tam hore. 40 00:01:47,721 --> 00:01:49,970 A to je len, keď vidím, môj rukopis tu zväčšený 41 00:01:49,970 --> 00:01:51,930 to som si uvedomil, ako je to otrasné. 42 00:01:51,930 --> 00:01:54,180 >> Avšak predpokladajme, že, na pravej strane 43 00:01:54,180 --> 00:01:57,070 je, však, primerané zobrazenie toho, čo je 44 00:01:57,070 --> 00:01:58,880 sa deje toto všetko tentoraz s getString. 45 00:01:58,880 --> 00:02:00,380 getString, samozrejme, dostane reťazec. 46 00:02:00,380 --> 00:02:01,691 Ale čo to vlastne znamená? 47 00:02:01,691 --> 00:02:04,190 To znamená, že dostane kus pamäť od operačného systému 48 00:02:04,190 --> 00:02:06,040 volaním funkcie s názvom malloc. 49 00:02:06,040 --> 00:02:07,390 Ale o tom viac neskôr. 50 00:02:07,390 --> 00:02:09,139 A potom sa to vyplní že kus pamäte 51 00:02:09,139 --> 00:02:11,764 s písmenami užívateľ zadali, nasleduje, samozrejme, 52 00:02:11,764 --> 00:02:14,800 znak null, alebo spätné lomítko nula až na samom konci. 53 00:02:14,800 --> 00:02:18,280 >> Medzitým, na ľavej strane tohto príbehu, celú tú dobu, 54 00:02:18,280 --> 00:02:20,850 sme boli deklarovanie premenné, ako s. 55 00:02:20,850 --> 00:02:24,770 A že premenná je to, čo teraz začne volať ukazovateľ. 56 00:02:24,770 --> 00:02:29,190 Nie je to krabica vnútri, ktoré dáme reťazec, Daven, samo o sebe, 57 00:02:29,190 --> 00:02:32,550 ale dáme v tomto námestí poľa na ľavej strane, čo presne? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Jo? 60 00:02:35,390 --> 00:02:37,118 >> Divákov: Adresa kde je umiestnený v pamäti. 61 00:02:37,118 --> 00:02:38,118 >> David J. Malan: Presne tak. 62 00:02:38,118 --> 00:02:40,690 Adresa, kde Daven sa nachádza v pamäti. 63 00:02:40,690 --> 00:02:44,650 A nie je tam, kde sa nachádzajú všetky Daven samy o sebe, ale konkrétne adresa 64 00:02:44,650 --> 00:02:45,150 z čoho? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Jo? 67 00:02:46,810 --> 00:02:47,460 >> Divákov: Prvý znak. 68 00:02:47,460 --> 00:02:50,209 >> David J. Malan: Prvý znak v Daven, ktorá v tomto prípade, 69 00:02:50,209 --> 00:02:53,820 Navrhol som bol svojvoľne a nerealisticky 1 OX1, 70 00:02:53,820 --> 00:02:55,910 čo práve znamená, že hexadecimálne číslo jedna. 71 00:02:55,910 --> 00:02:57,993 Ale to asi bude byť oveľa väčší počet 72 00:02:57,993 --> 00:03:01,260 že by sme mohli čerpať s 0x ako predpona, 73 00:03:01,260 --> 00:03:02,806 predstavuje hexadecimálny znak. 74 00:03:02,806 --> 00:03:05,930 A pretože nepotrebujeme vedieť, kde Zvyšok postáv Daven 75 00:03:05,930 --> 00:03:09,860 sú, pretože to, čo jednoduchý dizajn rozhodnutia, ktorá bola vyrobená pred mnohými rokmi? 76 00:03:09,860 --> 00:03:10,548 Jo? 77 00:03:10,548 --> 00:03:11,651 >> Divákov: Spätné lomítko 0. 78 00:03:11,651 --> 00:03:12,900 David J. Malan: Áno, presne tak. 79 00:03:12,900 --> 00:03:18,100 Spätné lomítko 0 umožňuje, aj keď v lineárny čas, prechádzať reťazec, 80 00:03:18,100 --> 00:03:20,400 chôdze od ľava do prava, sa pre slučky, alebo na chvíľu 81 00:03:20,400 --> 00:03:22,608 slučky, alebo niečo také že, a určiť, oh, tu 82 00:03:22,608 --> 00:03:24,751 je koniec tohto konkrétneho reťazca. 83 00:03:24,751 --> 00:03:27,000 A tak sa len adresu, na začiatok reťazca, 84 00:03:27,000 --> 00:03:30,290 môžeme pristupovať celistvosť za to, pretože celú tú dobu, 85 00:03:30,290 --> 00:03:32,030 reťazec bol len znak hviezda. 86 00:03:32,030 --> 00:03:36,370 >> Takže je to určite v poriadku aj naďalej používať CS50 knižnice, a to abstrakcia, 87 00:03:36,370 --> 00:03:38,440 aby som tak povedal, ale budeme začína presne vidieť, 88 00:03:38,440 --> 00:03:41,230 čo sa deje pod celú túto dobu. 89 00:03:41,230 --> 00:03:45,260 Takže si možno spomenú tento príklad, Tiež od minule, porovnať 0, 90 00:03:45,260 --> 00:03:47,300 ktorá ani vlastne nie je porovnanie. 91 00:03:47,300 --> 00:03:49,070 Ale začali sme to vyriešiť. 92 00:03:49,070 --> 00:03:52,020 >> Ale ako asi opakovacie, Mohol by som zaujímať niekoho 93 00:03:52,020 --> 00:03:54,261 v ružovej slon dnes, tiež by Chang? 94 00:03:54,261 --> 00:03:55,760 Ako sa o vás vo fronte? [Nepočuteľné]. 95 00:03:55,760 --> 00:03:56,660 Poď hore. 96 00:03:56,660 --> 00:03:58,740 >> A do tej doby, ako ste prišli, poďme 97 00:03:58,740 --> 00:04:01,670 do úvahy len na okamih, čo Tento kód bol vlastne robí. 98 00:04:01,670 --> 00:04:04,917 Je to deklarovať dve premenné sa top, s a t, a volanie getString. 99 00:04:04,917 --> 00:04:08,250 To nie je veľmi užívateľsky príjemný program, pretože nehovorí, čo mám robiť. 100 00:04:08,250 --> 00:04:10,541 Ale poďme len predpokladať, že sme so zameraním na šťavnaté časti. 101 00:04:10,541 --> 00:04:14,470 A potom budeme robiť, ak je s rovná rovná t, mal by povedať printf, 102 00:04:14,470 --> 00:04:16,170 ste zadali to isté. 103 00:04:16,170 --> 00:04:16,670 Dobrý deň. 104 00:04:16,670 --> 00:04:17,050 Ako sa voláte? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 David J. Malan: Janelle, Rád vás spoznávam. 107 00:04:19,529 --> 00:04:21,800 Takže vašu výzvu na ruku pre slona 108 00:04:21,800 --> 00:04:25,230 je najprv nakresliť nám obraz toho, čo je zastúpený v tých prvých dvoch 109 00:04:25,230 --> 00:04:25,970 linky. 110 00:04:25,970 --> 00:04:28,139 Takže s a t môže byť zastúpené ako na obrazovke? 111 00:04:28,139 --> 00:04:30,680 A môžete len kresliť s prst na tejto veľkej obrazovke. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Takže tam sú dve polovice na každá strana tejto rovnice. 114 00:04:34,510 --> 00:04:37,760 Takže tam je to s na ľavej strane, a potom getString na pravej strane. 115 00:04:37,760 --> 00:04:40,540 A potom je tu t na ľavej strane, a potom getString na pravej strane. 116 00:04:40,540 --> 00:04:42,630 Tak ako môžeme začať kreslenie obrázok, ktorý 117 00:04:42,630 --> 00:04:46,340 predstavuje to, čo sa deje tu v pamäti, povedali by ste? 118 00:04:46,340 --> 00:04:49,150 A dovoľte mi, aby som vám vysvetlil to, čo robíte, ako to je. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 No, v prvom, to by sa pýtať, môžete získať vstupný reťazec. 121 00:04:58,890 --> 00:05:00,439 A to by store-- oh, prepáčte. 122 00:05:00,439 --> 00:05:01,230 David J. Malan: OK. 123 00:05:01,230 --> 00:05:01,730 Dobre. 124 00:05:01,730 --> 00:05:03,330 A to sa hovorí, čo? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Len tak ďalej. 127 00:05:04,450 --> 00:05:05,575 Nechcela som rušiť. 128 00:05:05,575 --> 00:05:07,060 Janelle: Ospravedlňujem sa. 129 00:05:07,060 --> 00:05:14,237 Tak to by vstup do adresa of-- nie je istý. 130 00:05:14,237 --> 00:05:17,320 Nemôžem presne spomenúť na číslo, ale verím, že sa začína s 0. 131 00:05:17,320 --> 00:05:18,420 >> David J. Malan: To je v poriadku, pretože som čísla hore, 132 00:05:18,420 --> 00:05:19,650 takže nie je správna odpoveď. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Počnúc 0 oblúku. 134 00:05:22,105 --> 00:05:24,000 >> David J. Malan: OK, tak prvok 0. 135 00:05:24,000 --> 00:05:24,765 Iste. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: A potom, ak bol ako len dva-letter-- 137 00:05:28,295 --> 00:05:30,496 >> David J. Malan: OK, späť k vám. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Takže prvok 0, a potom prvok 1 alebo 2 prvkom. 139 00:05:33,629 --> 00:05:36,670 David J. Malan: A ktorý kus obrázok sa vám práve teraz kreslenie? 140 00:05:36,670 --> 00:05:37,690 Výzva na getString? 141 00:05:37,690 --> 00:05:38,830 Alebo vyhlásenia s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Vyhlásenie o zhode S, verím. 143 00:05:42,890 --> 00:05:45,980 Oh, getString, pretože by to byť vložené do každého [? oblasť. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. Malan: Dobrý. 145 00:05:46,510 --> 00:05:47,051 Presne tak. 146 00:05:47,051 --> 00:05:49,300 Aj keď sa toto účinne vracia pole, odvolanie, 147 00:05:49,300 --> 00:05:53,300 Až sa vrátime reťazec, môžeme index do tohto reťazca s použitím 01 a 2. 148 00:05:53,300 --> 00:05:56,180 Technicky sa jedná o pravdepodobne zastúpené jednotlivé adresy, 149 00:05:56,180 --> 00:05:57,100 ale to je v poriadku. 150 00:05:57,100 --> 00:06:00,170 >> Takže predpokladám, či môžem len rýchlo odovzdať tam, kde sme skončili 151 00:06:00,170 --> 00:06:04,320 Naposledy, ak jeden z reťazca bola g b e, 152 00:06:04,320 --> 00:06:10,337 spätné lomítko 0, čo predstavuje Gabe je vstup, ako môžeme predstavovať to teraz? 153 00:06:10,337 --> 00:06:12,670 Ak je to pamäť, ktorá je bola vrátená getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Bolo by to zastúpená oblúkom? 156 00:06:17,610 --> 00:06:18,750 >> David J. Malan: oblúkom? 157 00:06:18,750 --> 00:06:19,130 No, no. 158 00:06:19,130 --> 00:06:21,171 Povedzme, obrazovo, dovoľte mi, aby som jednoducho ísť dopredu 159 00:06:21,171 --> 00:06:25,710 a navrhujú, že, ak je to s, toto je vrátená hodnota getString. 160 00:06:25,710 --> 00:06:29,482 A vy ste vyvodiť to ako 0, 1, 2, čo je úplne rozumné, pretože sme 161 00:06:29,482 --> 00:06:30,940 môže index do reťazca, ako také. 162 00:06:30,940 --> 00:06:33,340 Ale len preto, aby bol v súlade s naposledy, nechaj ma ísť napred 163 00:06:33,340 --> 00:06:37,310 a ľubovoľne navrhnúť, aby tento je adresa 1, je to adresa 2, 164 00:06:37,310 --> 00:06:39,597 Táto adresa je 3, a tak ďalej. 165 00:06:39,597 --> 00:06:41,430 A tak jednoducho byť super jasné, čo sa deje 166 00:06:41,430 --> 00:06:44,580 ísť s následkom, že Prvý riadok kódu, by to povedal? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Adresa 1? 168 00:06:45,420 --> 00:06:46,420 >> David J. Malan: Presne tak. 169 00:06:46,420 --> 00:06:47,190 Takže riešenie 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 A medzitým, nechajte ma ísť napred a duplikovať veľa z toho, čo ste urobili 172 00:06:51,230 --> 00:06:52,740 a pridajte sem svoj vlastný tričko. 173 00:06:52,740 --> 00:06:56,340 Ak by som mal písať v Gabe opäť, druhýkrát, 174 00:06:56,340 --> 00:07:01,530 Po zobrazení výzvy s getString, kde Samozrejme, je Gabe ísť? 175 00:07:01,530 --> 00:07:02,280 No, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Rovnako ako tu? 178 00:07:05,975 --> 00:07:06,850 David J. Malan: Jo. 179 00:07:06,850 --> 00:07:08,516 Janelle: Alebo je to tiež v rovnakých boxoch? 180 00:07:08,516 --> 00:07:11,940 David J. Malan: Dovoľte mi navrhnúť, jo, presne, takže v týchto ďalších zariadení. 181 00:07:11,940 --> 00:07:15,230 Ale to, čo je teraz Kľúčom k úspechu je, že aj keď som vyvodiť to veľmi blízko 182 00:07:15,230 --> 00:07:18,650 dohromady-- 0x1, toto je 0x2-- v skutočnosti, 183 00:07:18,650 --> 00:07:25,750 teraz by mohla byť adresa 0x10, Napríklad, a 0x11, 0x12 a, 184 00:07:25,750 --> 00:07:26,870 a tak ďalej. 185 00:07:26,870 --> 00:07:29,955 A tak, ak je to ten prípad, čo sa deje, že skončí tu v t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 David J. Malan: Presne tak. 188 00:07:31,830 --> 00:07:33,180 Takže 0x10. 189 00:07:33,180 --> 00:07:34,570 A tak teraz, posledná otázka. 190 00:07:34,570 --> 00:07:37,510 Ste zďaleka, musel pracovať Najťažšie pre slona tak ďaleko. 191 00:07:37,510 --> 00:07:42,650 Do teraz, keď som vytiahnuť kód znova, keď som si v súlade tri, 192 00:07:42,650 --> 00:07:47,630 ak je rovná rovná t, čo som vlastne porovnaním, že sme tu vyvodiť? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: dve adresy? 194 00:07:49,271 --> 00:07:50,270 David J. Malan: Presne tak. 195 00:07:50,270 --> 00:07:53,350 Takže hovorím, je S equal na t? 196 00:07:53,350 --> 00:07:56,210 Inými slovami, je rovný 1 rovná 10? 197 00:07:56,210 --> 00:07:59,710 A samozrejme, Zrejmá odpoveď je teraz nie. 198 00:07:59,710 --> 00:08:02,920 A tak tento program je v konečnom dôsledku do tlače čo by ste povedali? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Bolo by to, ste zadali rovnakú vec? 201 00:08:08,405 --> 00:08:11,446 >> David J. Malan: Takže ak s je 1 a t je 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Zadali ste rôzne veci. 203 00:08:13,320 --> 00:08:13,570 >> David J. Malan: Presne tak. 204 00:08:13,570 --> 00:08:14,480 Zadali ste rôzne veci. 205 00:08:14,480 --> 00:08:14,850 V poriadku. 206 00:08:14,850 --> 00:08:16,714 Takže potlesk, keby sme mohli, tu. 207 00:08:16,714 --> 00:08:17,214 [APPLAUSE] 208 00:08:17,214 --> 00:08:17,708 Bolo to bolestivé. 209 00:08:17,708 --> 00:08:18,208 Ja viem. 210 00:08:18,208 --> 00:08:19,684 Dobrá práca. 211 00:08:19,684 --> 00:08:24,690 Tak teraz uvidíme, či nemôžeme odhaliť, čo oprava bola. 212 00:08:24,690 --> 00:08:28,040 A samozrejme, keď sme pevne tohle-- čo budem teraz predstavujú v green-- 213 00:08:28,040 --> 00:08:29,690 sme urobili zopár vylepšení tu. 214 00:08:29,690 --> 00:08:32,409 Po prvé, rovnako ako rozumu skontrolovať, ja som prvú kontrolu 215 00:08:32,409 --> 00:08:35,110 ak je rovný null, a t je rovné null. 216 00:08:35,110 --> 00:08:39,440 A len aby bolo jasno, kedy by mohlo s alebo t mať hodnotu null v kóde, ako je toto? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Keď môže s alebo t byť null. 219 00:08:44,490 --> 00:08:44,990 Jo? 220 00:08:44,990 --> 00:08:45,990 >> Divákov: [nepočuteľné]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. Malan: Presne tak. 223 00:08:50,510 --> 00:08:52,840 V prípade, že reťazec, ktorý užívateľ zadali, je príliš dlhý 224 00:08:52,840 --> 00:08:56,140 , Aby sa zmestili do pamäte, alebo nejaký divný roh prípad ako to, 225 00:08:56,140 --> 00:08:59,010 getString, ako uvidíme, doslova dnes, v jeho dokumentácii, 226 00:08:59,010 --> 00:09:02,330 hovorí, že sa vráti null as špeciálny sentinel hodnota, 227 00:09:02,330 --> 00:09:05,417 alebo tak nejako zvláštne symbol to znamená, že sa niečo pokazilo. 228 00:09:05,417 --> 00:09:07,500 Takže chceme skontrolovať , Pretože to dopadá 229 00:09:07,500 --> 00:09:09,720 že null je veľmi nebezpečné hodnoty. 230 00:09:09,720 --> 00:09:14,250 >> Často, keď sa pokúsite urobiť niečo s null zahŕňajúce function-- odovzdaním 231 00:09:14,250 --> 00:09:17,470 ako vstup pre instance-- túto funkciu môže sa veľmi zrúti a s ním 232 00:09:17,470 --> 00:09:19,090 zložiť celý program. 233 00:09:19,090 --> 00:09:22,570 Takže to tretí riadok je teraz len zdravý rozum kontrola, kontrola chýb, ak chcete. 234 00:09:22,570 --> 00:09:25,450 To je dobrý zvyk teraz aby sme sa do akejkoľvek dobe, kedy sme 235 00:09:25,450 --> 00:09:28,050 skúste použiť hodnotu, ktorá mohol potenciálne byť null. 236 00:09:28,050 --> 00:09:32,000 >> Teraz, vo štvrtom riadku tu, "Ak strcmp (s, t)," dobre, 237 00:09:32,000 --> 00:09:33,180 čo je to s odkazom na? 238 00:09:33,180 --> 00:09:36,750 Tak sme si povedali, je to veľmi stručne pomenovaný funkcie na porovnávanie reťazcov. 239 00:09:36,750 --> 00:09:40,370 A jeho cieľom v živote je porovnať jeho prvý argument proti druhej, 240 00:09:40,370 --> 00:09:44,640 ale nie, ak ide o ich adresy, ako sme to urobili neúmyselne moment 241 00:09:44,640 --> 00:09:48,270 pred s červeným kódom, ale skôr porovnávať tie dva 242 00:09:48,270 --> 00:09:53,210 reťazca v ľudsky intuitívne spôsob porovnaním tohto, proti tomu, 243 00:09:53,210 --> 00:09:56,690 proti tomu, proti tomu, a potom sa zastaví, ak a keď 244 00:09:56,690 --> 00:09:59,590 alebo oba prsty narazí na spätné lomítko 0. 245 00:09:59,590 --> 00:10:04,530 Takže niekto pred rokmi zavedený strcmp realizovať pre nás funkčnosť 246 00:10:04,530 --> 00:10:08,890 že sme dúfali, by sme sa dostali len o porovnanie dvoch jednoduchých hodnôt. 247 00:10:08,890 --> 00:10:14,929 >> Teraz úprimne povedané, stále výkres všetkých týchto rôznych čísel. 248 00:10:14,929 --> 00:10:17,470 Ale realita je, že som bol takže tie sa po celú dobu. 249 00:10:17,470 --> 00:10:19,580 A tak mi dovoľte pokračovať a čmárať na toto 250 00:10:19,580 --> 00:10:23,100 aby bod, ktorý na konci dňa a v pohybe vpred, 251 00:10:23,100 --> 00:10:30,160 nie sme naozaj bude starať o čo sa týka veci sú v skutočnosti 252 00:10:30,160 --> 00:10:30,790 v pamäti. 253 00:10:30,790 --> 00:10:34,320 Takže nebudem kresliť týchto druh čísel tak už, 254 00:10:34,320 --> 00:10:38,970 Som len Abstrakt preč trochu viac priateľský len s šípkami. 255 00:10:38,970 --> 00:10:42,060 >> Inými slovami, ak je to je ukazovateľ, No, povedzme, nakresliť, a to doslova, 256 00:10:42,060 --> 00:10:45,430 ako ukazovateľ, šípka smerujúca sám od seba k niečomu inému, 257 00:10:45,430 --> 00:10:48,280 a nestarať sa príliš o viac markant z týchto adries 258 00:10:48,280 --> 00:10:49,910 ktorý opäť urobil som si tak ako tak. 259 00:10:49,910 --> 00:10:52,680 Ale uvidíme tieto adresy, Niekedy, pri ladení kódu. 260 00:10:52,680 --> 00:10:56,450 >> Teraz medzitým, tento program tu rieši, samozrejme, 261 00:10:56,450 --> 00:10:58,720 tento problém tým, že porovná tieto dva reťazce. 262 00:10:58,720 --> 00:11:00,260 Ale my sme sa dostali do ďalšieho problému. 263 00:11:00,260 --> 00:11:03,180 To bolo z kópie naprogramovať minule, 264 00:11:03,180 --> 00:11:06,880 pričom som sa snažil zarobiť len prvý znak v reťazci. 265 00:11:06,880 --> 00:11:09,620 Ale čo bolo symptóm sme videli poslednej dobe, kedy sa 266 00:11:09,620 --> 00:11:14,150 používateľ zadal hodnotu, ako Gabe malými písmenami, pre s, 267 00:11:14,150 --> 00:11:19,310 potom sme priradili s do t ako v treťom riadku tam, 268 00:11:19,310 --> 00:11:22,900 a potom som sa snažil zarábať t držiak 0? 269 00:11:22,900 --> 00:11:25,950 Aký bol vplyv meniace sa t držiak 0 tu? 270 00:11:25,950 --> 00:11:27,150 >> Divákov: Zmenila ov. 271 00:11:27,150 --> 00:11:29,360 >> David J. Malan: Áno, Zmenil som s, rovnako. 272 00:11:29,360 --> 00:11:31,050 Vzhľadom k tomu, čo sa naozaj deje? 273 00:11:31,050 --> 00:11:34,130 No, dovoľte mi, aby som zistil, či môžem vyčistiť do obrázka, a to takto. 274 00:11:34,130 --> 00:11:41,390 >> Ak je to je, opäť, slovo g, a, b, e, spätné lomítko, 0 a S 275 00:11:41,390 --> 00:11:44,084 budeme pokračovať v kreslení ako krabica tu, ale žiadne ďalšie adresy. 276 00:11:44,084 --> 00:11:45,250 Poďme prestať robiť veci. 277 00:11:45,250 --> 00:11:47,510 Povedzme, nakresliť obrázok zjednodušiť svet. 278 00:11:47,510 --> 00:11:52,640 >> Keď Prehlasujem t s reťazcom t, , Ktorý vytvára ten kus pamäti. 279 00:11:52,640 --> 00:11:55,850 Námestie sa stane, že 32 bitov vo väčšine počítačov. 280 00:11:55,850 --> 00:11:59,530 V skutočnosti, ak ste niekedy počuli o počítač s 32-bitovou architektúru, 281 00:11:59,530 --> 00:12:03,000 naozaj si predstaviť, hovoriť, že práve znamená, že používa 32-bitové adresy. 282 00:12:03,000 --> 00:12:05,370 A ako technický stranou, ak ste niekedy nad tým, 283 00:12:05,370 --> 00:12:09,630 prečo staršie počítače, ak ste skutočne snažil polievka je s množstvom pamäte RAM, 284 00:12:09,630 --> 00:12:12,360 môže mať len maximálne štyri gigabajty pamäte RAM, 285 00:12:12,360 --> 00:12:14,860 dobre, že je to preto, že doslova, váš starý počítač mohol len 286 00:12:14,860 --> 00:12:17,250 sa počítajú ako vysoké ako 4 miliardy, 4 miliardy bajtov, 287 00:12:17,250 --> 00:12:20,590 Pretože to bolo za použitia 32-bit čísla adresy. 288 00:12:20,590 --> 00:12:23,260 >> Ale v každom prípade, v tomto príklad, príbeh je oveľa jednoduchšie. 289 00:12:23,260 --> 00:12:27,250 t je len ďalší ukazovateľ, alebo Naozaj char hviezda, aka reťazec. 290 00:12:27,250 --> 00:12:30,860 A ako to chcem aktualizovať tento obrázok Teraz sa, že druhý riadok kódu, 291 00:12:30,860 --> 00:12:31,950 po bodka, bodka, bodka? 292 00:12:31,950 --> 00:12:35,845 Keď som si string t sa rovná y bodkočiarka, Ako sa zmení tento obrázok? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Jo? 295 00:12:38,000 --> 00:12:38,916 >> Divákov: [nepočuteľné]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> David J. Malan: Jo. 298 00:12:42,020 --> 00:12:42,600 Presne tak. 299 00:12:42,600 --> 00:12:45,620 Len som dal šípku od t box na rovnakú adresu, 300 00:12:45,620 --> 00:12:47,570 rovnaké prvé písmeno dal. 301 00:12:47,570 --> 00:12:50,850 Alebo technicky, ak toto chlap bol ešte na 0x1, 302 00:12:50,850 --> 00:12:53,052 je to, ako by som mal 0x1 tu a 0x1 tu. 303 00:12:53,052 --> 00:12:54,760 Ale opäť, koho to zaujíma o adresách? 304 00:12:54,760 --> 00:12:56,345 Je to len myšlienka, že teraz nie je podstatné. 305 00:12:56,345 --> 00:12:57,720 Tak toto je to, čo sa tu deje. 306 00:12:57,720 --> 00:13:02,690 Tak samozrejme, ak nechcete t konzoly 0, čo je pole notácie, 307 00:13:02,690 --> 00:13:05,650 z course-- a úprimne povedané, vyzerá to ako by pole tu, 308 00:13:05,650 --> 00:13:07,340 ale teraz je to divná vec. 309 00:13:07,340 --> 00:13:11,160 Vedzte, že programovací jazyk, C, ponúka túto funkciu, 310 00:13:11,160 --> 00:13:14,650 pričom, aj keď t je ukazovateľ, alebo s je ukazovateľ, 311 00:13:14,650 --> 00:13:18,050 môžete aj naďalej používať, že pozná, komfortné hranatá zátvorka 312 00:13:18,050 --> 00:13:22,520 notácie ísť na prvý prvok, alebo druhý prvok, alebo akýkoľvek prvok 313 00:13:22,520 --> 00:13:26,130 že ukazovateľ ukazuje na, pretože podľa všetkého to 314 00:13:26,130 --> 00:13:29,410 je, ako v tomto prípade, ukázal na nejaké pole. 315 00:13:29,410 --> 00:13:30,340 >> Tak ako tento problém vyriešiť? 316 00:13:30,340 --> 00:13:33,660 Úprimne povedané, to je miesto, kde sa dostal na prvý pohľad trochu ohromujúci. 317 00:13:33,660 --> 00:13:35,340 Ale tu je nová a vylepšená verzia. 318 00:13:35,340 --> 00:13:37,460 >> Takže najprv, ja idem zbaviť knižnici CS50, 319 00:13:37,460 --> 00:13:41,170 len odhaliť, že to je naozaj char hviezda, len synonymom. 320 00:13:41,170 --> 00:13:43,540 A T je tiež znak hviezda. 321 00:13:43,540 --> 00:13:48,290 Ale to, čo sa deje na pravá strana od tejto línie 322 00:13:48,290 --> 00:13:49,970 kde t je priradená hodnota? 323 00:13:49,970 --> 00:13:50,790 >> Čo je malloc? 324 00:13:50,790 --> 00:13:51,630 Čo je to strlen? 325 00:13:51,630 --> 00:13:52,547 Čo je sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Prečo to sakra robí toto linka vyzerať tak zložité? 327 00:13:54,380 --> 00:13:55,713 Čo to robí na vysokej úrovni? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Čo je to ukladanie do t? 330 00:13:57,440 --> 00:13:58,646 Jo? 331 00:13:58,646 --> 00:14:01,104 Divákov: Je to rozdelenie určité množstvo pamäte. 332 00:14:01,104 --> 00:14:03,032 Je to uložiť, myslím, Písmená [nepočuteľné]. 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 Je to rozdelenie určitej Množstvo pamäte 336 00:14:06,650 --> 00:14:08,940 ukladať, pravdepodobne, budúce listy. 337 00:14:08,940 --> 00:14:11,310 A najmä, malloc Preto sa vracia to, čo? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Divákov: Vrátenie [nepočuteľné]? 340 00:14:14,851 --> 00:14:15,850 David J. Malan: Presne tak. 341 00:14:15,850 --> 00:14:18,850 Vraciate adresu tejto pamäti, čo je ozdobný spôsob, ako hovoriť, 342 00:14:18,850 --> 00:14:21,640 vráti adresu Prvý byte tejto pamäte. 343 00:14:21,640 --> 00:14:25,460 Je povinnosťou si budem pamätať, koľko pamäte som vlastne 344 00:14:25,460 --> 00:14:27,140 pridelené, alebo požiadal o malloc. 345 00:14:27,140 --> 00:14:28,384 >> Teraz, ako moc je to? 346 00:14:28,384 --> 00:14:30,550 No, aj keď tam je veľa zátvoriek tu, 347 00:14:30,550 --> 00:14:32,970 malloc trvá len jeden argument. 348 00:14:32,970 --> 00:14:37,250 A ja s uvedením strlen S, tak aby ma toľko bytov, koľko je v s, 349 00:14:37,250 --> 00:14:37,800 ale pridať. 350 00:14:37,800 --> 00:14:38,300 Prečo? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Jo? 353 00:14:39,530 --> 00:14:40,840 >> Divákov: spätné lomítko 0. 354 00:14:40,840 --> 00:14:41,840 David J. Malan: Presne tak. 355 00:14:41,840 --> 00:14:43,423 Musíme urobiť malý upratovanie. 356 00:14:43,423 --> 00:14:45,970 Tak preto, že tam je spätné lomítko 0, mali by sme si uvedomiť, že. 357 00:14:45,970 --> 00:14:47,310 V opačnom prípade budeme vytvoriť reťazec, ktorý 358 00:14:47,310 --> 00:14:49,170 nemá zvláštne, že terminátor. 359 00:14:49,170 --> 00:14:52,640 >> Medzitým, len byť super anál, mám sizeof (char), 360 00:14:52,640 --> 00:14:55,730 len v prípade, že niekto beží My kód nie je na CS50 spotrebiče 361 00:14:55,730 --> 00:14:58,220 ale možno iný počítač celkom, kde znakov 362 00:14:58,220 --> 00:15:01,470 je jeden bajt, konvencií, ale dva bajtov, alebo niečo väčšieho, než je. 363 00:15:01,470 --> 00:15:04,490 Je to jednoducho byť super, Super averziu k chybám. 364 00:15:04,490 --> 00:15:06,940 Aj keď v skutočnosti je to s najväčšou pravdepodobnosťou bude 1. 365 00:15:06,940 --> 00:15:11,490 >> Teraz, medzitým som sa do toho pustite a kopírovanie string, t držiak i sa rovná t držiak s. 366 00:15:11,490 --> 00:15:14,962 A ja sa odloží na minulý týždeň zdrojový kód, aby videli, čo sa deje. 367 00:15:14,962 --> 00:15:17,670 Ale kľúč stánok s jedlom, a Dôvod, prečo som dal kód teraz v zelenej, 368 00:15:17,670 --> 00:15:22,520 Je tomu tak preto, že posledný riadok, t držiak 0 rovná toupper, 369 00:15:22,520 --> 00:15:25,230 má za následok Zarábať ktorý reťazec? 370 00:15:25,230 --> 00:15:26,960 T a / alebo S? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Ten posledný riadok kódu. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Len t, pretože to, čo je sa stalo tentoraz, 375 00:15:35,560 --> 00:15:41,500 keď som trochu späť, že posledný krok, čo sa stalo, je, keď som volať malloc, 376 00:15:41,500 --> 00:15:45,380 Ja v podstate sa kus pamäti ktorý má rovnakú veľkosť ako originál, 377 00:15:45,380 --> 00:15:47,020 pretože to je aritmetický som urobil. 378 00:15:47,020 --> 00:15:50,920 Som ukladanie do t na adresu z tohto bloku pamäte. 379 00:15:50,920 --> 00:15:53,370 Aj keď to vyzerá pekne a pekný, pekný a čistý, 380 00:15:53,370 --> 00:15:56,882 Realita je, že je to, čo budeme udržať volá, hodnoty odpadky tu. 381 00:15:56,882 --> 00:15:59,340 To je kus pamäte by mohol veľmi a boli použité skôr, 382 00:15:59,340 --> 00:16:00,940 niekoľko sekúnd, pred pár minútami. 383 00:16:00,940 --> 00:16:04,410 Takže by mohlo byť úplne čísla alebo písmená, jednoducho náhodou. 384 00:16:04,410 --> 00:16:08,580 Ale to nie je platný, kým som sám naplniť tento kus pamäte 385 00:16:08,580 --> 00:16:12,510 sa skutočnými znakmi, ako ja to, že pre sláčiky. 386 00:16:12,510 --> 00:16:13,180 V poriadku? 387 00:16:13,180 --> 00:16:16,180 >> Takže teraz, vyvrcholenie Tieto tri príklady 388 00:16:16,180 --> 00:16:20,730 , Ktoré boli zdanlivo rozdelené minule, tento Swap príklad, táto funkcia 389 00:16:20,730 --> 00:16:23,670 pracoval v tom zmysle, že vymenil a a b. 390 00:16:23,670 --> 00:16:25,620 Ale nefungovalo to, v akom inom zmysle? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Jo? 393 00:16:28,614 --> 00:16:29,612 >> Divákov: [nepočuteľné]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. Malan: Presne tak. 396 00:16:36,700 --> 00:16:39,530 Ak by som mal túto funkciu volať z another-- napríklad, 397 00:16:39,530 --> 00:16:42,870 z funkcie, ako je hlavné, kde Mám premenné, X a Y, ako som 398 00:16:42,870 --> 00:16:46,160 urobil minulý týždeň, rovnaký kód, a prejdem X a Y 399 00:16:46,160 --> 00:16:49,860 Presunúť, a potom volať Swap-- to, Samozrejme, je správna verzia 400 00:16:49,860 --> 00:16:52,220 je to, čo sa chystáme see-- to nefungovalo. 401 00:16:52,220 --> 00:16:53,770 Takže to, čo je oprava? 402 00:16:53,770 --> 00:16:56,850 >> No, tak len preto, aby sa jasné, nechaj ma ísť napred 403 00:16:56,850 --> 00:17:05,450 a-- daj mi jedna sekunda sem, a pozri či môžem vám ukázať ten posledný, ktorý 404 00:17:05,450 --> 00:17:12,464 bude v-- uvidíme, či sa mi podarí nájsť to skutočné fast-- OK [nepočuteľné]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, tu to je. 407 00:17:19,240 --> 00:17:21,000 Takže ignorovať príkazy som len písať. 408 00:17:21,000 --> 00:17:23,780 Chcem, aby to získať na last minute príklad 409 00:17:23,780 --> 00:17:27,960 z minulého obdobia, ktoré je teraz nazývaný žiadny Swap. 410 00:17:27,960 --> 00:17:30,200 >> Takže žiadne Swap je miesto, kde sme skončili minule, 411 00:17:30,200 --> 00:17:32,930 kedy som inicializovaný x a y na 1 až 2. 412 00:17:32,930 --> 00:17:35,840 Potom hovorím Swap, prechádzajúcej v bodoch 1 a 2. 413 00:17:35,840 --> 00:17:37,930 A potom sa táto funkcia pracoval v nejakom zmysle, 414 00:17:37,930 --> 00:17:40,750 ale nemal trvalé vplyv na x a y. 415 00:17:40,750 --> 00:17:45,430 Takže otázka po ruke je, ako teraz sa vlastne tento problém vyriešiť? 416 00:17:45,430 --> 00:17:47,820 Aké je riešenie na dosah ruky? 417 00:17:47,820 --> 00:17:53,150 >> No, v swap.c, ktorý je nový dnes, Všimnite si, pár rozdielov. 418 00:17:53,150 --> 00:17:54,700 X a Y sú rovnaké. 419 00:17:54,700 --> 00:17:57,250 Ale to, čo je jasne inak o linke 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Čo je nové tam, ak si spomeniete, ako to vyzeralo pred druhým? 422 00:18:01,715 --> 00:18:02,565 >> Divákov: [nepočuteľné]. 423 00:18:02,565 --> 00:18:03,440 >> David J. Malan: Jo. 424 00:18:03,440 --> 00:18:06,680 Takže ampersand sú nový kus syntaxe a to nielen v tomto programe, 425 00:18:06,680 --> 00:18:08,560 ale aj všeobecnejšie v CS50. 426 00:18:08,560 --> 00:18:10,680 K dnešnému dňu, nemyslím si, že Videli sme nejaké príklady 427 00:18:10,680 --> 00:18:14,070 alebo naozaj hovoril o nich v každom detail, iné ako, možno, preventívne 428 00:18:14,070 --> 00:18:16,467 v časti, ampersand takhle. 429 00:18:16,467 --> 00:18:19,300 No, to dopadá ampersand je jedným z posledných kusov novú syntaxou 430 00:18:19,300 --> 00:18:20,174 budeme sa učiť. 431 00:18:20,174 --> 00:18:23,500 Všetko, čo to znamená, že je Adresa nejaké premenné. 432 00:18:23,500 --> 00:18:25,070 Na akú adresu sa x žiť? 433 00:18:25,070 --> 00:18:26,510 Ale to, čo sa adresa y žiť? 434 00:18:26,510 --> 00:18:28,700 Vzhľadom k tomu, v prípade, že Zásadným problémom, ako 435 00:18:28,700 --> 00:18:32,970 bolo to, že x a y boli odovzdané v kópii, na to, čo naozaj chcú robiť 436 00:18:32,970 --> 00:18:38,780 je poskytnúť Swap sa ako poklad mapa, ktorá vedie k kde X a Y vlastne 437 00:18:38,780 --> 00:18:41,910 sú v pamäti RAM, takže Swap môže nasledovať tú mapu 438 00:18:41,910 --> 00:18:47,760 a ísť tam, kam x alebo y označuje miesto a zmeniť skutočné hodnoty 1 a 2, 439 00:18:47,760 --> 00:18:48,270 tam. 440 00:18:48,270 --> 00:18:50,710 >> Takže Swap potrebuje tiež trochu zmeniť. 441 00:18:50,710 --> 00:18:53,760 A na prvý pohľad by to mohlo Vyzeráš trochu podobný char hviezdy. 442 00:18:53,760 --> 00:18:54,850 A naozaj je to tak. 443 00:18:54,850 --> 00:18:59,635 Takže je ukazovateľ na aký typ dát, na základe tohto zvýraznené časti? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Takže je to int. 446 00:19:01,620 --> 00:19:04,880 >> Takže už nie je int, je to adresa int. 447 00:19:04,880 --> 00:19:07,910 A podobne, b je teraz deje byť adresa int. 448 00:19:07,910 --> 00:19:12,470 Takže keď som teraz voláme Swap z hlavnej, Nebudem dávať Swap 1 a 2. 449 00:19:12,470 --> 00:19:15,540 Chystám sa dať to ako Ox-niečo a Ox-niečo, 450 00:19:15,540 --> 00:19:19,820 dve adresy, ktoré povedú Swap ich skutočné umiestnenie 451 00:19:19,820 --> 00:19:21,310 v pamäti svojho počítača. 452 00:19:21,310 --> 00:19:25,580 >> Takže teraz, môj zostávajúce realizácia musí zmeniť tad. 453 00:19:25,580 --> 00:19:28,650 Čo je to teraz samozrejme iná v týchto troch riadkov kódu? 454 00:19:28,650 --> 00:19:31,350 Je tu tie zatratenie všetky hviezdy na mieste, všetko v poriadku? 455 00:19:31,350 --> 00:19:33,014 Tak čo sa to tu deje? 456 00:19:33,014 --> 00:19:33,514 Jo? 457 00:19:33,514 --> 00:19:35,055 >> Divákov: Je to samozrejme [nepočuteľné]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. Malan: Presne tak. 460 00:19:37,990 --> 00:19:41,560 Takže v tomto context--, a to nebolo rozhodnutie o najlepší dizajn, pravda, 461 00:19:41,560 --> 00:19:42,530 pred rokmi. 462 00:19:42,530 --> 00:19:45,110 V tejto súvislosti, kedy stačí mať hviezdu, 463 00:19:45,110 --> 00:19:48,240 a nemáte dátový typ, ako int, ihneď doľava, 464 00:19:48,240 --> 00:19:53,146 namiesto toho máte znamienko rovnosti, jasne, v tejto súvislosti, keď hovoríte, hviezda, 465 00:19:53,146 --> 00:19:56,980 to znamená, že ísť do adresa, ktorá je v. 466 00:19:56,980 --> 00:19:58,870 Sledujte mapu pokladu, aby som tak povedal. 467 00:19:58,870 --> 00:20:01,720 >> A medzitým, v súlade 37, znamená to, že to isté. 468 00:20:01,720 --> 00:20:05,460 Prejdite na adresu A, a dal to, čo tam je? 469 00:20:05,460 --> 00:20:09,520 Či už je miesto, ktoré b určuje. 470 00:20:09,520 --> 00:20:10,980 Inými slovami, prejdite na B. 471 00:20:10,980 --> 00:20:12,130 Získať túto hodnotu. 472 00:20:12,130 --> 00:20:15,620 Choď na a na rovnej podpísať, operátor priradenia, 473 00:20:15,620 --> 00:20:17,010 tam dal túto hodnotu. 474 00:20:17,010 --> 00:20:19,272 >> Podobne, int temp je len int. 475 00:20:19,272 --> 00:20:20,730 Nič sa musí zmeniť na tepl. 476 00:20:20,730 --> 00:20:24,810 Je to len náhradné sklo z Annenberg pre trochu mlieka alebo pomarančového džúsu. 477 00:20:24,810 --> 00:20:27,630 Ale ja si treba hovoriť, prejdite na b. 478 00:20:27,630 --> 00:20:31,449 Prejdite do tohto miesta určenia a dal hodnotu v teplote tam. 479 00:20:31,449 --> 00:20:32,490 Takže to, čo sa deje potom? 480 00:20:32,490 --> 00:20:36,540 Keď som sa vlastne hovoriť Swap tentoraz, ak je tento prvý zásobník tu predstavuje Main, 481 00:20:36,540 --> 00:20:42,270 Tento druhý zásobník predstavuje Swap, kedy Prejdem Ampersand x a y ampersand 482 00:20:42,270 --> 00:20:47,150 od hlavného Presunúť, len aby bolo jasno, Čo je to za stack frame príjem? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Jo? 485 00:20:49,200 --> 00:20:50,180 >> Divákov: [nepočuteľné]. 486 00:20:50,180 --> 00:20:51,180 David J. Malan: Presne tak. 487 00:20:51,180 --> 00:20:53,129 Adresy x a y adresa. 488 00:20:53,129 --> 00:20:55,170 A na čo si spomeniete z nich ako poštové adresy. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street a 35 Oxford Street, a 490 00:20:58,772 --> 00:21:01,230 chcete presunúť dve budovy ktoré sú na týchto miestach. 491 00:21:01,230 --> 00:21:04,680 >> Je to trochu smiešne myšlienky, ale to je všetko, máme na mysli adresu. 492 00:21:04,680 --> 00:21:07,000 Kde na svete môže nájsť tie dva ints? 493 00:21:07,000 --> 00:21:09,470 Kde na svete môžeš nájsť tie dve budovy? 494 00:21:09,470 --> 00:21:15,170 Takže keď konečne po všetkých tých rokoch, keď som ísť do dnešnej zdrojového kódu a zostaviť 495 00:21:15,170 --> 00:21:22,110 Swap a beh ./swap konečne pre Prvýkrát môžeme skutočne vidieť, že 496 00:21:22,110 --> 00:21:25,330 moje hodnoty sú naozaj bola úspešne zamenené. 497 00:21:25,330 --> 00:21:30,860 A teraz, môžeme dokonca vziať Na toto, povedzme, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Tak nechaj ma ísť do rovnakého súboru. 499 00:21:32,740 --> 00:21:35,010 Nechaj ma ísť napred a spustiť gdb z ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 A teraz, v Swap, ja idem dopredu a nastaviť bod zlomu v Mohanom. 502 00:21:40,547 --> 00:21:42,630 A teraz idem dopredu a spustite program. 503 00:21:42,630 --> 00:21:45,810 A teraz vidíme, môj kód Zastavil sa u tejto línie. 504 00:21:45,810 --> 00:21:48,330 >> Ak by som do toho pustite a tlač x, čo by som mal vidieť tu? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 To je otázka. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Čože? 509 00:21:51,530 --> 00:21:52,295 >> Divákov: [nepočuteľné]. 510 00:21:52,295 --> 00:21:53,910 >> David J. Malan: Tak náhodné čísla, možno. 511 00:21:53,910 --> 00:21:56,010 Možno som šťastie, a to je pekný a jednoduchý, ako je 0. 512 00:21:56,010 --> 00:21:57,230 Ale možno, že je to nejaké náhodné číslo. 513 00:21:57,230 --> 00:21:58,090 V tomto prípade som mal šťastie. 514 00:21:58,090 --> 00:21:59,030 Proste sa to stane, že je 0. 515 00:21:59,030 --> 00:22:00,780 Ale je to naozaj šťastie, pretože nie, kým som 516 00:22:00,780 --> 00:22:06,280 zadajte nasledujúci a potom vytlačiť x má, že riadok kódu, linka 19, bol popravený. 517 00:22:06,280 --> 00:22:10,942 >> Medzitým, ďalší zase, keď píšete, a dnes vytlačiť y, budem vidieť 2. 518 00:22:10,942 --> 00:22:13,900 Teraz, keď píšem ďalej, bude to trochu mätúce, pretože teraz, 519 00:22:13,900 --> 00:22:17,250 printf bude zobrazovať na obrazovky, ako to dopadlo. x je 1. 520 00:22:17,250 --> 00:22:18,606 >> Poďme to urobiť znova. 521 00:22:18,606 --> 00:22:20,480 A teraz, tu je miesto, kde veci zaujímavé. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Než som sa zavolať Swap, alebo dokonca krok do toho, poďme sa trochu pozrieť. 524 00:22:26,580 --> 00:22:28,980 x je, opäť, 1. 525 00:22:28,980 --> 00:22:33,240 Y je, samozrejme, rýchle rozum skontrolujte, 2, takže nie je ťažké tam. 526 00:22:33,240 --> 00:22:35,740 Ale čo je ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Odpoveď, je to trochu funky vyzerajúci. 529 00:22:39,350 --> 00:22:43,500 Ale int hviezda v zátvorke je len GDP spôsob, ako povedať toto je adresa. 530 00:22:43,500 --> 00:22:48,290 Nie je to int, je to ukazovateľ na int, alebo inak známy ako adresu. 531 00:22:48,290 --> 00:22:49,742 >> Čo je to šialená vec? 532 00:22:49,742 --> 00:22:51,825 Nikdy sme nevideli niečo celkom rád, že pred. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Tak toto je adresa môjho počítača pamäť, kde x sa stane žiť. 535 00:22:58,120 --> 00:22:59,040 Je to Ox-niečo. 536 00:22:59,040 --> 00:23:01,290 A to je, úprimne povedané, prečo Ja som začal kresliť šípky, 537 00:23:01,290 --> 00:23:03,340 miesto čísel, pretože kto naozaj zaujíma 538 00:23:03,340 --> 00:23:06,890 že int je najmä adresa, ktorá je tak veľký. 539 00:23:06,890 --> 00:23:12,160 Ale bffff0c4, to všetko sú naozaj hexadecimálnych číslic, 540 00:23:12,160 --> 00:23:13,720 ktoré sú 0 až f. 541 00:23:13,720 --> 00:23:16,590 >> Takže my nebudeme zaoberať príliš dlho na to, čo tie veci sú. 542 00:23:16,590 --> 00:23:19,400 Ale keď som sa vytlačiť y, Samozrejme, vidím dva. 543 00:23:19,400 --> 00:23:22,440 Ale ampersand y, vidím túto adresu. 544 00:23:22,440 --> 00:23:26,527 A upozornenie pre zvedavý, ako ďaleko od seba, sú x a y? 545 00:23:26,527 --> 00:23:27,985 Môžete ignorovať väčšinu adresu. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Štyri byty. 548 00:23:29,920 --> 00:23:33,510 A to je v súlade s našimi skôr, tvrdí, že, ako veľký je int? 549 00:23:33,510 --> 00:23:34,130 Štyri byty. 550 00:23:34,130 --> 00:23:37,420 Takže to vyzerá, že všetko, čo je zoraďovať dobre, ako by sa mohlo dúfať v pamäti. 551 00:23:37,420 --> 00:23:40,010 >> Takže teraz, povedzme, rýchly posun vpred na konci tohto príbehu. 552 00:23:40,010 --> 00:23:43,290 Poďme ďalej a typ kroku, ponoriť sa do funkcie Swap. 553 00:23:43,290 --> 00:23:46,880 A teraz nevšimol, keď som typ, je to zhodná s adresou x. 554 00:23:46,880 --> 00:23:52,130 Keby som typ B, je to rovnaké na adresu y. 555 00:23:52,130 --> 00:23:57,020 Takže to, čo by som mal vidieť, keď hovoria, prejdite na adresu a? 556 00:23:57,020 --> 00:23:58,120 Takže vytlačiť hviezdy. 557 00:23:58,120 --> 00:24:00,130 Takže hviezdička znamená, tam, v tomto kontexte. 558 00:24:00,130 --> 00:24:02,730 Ampersand znamená, že to, čo je adresa. 559 00:24:02,730 --> 00:24:05,000 Takže hrať prostriedky 1. 560 00:24:05,000 --> 00:24:09,590 A tlač hviezda b mi dáva 2. 561 00:24:09,590 --> 00:24:15,750 >> A dovoľte mi, aby som prevziať, pre túto chvíľu, že aspoň kód, ktorý 562 00:24:15,750 --> 00:24:18,950 pokračuje sa teraz môže spustiť odôvodnené prostredníctvom týmto spôsobom. 563 00:24:18,950 --> 00:24:21,150 Ale budeme znovu túto myšlienku onedlho. 564 00:24:21,150 --> 00:24:23,850 Takže táto verzia Swap Teraz je správny a umožňuje 565 00:24:23,850 --> 00:24:26,650 nám vymeniť tento konkrétny typ dát. 566 00:24:26,650 --> 00:24:29,120 >> Takže nejaké otázky a potom na swap? 567 00:24:29,120 --> 00:24:29,890 Na hviezdy? 568 00:24:29,890 --> 00:24:30,690 Na adresu? 569 00:24:30,690 --> 00:24:33,270 A uvidíte, s problém nastaviť 4, tak nejako, 570 00:24:33,270 --> 00:24:37,310 ale problém nastaviť 5, určite, ako tieto veci sú užitočné a získať oveľa viac 571 00:24:37,310 --> 00:24:39,584 pohodlné s nimi, ako výsledok. 572 00:24:39,584 --> 00:24:40,430 Vôbec niečo? 573 00:24:40,430 --> 00:24:40,930 V poriadku. 574 00:24:40,930 --> 00:24:44,350 Tak malloc je, opäť, táto funkcia že práve prideľuje pamäť, pamäť 575 00:24:44,350 --> 00:24:45,330 alokácie. 576 00:24:45,330 --> 00:24:47,024 A prečo je to užitočné? 577 00:24:47,024 --> 00:24:48,940 No, tentoraz, ste používali malloc. 578 00:24:48,940 --> 00:24:52,230 Ak si myslíte, hneď ako getString práce, pravdepodobne, je to 579 00:24:52,230 --> 00:24:56,140 bolo pýtať sa niekoho na kus pamäti, kedykoľvek užívateľ zadá reťazec 580 00:24:56,140 --> 00:24:59,040 in, pretože sme rozhodne Nevedel, ako zamestnanci CS50, 581 00:24:59,040 --> 00:25:02,710 aké veľké tie reťazce, ktoré ľudia budú typu môže byť. 582 00:25:02,710 --> 00:25:07,910 >> Tak poďme, prvýkrát, začnite Zlúpnite Ako sa CS50 knižnica práce, 583 00:25:07,910 --> 00:25:10,990 prostredníctvom niekoľkých príkladov ktorá nás povedie tam. 584 00:25:10,990 --> 00:25:15,300 Takže keď som otvoriť gedit a otvoriť scanf 0, 585 00:25:15,300 --> 00:25:17,055 budeme vidieť nasledujúci kód. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, k dispozícii na internetových stránkach dnes, má pomerne málo riadkov kódu 588 00:25:23,530 --> 00:25:25,351 tú, 14 až 20. 589 00:25:25,351 --> 00:25:26,600 A pozrime sa, čo to robí. 590 00:25:26,600 --> 00:25:28,920 Prehlasuje, int, s názvom x. 591 00:25:28,920 --> 00:25:30,850 To hovorí, že niečo ako, číslo, prosím. 592 00:25:30,850 --> 00:25:33,940 A teraz hovorí, scanf% i, & x. 593 00:25:33,940 --> 00:25:35,620 Takže tam je veľa nových vecí tam. 594 00:25:35,620 --> 00:25:38,420 >> Ale scanf, môžete trochu myslieť ako opak printf. 595 00:25:38,420 --> 00:25:40,090 printf, samozrejme, vytlačí na obrazovku. 596 00:25:40,090 --> 00:25:44,410 scanf druh skenov od užívateľa klávesnice niečo, čo on alebo ona napísal. 597 00:25:44,410 --> 00:25:46,550 >> % Aj je, rovnako ako printf. 598 00:25:46,550 --> 00:25:49,410 To znamená, že očakávame, že užívateľ typu int. 599 00:25:49,410 --> 00:25:52,820 A teraz, prečo si myslíš, že som by mohlo byť okolo scanf & X? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 V prípade, že zmyslom života scanf je dostať niečo od užívateľa, 602 00:25:57,770 --> 00:26:02,480 aký je význam priechodom, a x, teraz? 603 00:26:02,480 --> 00:26:02,980 Jo? 604 00:26:02,980 --> 00:26:03,896 >> Divákov: [nepočuteľné]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. Malan: Presne tak. 607 00:26:06,540 --> 00:26:12,900 Nech som, človek, zadajte, môj vstup sa bude uložený na tomto mieste. 608 00:26:12,900 --> 00:26:17,660 Nestačí, spomínam, len odovzdať x, pretože sme videli už, 609 00:26:17,660 --> 00:26:21,630 kedykoľvek postúpiť len surové premenné, ako int, na nejakú inú funkciu, 610 00:26:21,630 --> 00:26:25,640 Iste, môže to zmeniť variabilný, ale nie natrvalo. 611 00:26:25,640 --> 00:26:27,360 To nemôže mať vplyv na hlavnej. 612 00:26:27,360 --> 00:26:29,420 Je možné zmeniť len svoju vlastnú lokálnu kópiu. 613 00:26:29,420 --> 00:26:32,560 Ale ak miesto, nemusíte daj mi aktuálne int, 614 00:26:32,560 --> 00:26:36,640 ale môžete mi ukázať cestu k že int, teraz, že scanf, 615 00:26:36,640 --> 00:26:41,050 Iste, môžem z toho, že osloviť a dať tam číslo 616 00:26:41,050 --> 00:26:43,280 takže máte prístup k nemu rovnako. 617 00:26:43,280 --> 00:26:45,120 >> Takže keď som spustiť tento program, uvidíme. 618 00:26:45,120 --> 00:26:49,660 Uistite sa scanf 0 dot slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 A keď som teraz zadajte číslo ako 50, vďaka za 50. 620 00:26:54,030 --> 00:26:58,150 Ak teraz zadajte číslo ako negatívny 1, pre záporné 1. 621 00:26:58,150 --> 00:27:04,200 Teraz zadajte číslo ako 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Prečo sa môj program ma ignorovať? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 No, pretože jednoducho, povedal som to očakávať len int. 625 00:27:09,880 --> 00:27:10,380 V poriadku. 626 00:27:10,380 --> 00:27:11,630 Takže to je jedna verzia tohto. 627 00:27:11,630 --> 00:27:16,600 Poďme zobrať veci do zárezu a navrhnúť, že to nie je dobré. 628 00:27:16,600 --> 00:27:20,530 A tu sa skrýva veľmi jednoduchý príklad o tom, ako môžeme začať písať kód 629 00:27:20,530 --> 00:27:24,450 že ostatní ľudia môžu využívať alebo ohroziť tým, že robí zlé veci. 630 00:27:24,450 --> 00:27:28,336 Tak línie 16, tak podobné v duchu, aby skôr, 631 00:27:28,336 --> 00:27:29,960 ale nie som vyhlásil, že v pravý tentoraz. 632 00:27:29,960 --> 00:27:32,970 Ja som, ktorým bolo char hviezdu, aka reťazca. 633 00:27:32,970 --> 00:27:35,190 >> Ale čo to vlastne znamená? 634 00:27:35,190 --> 00:27:38,790 Takže keď nezadáte address-- a Ja som ho volať ľubovoľne, buffer, 635 00:27:38,790 --> 00:27:43,370 ale nemohol som zavolať, že to, aby simple-- a potom som si to, vysvetlite mi, 636 00:27:43,370 --> 00:27:48,630 keby si mohol, na základe predchádzajúcej logika, čo sa scanf robí v riadku 18, 637 00:27:48,630 --> 00:27:55,000 ak priechod% s a vyrovnávacej pamäte, čo je adresa? 638 00:27:55,000 --> 00:27:58,210 Čo je scanf, ak platí presne rovnaká logika ako verzia 0, 639 00:27:58,210 --> 00:28:00,640 Pokúsim sa urobiť tu, keď používateľ zadá niečo? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Jo? 642 00:28:03,409 --> 00:28:04,407 >> Divákov: [nepočuteľné]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. Malan: Presne tak. 645 00:28:08,890 --> 00:28:11,577 Scanf, tým skôr logika, bude mať reťazec 646 00:28:11,577 --> 00:28:13,410 že ľudské písané v-- je teraz reťazec, 647 00:28:13,410 --> 00:28:15,790 že to nie je číslo, pravdepodobne, ak on alebo ona cooperates-- 648 00:28:15,790 --> 00:28:19,310 a to bude sa snažiť, aby to reťazec v pamäti na ľubovoľnú adresu 649 00:28:19,310 --> 00:28:20,340 vyrovnávacej pamäte určuje. 650 00:28:20,340 --> 00:28:23,870 A to je skvelé, pretože vyrovnávacej pamäti je skutočne má byť adresa. 651 00:28:23,870 --> 00:28:30,470 >> Ale tvrdím, že tento program je buggy v veľmi závažným spôsobom, pretože to, čo hodnota je 652 00:28:30,470 --> 00:28:31,330 vyrovnávacej pamäte v predvolenom nastavení? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Čo som inicializovaný do? 655 00:28:34,790 --> 00:28:35,770 Čo kus pamäti? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Ja nie, že jo? 658 00:28:38,620 --> 00:28:42,265 >> Takže aj keď som pridelená char hviezda, ktorá sa už nenazýva s, 659 00:28:42,265 --> 00:28:48,030 je to miesto nazýva buffer-- tak Poďme nakresliť názov premennej 660 00:28:48,030 --> 00:28:53,380 teraz ako buffer-- či nemám volal getString alebo malloc tu 661 00:28:53,380 --> 00:28:56,030 že v praxi znamená, že buffer je len niektoré odpadky hodnota. 662 00:28:56,030 --> 00:28:57,030 >> Teraz čo to znamená? 663 00:28:57,030 --> 00:29:00,220 To znamená, že som povedal, scanf očakávať reťazec od užívateľa. 664 00:29:00,220 --> 00:29:01,300 A viete čo? 665 00:29:01,300 --> 00:29:03,883 Bez ohľadu na to, čo sa ukazuje na-- a kreslím otáznik, 666 00:29:03,883 --> 00:29:07,060 ale v skutočnosti, to bude niečo ako OX1, 2, 3, nie? 667 00:29:07,060 --> 00:29:10,730 Je to nejaký falošný hodnota, ktorá práve sa stane, že tam pred rokom. 668 00:29:10,730 --> 00:29:13,440 Takže inak povedané, je to ako by pufer je len 669 00:29:13,440 --> 00:29:16,180 ukazuje na niečo, čo v pamäti. 670 00:29:16,180 --> 00:29:17,610 Nemám poňatia, čo sa deje. 671 00:29:17,610 --> 00:29:24,130 >> Takže keď som zadať Gabe teraz, bude to pokúsiť sa dať g-a-b-E / 0 tam. 672 00:29:24,130 --> 00:29:25,530 Ale kto vie, čo to je? 673 00:29:25,530 --> 00:29:27,480 A v minulosti, akákoľvek Tentoraz sme sa snažili dotknúť 674 00:29:27,480 --> 00:29:29,770 pamäť, ktorá nepatrí nám, čo sa stalo? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Alebo takmer zakaždým. 677 00:29:32,870 --> 00:29:34,310 Chyba segmentácie, nie? 678 00:29:34,310 --> 00:29:37,829 >> Táto šípka, nemám tušenie, kde to je polohovacie. je to len náhodná hodnota. 679 00:29:37,829 --> 00:29:40,370 A samozrejme, ak sa interpretovať náhodná hodnota ako adresa, 680 00:29:40,370 --> 00:29:42,610 sa chystáte ísť do nejaký náhodný cieľ. 681 00:29:42,610 --> 00:29:46,810 Takže Gabe by skutočne crash môj program v tomto prípade tu. 682 00:29:46,810 --> 00:29:50,600 >> Takže to, čo môžeme urobiť, je to skoro rovnako zlé? 683 00:29:50,600 --> 00:29:52,660 Zoberme do úvahy toto tretej a Posledným príkladom z scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Táto verzia je lepšia, v akom zmysle? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Ak ste spokojní s predchádzajúci problém, to je lepšie. 688 00:30:01,400 --> 00:30:02,250 Prečo? 689 00:30:02,250 --> 00:30:03,250 >> Divákov: [nepočuteľné]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 David J. Malan: Dobrý. 692 00:30:07,110 --> 00:30:09,970 Takže v tomto prípade linky 16 je lepšie, v tom zmysle, 693 00:30:09,970 --> 00:30:12,030 že sme explicitne vyčlenia pamäti. 694 00:30:12,030 --> 00:30:14,190 Nie sme pomocou malloc, sme použili týždeň 2 695 00:30:14,190 --> 00:30:16,060 prístup len deklarovať poľa. 696 00:30:16,060 --> 00:30:18,130 A my sme povedal, že reťazec je len pole znakov, 697 00:30:18,130 --> 00:30:19,690 tak to je úplne legitímne. 698 00:30:19,690 --> 00:30:22,910 Ale to je, samozrejme, ako zistíte, pevnú veľkosť 16. 699 00:30:22,910 --> 00:30:25,440 >> Tak tento program je úplne bezpečné, keď som typ 700 00:30:25,440 --> 00:30:29,760 v jednej znakové reťazce, dvojmiestny Reťazca, 15 znakové reťazce. 701 00:30:29,760 --> 00:30:34,970 Ale akonáhle začnem písať 16, 17, 18, 1000 znakové reťazce, 702 00:30:34,970 --> 00:30:37,390 , Kde je tento reťazec skončí? 703 00:30:37,390 --> 00:30:39,570 Bude to skončiť čiastočne tu. 704 00:30:39,570 --> 00:30:42,820 Ale kto vie, čo ešte je za hranicami 705 00:30:42,820 --> 00:30:44,270 tohto konkrétneho poľa? 706 00:30:44,270 --> 00:30:48,015 >> Je to, ako keď som vyhlásený za 16 krabíc tu. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Takže skôr než vytiahnuť všetky 16, budeme len predstierať, že som sa vyvodiť 16. 709 00:30:52,690 --> 00:30:56,540 Ale keď potom sa snažím čítať reťazec To je oveľa dlhšie, rovnako ako 50 znakov, 710 00:30:56,540 --> 00:31:01,270 Chystám sa začať dávať a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 A to je pravdepodobne inej pamäte segmente 712 00:31:04,916 --> 00:31:06,790 že, opäť, môže spôsobiť môj program k havárii, 713 00:31:06,790 --> 00:31:10,600 pretože som nežiadal niečo viac ako len 16 bajtov. 714 00:31:10,600 --> 00:31:12,260 >> Takže koho to zaujíma? 715 00:31:12,260 --> 00:31:13,880 No, tu je knižnica CS50. 716 00:31:13,880 --> 00:31:17,220 A väčšina z toho je len ako návod tak hore. 717 00:31:17,220 --> 00:31:21,670 Knižnica CS50, celú tú dobu, má tento riadok v súlade 52. 718 00:31:21,670 --> 00:31:23,680 Videli sme typedef, alebo uvidíte typedef 719 00:31:23,680 --> 00:31:27,930 v pset 4, ktorá sa práve vytvára synonymum čím char hviezda môže byť viac 720 00:31:27,930 --> 00:31:29,290 jednoducho odvolával sa na ako reťazec. 721 00:31:29,290 --> 00:31:31,540 Takže to je jeden z Niekoľko koliesok 722 00:31:31,540 --> 00:31:34,120 sme použili tajne pod kapotou. 723 00:31:34,120 --> 00:31:36,490 >> Medzitým, tu je funkcia, getchar. 724 00:31:36,490 --> 00:31:38,190 Teraz sa zdá, nie je telo na to. 725 00:31:38,190 --> 00:31:40,273 A v skutočnosti, keď som držať rolovanie, nemám vlastne 726 00:31:40,273 --> 00:31:42,080 zobraziť všetky implementácie z týchto funkcií. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Pre kontrolu sanity, prečo tomu tak je? 729 00:31:45,516 --> 00:31:46,795 >> Divákov: [nepočuteľné]. 730 00:31:46,795 --> 00:31:47,670 David J. Malan: Jo. 731 00:31:47,670 --> 00:31:48,950 Tak toto je hlavičkový súbor. 732 00:31:48,950 --> 00:31:52,520 A hlavičkové súbory obsahujú prototypy, plus nejaké ďalšie veci, zdá sa, 733 00:31:52,520 --> 00:31:53,780 ako typedefs. 734 00:31:53,780 --> 00:31:56,910 Ale v CS50.c, ktoré máme nikdy uvedený priamo, 735 00:31:56,910 --> 00:32:02,100 ale bola v CS50 spotrebiča všetkých Tentoraz, hlboko vnútri jeho zložiek, 736 00:32:02,100 --> 00:32:04,990 Všimnite si, že je celý banda funkcií tu. 737 00:32:04,990 --> 00:32:06,720 >> V skutočnosti, poďme prejdite nadol. 738 00:32:06,720 --> 00:32:08,810 Poďme ignorovať väčšinu z nich, pre túto chvíľu. 739 00:32:08,810 --> 00:32:12,670 Ale prejdite na vezmi_int a uvidíte, ako vezmi_int funguje. 740 00:32:12,670 --> 00:32:13,890 Takže tu je vezmi_int. 741 00:32:13,890 --> 00:32:17,727 A ak budete niekedy naozaj záležalo, ako dostať int funguje, tu je jeho dokumentácie. 742 00:32:17,727 --> 00:32:19,560 A medzi vecami sa hovorí, že je to vám povie, 743 00:32:19,560 --> 00:32:21,340 čo rozsahy hodnôt sa môže vrátiť. 744 00:32:21,340 --> 00:32:24,400 Je to v podstate negatívne 2000000000 k pozitívnemu 2000000000, dávať alebo brať. 745 00:32:24,400 --> 00:32:26,420 >> A ukázalo sa, to všetko čas, aj keď sme nikdy 746 00:32:26,420 --> 00:32:28,570 mal by ste skontrolovať na to, keď sa niečo pokazí, 747 00:32:28,570 --> 00:32:30,680 Ukazuje sa, že všetky Tentoraz vezmi_int má 748 00:32:30,680 --> 00:32:33,600 vracajú zvláštne konštantná, nie je null, 749 00:32:33,600 --> 00:32:36,760 ale skôr INT_MAX, ktorý je Dohovor len pár programátora. 750 00:32:36,760 --> 00:32:38,846 To znamená, že je tu špeciálna hodnota. 751 00:32:38,846 --> 00:32:41,470 Uistite sa, za to, len v prípade, že sa niečo pokazí. 752 00:32:41,470 --> 00:32:43,261 Ale my sme nikdy neobťažoval sa, že k dnešnému dňu, 753 00:32:43,261 --> 00:32:45,200 pretože znova, to je určený pre zjednodušenie. 754 00:32:45,200 --> 00:32:46,950 >> Ale ako sa dostať vezmi_int vykonávať? 755 00:32:46,950 --> 00:32:48,450 No, jeden trvá žiadne argumenty. 756 00:32:48,450 --> 00:32:49,390 Vieme, že. 757 00:32:49,390 --> 00:32:50,820 Vracia int. 758 00:32:50,820 --> 00:32:51,950 Vieme, že. 759 00:32:51,950 --> 00:32:54,460 Tak ako to funguje pod kapotou? 760 00:32:54,460 --> 00:32:58,290 >> Takže je zrejme nekonečný slučka, aspoň jedného vzhľad. 761 00:32:58,290 --> 00:33:00,290 Všimnite si, že sme pomocou getString. 762 00:33:00,290 --> 00:33:04,000 Tak to je zaujímavé. vezmi_int žiada, aby naše vlastné funkcie, getString. 763 00:33:04,000 --> 00:33:05,645 A teraz, prečo by to mohlo byť? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Prečo som defenzívne tu v rade 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Čo by sa mohlo stať v súlade 164, len aby bolo jasno? 768 00:33:15,639 --> 00:33:16,930 Je to rovnaká odpoveď ako predtým. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Môže byť len z pamäte. 771 00:33:20,089 --> 00:33:23,130 Sa niečo pokazí s getString, musíme byť schopní zvládnuť. 772 00:33:23,130 --> 00:33:27,070 A dôvod, prečo som sa nevracia null že technicky, null je ukazovateľ. 773 00:33:27,070 --> 00:33:29,120 vezmi_int má vrátiť int. 774 00:33:29,120 --> 00:33:31,060 Tak som sa svojvoľne rozhodol, v podstate, 775 00:33:31,060 --> 00:33:34,600 že 2 miliardy, dávať alebo brať, bude byť osobitnú hodnotu, ktorá som nikdy nemôže 776 00:33:34,600 --> 00:33:35,970 skutočne dostať od užívateľa. 777 00:33:35,970 --> 00:33:39,930 Je to len jedna hodnota idem strácať reprezentovať chybový kód. 778 00:33:39,930 --> 00:33:41,540 >> Takže teraz, veci sa trochu fantázie. 779 00:33:41,540 --> 00:33:44,670 A nie je to úplne rovnaké funkcie ako predtým, ale je to veľmi podobné. 780 00:33:44,670 --> 00:33:50,120 Tak zistíte, Prehlasujem tu, v súlade 172, a to ako int n a char c. 781 00:33:50,120 --> 00:33:53,600 A potom som použiť tento funky linku, sscanf, čo sa ukázalo 782 00:33:53,600 --> 00:33:55,990 nekontroluje reťazec z klávesnice. 783 00:33:55,990 --> 00:33:59,226 Stojí existujúci reťazec, ktorý užívateľ už zadali. 784 00:33:59,226 --> 00:34:02,100 Tak som už volal getString, ktorý znamená, že mám reťazec v pamäti. 785 00:34:02,100 --> 00:34:05,020 sscanf je to, čo by ste Volanie funkcie rozobrať. 786 00:34:05,020 --> 00:34:07,760 Vyzerá to na povrázku som zadali, znak po znaku, 787 00:34:07,760 --> 00:34:09,250 a robí niečo užitočného. 788 00:34:09,250 --> 00:34:10,969 , Že reťazec je uložený v súlade. 789 00:34:10,969 --> 00:34:13,560 A viem, že len tým, že ide zálohovať tu a hovoria, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Zavolal som jej to s Tentokrát, ale linka. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> A teraz je to trochu inak. 793 00:34:18,080 --> 00:34:22,480 Ale to v podstate znamená, z dôvodov budeme trochu mávať rukami na dnes, 794 00:34:22,480 --> 00:34:26,070 že sme kontrolu na zistiť, či používateľ zadal 795 00:34:26,070 --> 00:34:29,909 a int a možno iný charakter. 796 00:34:29,909 --> 00:34:33,610 V prípade, že užívateľ zadal int, je to bude uložený v n, pretože som 797 00:34:33,610 --> 00:34:36,739 Absolvovaní tohto adresou, Nový trik sme dnes videli. 798 00:34:36,739 --> 00:34:41,570 V prípade, že užívateľ tiež napísal v ako 123x, že x 799 00:34:41,570 --> 00:34:45,060 sa chystá skončiť písmeno v znaku c. 800 00:34:45,060 --> 00:34:48,739 >> Teraz sa ukazuje, že sscanf mi povedať, inteligentne, 801 00:34:48,739 --> 00:34:54,750 koľko premenných bola sscanf úspešne schopní vyplniť. 802 00:34:54,750 --> 00:34:58,770 Takže podľa tejto logiky, v prípade, že funkcia Ja vykonávanie je vezmi_int, 803 00:34:58,770 --> 00:35:00,900 ale ja som kontrolu, prípadne, pre užívateľov 804 00:35:00,900 --> 00:35:04,190 aby zadali do int nasleduje niečo iné, 805 00:35:04,190 --> 00:35:08,580 Čo chcem sscanf je Návratová hodnota skutočne byť? 806 00:35:08,580 --> 00:35:10,950 V prípade, že cieľom je získať len int od užívateľa? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Takže ak sscanf priznanie 2, čo to znamená? 809 00:35:19,300 --> 00:35:21,660 Užívateľ zadal niečo ako, a to doslova, 810 00:35:21,660 --> 00:35:24,770 123x, čo je jednoducho nezmysel. 811 00:35:24,770 --> 00:35:27,490 Je to chybový stav, a Chcem skontrolovať, že. 812 00:35:27,490 --> 00:35:32,960 >> Takže ak používateľ zadá to v tým, že táto logika, čo robí sscanf vrátiť, 813 00:35:32,960 --> 00:35:33,740 by ste povedali? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Takže to bude vracať 2, pretože 123 sa ísť sem, 816 00:35:39,130 --> 00:35:41,580 a x je skončí tu. 817 00:35:41,580 --> 00:35:43,970 Ale ja nechcem x, aby sa naplnil. 818 00:35:43,970 --> 00:35:48,580 Chcem sscanf len uspieť v plnenie prvý z jeho premenných. 819 00:35:48,580 --> 00:35:52,490 A tak to je dôvod, prečo som chcete sscanf vrátiť jeden. 820 00:35:52,490 --> 00:35:55,750 >> A ak je to niečo málo cez hlavu pre túto chvíľu, že je to úplne v pohode. 821 00:35:55,750 --> 00:36:00,030 Uvedomte si však, že jeden z Hodnoty vezmi_int a getString 822 00:36:00,030 --> 00:36:03,630 je to, že robíme sakra Veľa chýb kontroly, ako tomu tak 823 00:36:03,630 --> 00:36:07,130 že k dnešnému dňu, môžete do značnej miery napíšte čokoľvek klávesnicu 824 00:36:07,130 --> 00:36:08,490 a my sa ho chytiť. 825 00:36:08,490 --> 00:36:10,592 A určite, personál, určite nie 826 00:36:10,592 --> 00:36:13,300 byť zdrojom chyby vo vašom programu, pretože sme defenzívne 827 00:36:13,300 --> 00:36:16,270 kontrola pre všetky hlúpe veci, ktoré by užívateľ mohol robiť, 828 00:36:16,270 --> 00:36:18,900 ako je písanie reťazec, kedy ste naozaj chceli int. 829 00:36:18,900 --> 00:36:21,350 Takže teď-- prídeme späť na predtým long-- 830 00:36:21,350 --> 00:36:23,710 ale po celú tú dobu, getString a vezmi_int majú 831 00:36:23,710 --> 00:36:29,950 Bol pod kapotou pomocou tejto Základnou myšlienkou adries pamäte. 832 00:36:29,950 --> 00:36:32,580 >> Takže teraz, poďme robiť veci trochu viac užívateľsky príjemný. 833 00:36:32,580 --> 00:36:38,740 Ako si možno spomínate, od Binkym posledný time-- ak bude moja myš cooperate-- tak 834 00:36:38,740 --> 00:36:42,560 sme mali tento kód, ktorý Úprimne povedané, je celkom nezmyselné. 835 00:36:42,560 --> 00:36:45,330 Tento kód dosahuje nič užitočné, ale to bol príklad 836 00:36:45,330 --> 00:36:48,330 že profesor Parlante použiť, aby sa predstavujú 837 00:36:48,330 --> 00:36:51,840 čo sa deje v program, ktorý zahŕňa pamäť. 838 00:36:51,840 --> 00:36:54,850 >> Takže poďme sa prerozprávať to Príbeh mimoriadne stručne. 839 00:36:54,850 --> 00:36:58,720 Tieto prvé dva riadky, v Anglicky, robiť to, čo by na to? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Len rozumne človek, ale mierne technické termíny, sa bodnúť. 842 00:37:05,430 --> 00:37:06,346 Divákov: [nepočuteľné]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. Malan: OK, tie, ktorým sa stanovuje adresy pre váš X a premenné y. 845 00:37:11,080 --> 00:37:15,520 Nie úplne, pretože x a y nie sú premenné v tradičnom slova zmysle. 846 00:37:15,520 --> 00:37:18,054 x a y sú adresy alebo uloží adresu. 847 00:37:18,054 --> 00:37:19,220 Skúsme to ešte raz. 848 00:37:19,220 --> 00:37:21,010 To nie je zlý začiatok, hoci. 849 00:37:21,010 --> 00:37:21,510 Jo? 850 00:37:21,510 --> 00:37:22,426 >> Divákov: [nepočuteľné]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 David J. Malan: Dobrý. 853 00:37:24,840 --> 00:37:26,173 Myslím, že je to trochu čistejšie. 854 00:37:26,173 --> 00:37:28,630 Deklarácia dva ukazovatele, dve celé čísla. 855 00:37:28,630 --> 00:37:30,150 A my sme im volať x a y. 856 00:37:30,150 --> 00:37:32,790 Alebo keď sme k tomu to ako obrázok, opäť, 857 00:37:32,790 --> 00:37:36,410 pripomenúť, proste, že všetky robíme s tým prvom riadku 858 00:37:36,410 --> 00:37:39,690 kreslí krabici ako je tento, s nejakou hodnotou odpadky v ňom, 859 00:37:39,690 --> 00:37:41,920 a volať to x, a potom ďalšie box takto, 860 00:37:41,920 --> 00:37:43,880 s niektorými odpadky hodnoty v tom, volať to y. 861 00:37:43,880 --> 00:37:45,810 Máme vyhlásil dva ukazovatele, ktoré nakoniec 862 00:37:45,810 --> 00:37:47,860 uloží adresu int. 863 00:37:47,860 --> 00:37:49,170 Takže to je všetko. 864 00:37:49,170 --> 00:37:53,290 >> Takže keď Binky to urobil, íl rovnako vyzeral takto. 865 00:37:53,290 --> 00:37:55,350 A Nick len tak zabalili šípky, 866 00:37:55,350 --> 00:37:57,590 ako by to neukazuje nikde najmä preto, že sú to len 867 00:37:57,590 --> 00:37:58,250 hodnoty na odpadky. 868 00:37:58,250 --> 00:38:01,670 Oni nie sú explicitne inicializovať kdekoľvek najmä. 869 00:38:01,670 --> 00:38:03,980 >> Teraz ďalší rad kód, odvolanie, bola táto. 870 00:38:03,980 --> 00:38:07,510 Takže rozumne užívateľsky príjemný, ale trochu technickú angličtinu, 871 00:38:07,510 --> 00:38:09,790 čo je to riadok kódu robíš? 872 00:38:09,790 --> 00:38:10,391 Jo? 873 00:38:10,391 --> 00:38:11,333 >> Divákov: [nepočuteľné]. 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 Je to prideľovanie kus pamäti, že je to veľkosť int. 877 00:38:17,016 --> 00:38:18,140 A to je polovica odpovedí. 878 00:38:18,140 --> 00:38:20,056 Odpovedali ste právo polovica výrazu. 879 00:38:20,056 --> 00:38:22,473 To, čo sa deje na ľavá strana znamienko rovnosti? 880 00:38:22,473 --> 00:38:22,972 Jo? 881 00:38:22,972 --> 00:38:24,814 Divákov: a priradí že k premennej x? 882 00:38:24,814 --> 00:38:27,690 >> David J. Malan: a priradí že k premennej x. 883 00:38:27,690 --> 00:38:31,650 Takže rekapitulácia, pravá strana prideľuje dostatok pamäte pre uloženie int. 884 00:38:31,650 --> 00:38:34,150 Ale malloc špecificky vráti adresu 885 00:38:34,150 --> 00:38:37,270 tohto kusu pamäti, ktorú ste práve navrhla je uložená v x. 886 00:38:37,270 --> 00:38:42,560 >> Takže to, čo Nick minule Binkym je ťahal, že ukazovateľ sa, hlina, 887 00:38:42,560 --> 00:38:46,820 ukázať sa na bielu kus pamäti ktorá je rovná veľkosti int. 888 00:38:46,820 --> 00:38:49,360 A skutočne, to znamená, predstavujú štyri bajty. 889 00:38:49,360 --> 00:38:55,310 >> Teraz, ďalší riadok kódu to urobil, hviezda x dostane 42. 890 00:38:55,310 --> 00:38:58,530 Takže 42 je jednoduché na pravá strana, zmysel života. 891 00:38:58,530 --> 00:39:00,500 Ľavá strana, hviezda x znamená čo? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 To tiež môže mať gone-- to je v poriadku. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> DIVÁKOV: V podstate, ísť na [nepočuteľné] 896 00:39:06,875 --> 00:39:07,750 David J. Malan: Dobrý. 897 00:39:07,750 --> 00:39:08,760 Divákov: [nepočuteľné]. 898 00:39:08,760 --> 00:39:09,760 David J. Malan: Presne tak. 899 00:39:09,760 --> 00:39:11,979 Ľavá strana znamená ísť do x. 900 00:39:11,979 --> 00:39:12,520 x je adresa. 901 00:39:12,520 --> 00:39:15,520 Je to ako 33 Oxford Street alebo OX1. 902 00:39:15,520 --> 00:39:18,690 A hviezda x znamená ísť na to osloviť a dať to, čo tam je? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Takže naozaj, to je presne to, čo Nick urobil. 905 00:39:21,290 --> 00:39:23,740 Začal s vedľajšou, v podstate, mentálne 906 00:39:23,740 --> 00:39:26,270 ukázal prstom na x, v smere šípky 907 00:39:26,270 --> 00:39:30,670 na bielom poli na pravej strane bočné, a uvedenie čísla 42 tam. 908 00:39:30,670 --> 00:39:34,120 Ale potom sa to začalo trochu nebezpečné, nie? 909 00:39:34,120 --> 00:39:35,860 Binky je prísť o hlavu. 910 00:39:35,860 --> 00:39:39,465 >> Hviezda y sa rovná 13, smolu, znamená čo? 911 00:39:39,465 --> 00:39:43,620 Takže hviezdy Y znamená ísť na adresu v y. 912 00:39:43,620 --> 00:39:45,630 Ale čo je adresa y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Dobre, je to hodnota odpadky, nie? 915 00:39:49,440 --> 00:39:50,800 Nakreslil som to ako otáznik. 916 00:39:50,800 --> 00:39:54,850 Nick vytiahol ho ako stočený šípku nahor. 917 00:39:54,850 --> 00:39:59,600 A akonáhle sa pokúsite do hviezdy Y, hovorí sa tam, 918 00:39:59,600 --> 00:40:03,872 ale nie je legitímna adresa, je to nejaký falošný umiestnenie, 919 00:40:03,872 --> 00:40:05,080 Program sa bude pád. 920 00:40:05,080 --> 00:40:08,580 A Binky hlava sa deje odletieť tu, ako to dopadlo. 921 00:40:08,580 --> 00:40:12,130 >> Takže nakoniec, tento program bol len naplno chyba. 922 00:40:12,130 --> 00:40:13,540 Bolo buggy programu. 923 00:40:13,540 --> 00:40:14,760 A je potrebné opraviť. 924 00:40:14,760 --> 00:40:18,260 A jediný spôsob, naozaj, to opraviť by, napríklad, tento riadok, 925 00:40:18,260 --> 00:40:21,010 ktoré sme nemali ani dostať, pretože program spadol príliš skoro. 926 00:40:21,010 --> 00:40:26,170 Ale ak by sme mali napraviť, čo vplyv má robiť y rovné x má? 927 00:40:26,170 --> 00:40:30,010 No, je to v podstate poukazuje na y bez ohľadu na hodnotu x ukazuje na. 928 00:40:30,010 --> 00:40:32,430 >> Takže Nick príbehu, alebo Binky príbeh, a to ako 929 00:40:32,430 --> 00:40:34,640 x a y sa ukázal na biely kus pamäti, 930 00:40:34,640 --> 00:40:38,300 tak, že nakoniec, keď ti sa hviezda y znovu sa rovná 13, 931 00:40:38,300 --> 00:40:43,080 môžete skončiť uvedenie 13 v vhodné umiestnenie. 932 00:40:43,080 --> 00:40:47,640 Takže všetky tieto linky sú dokonale legitímne, s výnimkou pre tento jeden, 933 00:40:47,640 --> 00:40:51,730 keď sa to stalo pred vami vlastne pridelený ý nejakú hodnotu. 934 00:40:51,730 --> 00:40:54,290 >> Teraz našťastie nemusíte musia zdôvodniť cez všetky 935 00:40:54,290 --> 00:40:56,560 z týchto druhov otázok, na vlastnú päsť. 936 00:40:56,560 --> 00:40:59,310 Nechaj ma ísť napred a otvoriť up okne terminálu tu 937 00:40:59,310 --> 00:41:03,050 a otvoriť, len na okamih, super krátky program, ktorý 938 00:41:03,050 --> 00:41:04,360 Tiež je trochu zbytočné. 939 00:41:04,360 --> 00:41:05,152 Je to škaredé. 940 00:41:05,152 --> 00:41:06,610 To nie je dosiahnuť niečo užitočného. 941 00:41:06,610 --> 00:41:10,180 Ale to ukazujú problémy pamäti, takže sa poďme pozrieť. 942 00:41:10,180 --> 00:41:11,830 >> Hlavné, super jednoduché. 943 00:41:11,830 --> 00:41:14,830 Je to zrejme volá funkciu, f, a potom sa vráti 0. 944 00:41:14,830 --> 00:41:16,310 Je to docela ťažké, aby neporiadok to. 945 00:41:16,310 --> 00:41:18,540 Takže hlavné je celkom dobrý, tak ďaleko. 946 00:41:18,540 --> 00:41:20,100 >> Takže f je problematické. 947 00:41:20,100 --> 00:41:22,120 A práve nedal moc úsilie na to pomenovanie 948 00:41:22,120 --> 00:41:23,990 tu, aby zameranie na kód. 949 00:41:23,990 --> 00:41:25,740 f má dva riadky. 950 00:41:25,740 --> 00:41:27,610 A poďme sa pozrieť, čo sa teraz deje. 951 00:41:27,610 --> 00:41:29,840 Tak na jednej strane tady-- a dovoľte mi, aby som 952 00:41:29,840 --> 00:41:32,680 to v súlade s predchádzajúcou example-- na jednej strane, 953 00:41:32,680 --> 00:41:35,830 ľavá strana je to, čo v angličtine? 954 00:41:35,830 --> 00:41:36,493 To je-- 955 00:41:36,493 --> 00:41:37,701 Divákov: Vytvorenie ukazovatele. 956 00:41:37,701 --> 00:41:40,830 David J. Malan: Vytvorenie ukazovatele int a volať to x. 957 00:41:40,830 --> 00:41:43,789 Takže to vytvára jednu z tých krabíc Stále kreslenie na dotykovej obrazovke. 958 00:41:43,789 --> 00:41:45,913 A teraz, na pravej strane bočné, malloc, samozrejme, 959 00:41:45,913 --> 00:41:47,420 prideľuje kus pamäti. 960 00:41:47,420 --> 00:41:49,989 A len aby bolo jasno, ako koľko pamäte je to zrejme 961 00:41:49,989 --> 00:41:52,030 prideľovanie, ak ste práve druh si to spočítajte tu? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Tak to je 40 bajtov. 964 00:41:54,040 --> 00:41:57,400 A viem, že len preto, že viem, int, na CS50 spotrebiče, aspoň 965 00:41:57,400 --> 00:41:58,060 je štyri bajty. 966 00:41:58,060 --> 00:41:59,610 SO 10 krát 4 je 40. 967 00:41:59,610 --> 00:42:04,924 Takže to je ukladanie je x, adresa prvý z 40 ints že 968 00:42:04,924 --> 00:42:07,340 boli pridelené miesto späť, k sebe, k sebe, k sebe. 969 00:42:07,340 --> 00:42:08,470 >> A to je to, čo je kľúčom k malloc. 970 00:42:08,470 --> 00:42:11,261 Neznamená to však trvať trochu pamäti tu, trochu tu, trochu tu. 971 00:42:11,261 --> 00:42:14,220 To vám dáva jeden blok pamäte, súvisle, od operačného 972 00:42:14,220 --> 00:42:15,240 systém. 973 00:42:15,240 --> 00:42:18,500 >> A čo teraz, x držiak 10 = 0? 974 00:42:18,500 --> 00:42:19,470 Ľubovoľný riadok kódu. 975 00:42:19,470 --> 00:42:21,100 To nie je dosiahnuť niečo užitočného. 976 00:42:21,100 --> 00:42:26,128 Ale je zaujímavé, pretože x držiak 10--? 977 00:42:26,128 --> 00:42:26,628 Jo? 978 00:42:26,628 --> 00:42:27,912 >> Divákov: [nepočuteľné]? 979 00:42:27,912 --> 00:42:30,500 >> David J. Malan: x držiak 10 nemusí byť null. 980 00:42:30,500 --> 00:42:35,070 Detail null prichádza iba do hry s reťazcami, na konci reťazca. 981 00:42:35,070 --> 00:42:36,700 Ale dobrá myšlienka. 982 00:42:36,700 --> 00:42:39,615 >> Aká veľká je to pole, a to aj keď som pridelilo 40 bytov? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Je to 0 až deväť, jo? 985 00:42:43,690 --> 00:42:45,120 Je to 10 ints celkom. 986 00:42:45,120 --> 00:42:48,790 40 bajtov, ale 10 ints, indexované 0 až 0. 987 00:42:48,790 --> 00:42:50,930 >> Takže to, čo je to, že x držiak 10? 988 00:42:50,930 --> 00:42:53,090 Je to vlastne časť neznámy odpadky hodnota. 989 00:42:53,090 --> 00:42:54,780 Je to pamäť, ktorá nepatrí ku mne. 990 00:42:54,780 --> 00:42:59,650 Nemal by som byť dotýkať, že byte číslo 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Idem trochu príliš ďaleko. 992 00:43:01,420 --> 00:43:04,490 >> A skutočne, keď som spustiť tento programu, môže veľmi dobre dôjsť k chybe. 993 00:43:04,490 --> 00:43:05,790 Ale niekedy, budeme mať šťastie. 994 00:43:05,790 --> 00:43:07,706 A tak len preukázať tohle-- a úprimne povedané, 995 00:43:07,706 --> 00:43:11,000 nikdy neviete, pred vami sa to-- poďme bežať to. 996 00:43:11,000 --> 00:43:12,480 Nebolo vlastne havárii. 997 00:43:12,480 --> 00:43:15,032 >> Ale keď som sa to zmeniť, pre inštancie, byť ako 1000, 998 00:43:15,032 --> 00:43:16,740 aby sa to naozaj úmyselné, pozrime sa 999 00:43:16,740 --> 00:43:18,710 ak sa nám podarí to, aby pád tentoraz. 1000 00:43:18,710 --> 00:43:20,070 OK, to sa nespadne. 1001 00:43:20,070 --> 00:43:22,600 Ako sa o 100.000? 1002 00:43:22,600 --> 00:43:25,000 Poďme prerobiť a teraz spustite ho. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Uf. 1005 00:43:25,960 --> 00:43:26,460 V poriadku. 1006 00:43:26,460 --> 00:43:29,090 Takže sa zdá, opäť sa jedná segmenty pamäti, aby som tak povedal, 1007 00:43:29,090 --> 00:43:32,660 sú pomerne veľké, takže môžeme sa znovu a znovu šťastie. 1008 00:43:32,660 --> 00:43:36,510 Ale nakoniec, akonáhle sa dostanete na smiech a naozaj ísť ďaleko na obrazovke, 1009 00:43:36,510 --> 00:43:39,120 sa dotknete pamäti, že v skutočnosti, naozaj nepatrí k vám. 1010 00:43:39,120 --> 00:43:40,870 >> Ale úprimne povedané, títo druhy chýb sa deje 1011 00:43:40,870 --> 00:43:43,020 bude ťažšie a ťažšie zistiť, na vlastnú päsť. 1012 00:43:43,020 --> 00:43:47,880 Ale našťastie, ako programátori, máme nástroje, ktoré nám umožňujú robiť to pre nás. 1013 00:43:47,880 --> 00:43:50,140 Tak toto je snáď jedna z najškaredších programov, 1014 00:43:50,140 --> 00:43:52,060 dokonca škaredšie, ako výstup gdb je. 1015 00:43:52,060 --> 00:43:55,670 Ale vždy má linku alebo dva, ktoré sú super užitočné. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind je program, ktorý pomáha nebude ladiť program, sám o sebe, 1017 00:44:00,310 --> 00:44:03,500 ale nájsť pamäte súvisiace problémy, konkrétne. 1018 00:44:03,500 --> 00:44:07,590 To bude automaticky spustiť kód si a pozrite sa aspoň na dve veci. 1019 00:44:07,590 --> 00:44:10,680 Po prvé, si niečo náhodné, ako dotykové pamäte 1020 00:44:10,680 --> 00:44:11,980 že nepatril k vám? 1021 00:44:11,980 --> 00:44:13,590 To vám pomôže nájsť tie prípady. 1022 00:44:13,590 --> 00:44:15,710 >> A za druhé, bude to pomôže nájdete niečo, čo nazýva 1023 00:44:15,710 --> 00:44:19,270 úniky pamäte, ktoré máme úplne ignoroval, naivne, 1024 00:44:19,270 --> 00:44:21,380 po určitú dobu a blažene. 1025 00:44:21,380 --> 00:44:23,140 Ale ukazuje sa, všetko Tentoraz, kedykoľvek 1026 00:44:23,140 --> 00:44:26,620 ste volali getString v tak veľa z našich programov, 1027 00:44:26,620 --> 00:44:28,930 Pýtaš sa prevádzkové systém pre pamäť, 1028 00:44:28,930 --> 00:44:32,070 ale máte nejakú spomienku sa niekedy, že mu 1029 00:44:32,070 --> 00:44:36,169 späť, robí UNALLOC, alebo zadarmo, rovnako ako sa tomu hovorí. 1030 00:44:36,169 --> 00:44:37,960 Nie, pretože sme nikdy spýtal sa vás k tomu. 1031 00:44:37,960 --> 00:44:41,250 >> Ale to všetko čas, programy si písal v C 1032 00:44:41,250 --> 00:44:43,800 boli unikajúci pamäti, žiada prevádzkové 1033 00:44:43,800 --> 00:44:46,190 systém pre viac a viac pamäť pre sláčiky a ktovie čo ešte, 1034 00:44:46,190 --> 00:44:47,870 ale nikdy podal ju späť. 1035 00:44:47,870 --> 00:44:50,080 A teraz je to trochu o zjednodušujúce, 1036 00:44:50,080 --> 00:44:53,550 ale ak ste niekedy spustiť váš Mac alebo váš počítač dlhšiu dobu, otvorenie 1037 00:44:53,550 --> 00:44:55,790 veľa programov, Možno zatváranie programov, 1038 00:44:55,790 --> 00:44:57,795 a hoci vaše počítač Nehavarované, 1039 00:44:57,795 --> 00:45:01,690 je to stále tak oveľa pomalší, ako by ich to naozaj 1040 00:45:01,690 --> 00:45:04,290 používať veľké množstvo pamäte alebo prostriedky, aj keď, 1041 00:45:04,290 --> 00:45:06,070 ak nie ste ešte nedotýkajte klávesnice, 1042 00:45:06,070 --> 00:45:10,430 , Ktoré by mohli bylo-- ale nie always-- mohol byť to, že programy, ktoré používate 1043 00:45:10,430 --> 00:45:11,920 majú sami pretekanie pamäte. 1044 00:45:11,920 --> 00:45:15,645 A udržať žiada OS viac a viac pamäte, ale zabúdajú na to, 1045 00:45:15,645 --> 00:45:18,470 nie je v skutočnosti ju používať, ale teda s pamäťou preč 1046 00:45:18,470 --> 00:45:20,500 z iných programov, ktoré by mohli chcieť. 1047 00:45:20,500 --> 00:45:23,940 Tak to je obyčajné vysvetlenie. 1048 00:45:23,940 --> 00:45:25,940 Tu je miesto, kde je Valgrind Výstup je úplne 1049 00:45:25,940 --> 00:45:29,290 ukrutný k tým menej a pohodlnejšie podobne. 1050 00:45:29,290 --> 00:45:32,690 Ale zaujímavé veci je práve tu. 1051 00:45:32,690 --> 00:45:37,060 To mi hovorí, neplatný zápis o veľkosť štyri sa deje v tomto programe, 1052 00:45:37,060 --> 00:45:40,640 najmä, na riadku 21 memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Keď pôjdem na linku 21, hm, tam naozaj je neplatný zápis o veľkosti štyri. 1054 00:45:45,450 --> 00:45:46,250 Prečo veľkosť štyri? 1055 00:45:46,250 --> 00:45:49,500 No, to number-- a by mohlo byť anything-- je int. 1056 00:45:49,500 --> 00:45:50,450 Takže je to štyri bajty. 1057 00:45:50,450 --> 00:45:52,550 Takže dávam štyri bajty kde nepatrí. 1058 00:45:52,550 --> 00:45:55,080 To je to, čo Valgrind Je mi vlastne hovorí. 1059 00:45:55,080 --> 00:45:57,600 Okrem toho bude tiež povedz mi, ako uvidíme, 1060 00:45:57,600 --> 00:46:01,490 ako spustiť to v budúcnosti pset, či a keď ste unikli pamäť, čo napokon 1061 00:46:01,490 --> 00:46:05,300 Mám, pretože som volal malloc, ale ja som v skutočnosti 1062 00:46:05,300 --> 00:46:08,010 volal, v tomto prípade zdarma, ktoré budeme nakoniec vidieť 1063 00:46:08,010 --> 00:46:09,830 je opakom malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Takže teraz, myslím, že konečný príklad. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Tak toto je trochu viac tajomný, ale je to snáď 1068 00:46:16,690 --> 00:46:19,180 Najväčší dôvod byť opatrný s pamäťou, 1069 00:46:19,180 --> 00:46:24,490 a dôvod, prečo sa mnoho programov a / alebo na webové servery, dokonca k tomuto dňu, 1070 00:46:24,490 --> 00:46:28,200 sú prevzaté od zlých niekde na internete, ktorí sú nejakým spôsobom 1071 00:46:28,200 --> 00:46:33,390 odosielanie falošné pakety na server sa snaží ohroziť svoje účty, 1072 00:46:33,390 --> 00:46:36,420 alebo sa vaše dáta, alebo len všeobecne sa cez stroj. 1073 00:46:36,420 --> 00:46:38,910 Pretečeniu vyrovnávacej pamäti, ako je názov napovedá, prostriedok 1074 00:46:38,910 --> 00:46:40,740 pretekania nie int, ale vyrovnávacej pamäti. 1075 00:46:40,740 --> 00:46:43,490 A vyrovnávacia pamäť je len ozdobný spôsob, ako hovoriť, že je to banda pamäti. 1076 00:46:43,490 --> 00:46:46,710 >> A skutočne, som zavolal reťazec pred vyrovnávacej pamäte, namiesto s. 1077 00:46:46,710 --> 00:46:49,234 Vzhľadom k tomu, či je to buffer, ako v tom zmysle, YouTube, 1078 00:46:49,234 --> 00:46:52,400 alebo kedykoľvek sa pozeráte videá, ste mohli vidieť slovo vyrovnávacej pamäte, 1079 00:46:52,400 --> 00:46:53,040 bodka, bodka, bodka. 1080 00:46:53,040 --> 00:46:54,240 Je to neuveriteľne otravné. 1081 00:46:54,240 --> 00:46:55,990 A to práve znamená, že že vaše video prehrávač 1082 00:46:55,990 --> 00:46:58,710 sa snaží stiahnuť veľa bajtov, veľa bytov 1083 00:46:58,710 --> 00:47:00,170 z videa z internetu. 1084 00:47:00,170 --> 00:47:02,920 Ale je to pomalé, takže sa snažia k stiahnutiu veľa z nich 1085 00:47:02,920 --> 00:47:06,430 vyplniť vyrovnávacej pamäti, nádobu, aby sa máte dostatok bytov, aby sa po 1086 00:47:06,430 --> 00:47:09,174 ukázať video, bez pauzy neustále. 1087 00:47:09,174 --> 00:47:11,340 Ale ako sa ukázalo, je to možné majú vyrovnávacia pamäť k tomuto veľký. 1088 00:47:11,340 --> 00:47:15,710 Ale skúste dať toľko dát v to, a veľmi zlé veci sa môže stať. 1089 00:47:15,710 --> 00:47:22,780 Tak napríklad, poďme sa pozrieť na Táto záverečná teaser na príklad. 1090 00:47:22,780 --> 00:47:24,720 To je ďalší program to, že na prvý pohľad, 1091 00:47:24,720 --> 00:47:26,540 nerobí nič extra užitočného. 1092 00:47:26,540 --> 00:47:29,590 Je tu hlavnú funkciu ktorý volá túto funkciu, f. 1093 00:47:29,590 --> 00:47:36,640 A že funkcia f, tu má char pole, s názvom C, veľkosť 12. 1094 00:47:36,640 --> 00:47:39,340 A potom je pomocou tohto nová funkcia s názvom strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Ukazuje sa, že sa tento jednoduchý, jednoduchý riadok kódu, len dva riadky, 1097 00:47:45,190 --> 00:47:49,130 sme sa celý svoj program, , A preto sa celý môj počítač, 1098 00:47:49,130 --> 00:47:54,000 a môj užívateľský účet, a môj pevný pohon potenciálne zraniteľný voči každému 1099 00:47:54,000 --> 00:47:58,170 kto vie, a je dosť dobré pre spustenie Tento program s určitou príkazového riadka 1100 00:47:58,170 --> 00:47:58,900 argumentom. 1101 00:47:58,900 --> 00:48:03,400 Inými slovami, ak je to zlý človek kladie vnútri argvargv [1] zadaním 1102 00:48:03,400 --> 00:48:08,750 na klávesnici veľmi špeciálne vytvorenom reťazec, nie je abc, 123, ale v podstate, 1103 00:48:08,750 --> 00:48:15,180 binárne symboly, ktoré predstavujú spustiteľný kód, program, ktorý on alebo ona napísal, 1104 00:48:15,180 --> 00:48:19,190 s týmto jednoduchým programom, ktorý je zástupca z tisícov programov 1105 00:48:19,190 --> 00:48:23,610 ktoré sú rovnako zraniteľné, Trúfam si tvrdiť, on alebo ona môže nakoniec odstrániť všetky 1106 00:48:23,610 --> 00:48:26,680 súbory na mojom pevnom disku, sa bliká výzvu, aby on alebo ona môže 1107 00:48:26,680 --> 00:48:30,170 typ príkazov na vlastnú päsť, e-mailom všetky súbory pre seba. 1108 00:48:30,170 --> 00:48:34,660 Čokoľvek, čo sa dá robiť, keď alebo si môže robiť s týmto kódom. 1109 00:48:34,660 --> 00:48:36,575 >> Nebudeme úplne vyriešiť ešte. 1110 00:48:36,575 --> 00:48:38,700 A v skutočnosti, že to bude zahŕňajú malý obrázok 1111 00:48:38,700 --> 00:48:41,470 ako je toto, ktoré budeme čoskoro pochopiť, tým lepšie. 1112 00:48:41,470 --> 00:48:44,480 Ale pre dnešok, poďme končí čo je, dúfajme, že o niečo viac 1113 00:48:44,480 --> 00:48:48,360 pochopiteľné XKCD vtip, kým sme pokračovať nabudúce. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 V poriadku. 1116 00:48:51,600 --> 00:48:53,446 Uvidíme sa v stredu. 1117 00:48:53,446 --> 00:48:54,754 >> [Prehrávanie hudby] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: A teraz, hlboko myšlienky, podľa Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Pamäť je ako skákanie do hromady zlaté listy na nedeľné popoludnie. 1121 00:49:04,770 --> 00:49:09,000 Fúkania vetra, hodil svoj hair-- oh, Cnie sa mi dni when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [SMIECH] 1124 00:49:12,650 --> 00:49:13,750