1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Přehrávání hudby] 3 00:00:11,261 --> 00:00:12,640 >> David J. Malan: Dobře. 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čátek týdne 5. 6 00:00:16,009 --> 00:00:18,050 A jak jste si možná všimli, některé z materiálu 7 00:00:18,050 --> 00:00:21,050 je stále o něco více komplexní, trochu hustší. 8 00:00:21,050 --> 00:00:24,560 >> A je to velmi snadné, a to zejména v případě, jste byli ve zvyku na nějakou dobu, 9 00:00:24,560 --> 00:00:28,600 že se snaží čmárat po většinu něco, co děláme, říkáme ve třídě. 10 00:00:28,600 --> 00:00:31,626 Ale uvědomit si, že není třeba Ideální pedagogický přístup 11 00:00:31,626 --> 00:00:34,250 k učení, tento druh materiálu, a materiály obecně. 12 00:00:34,250 --> 00:00:37,250 A tak jsme rádi, že oznamuje, že CS50 vlastní Gheng 13 00:00:37,250 --> 00:00:39,780 Gong začala připravovat kanonický soubor poznámek 14 00:00:39,780 --> 00:00:42,100 do kurzu, naděje , který je, že, jedna, tato 15 00:00:42,100 --> 00:00:44,030 slouží nejen jako reference a zdroje 16 00:00:44,030 --> 00:00:47,410 pro přezkoumání materiálu a bude zpět prostřednictvím materiálu, který může mít 17 00:00:47,410 --> 00:00:51,230 Utekl jste napoprvé, ale také proto, že vaše hlavy může být více 18 00:00:51,230 --> 00:00:53,740 nahoru než dolů, když jej přijde čas na přednášku, 19 00:00:53,740 --> 00:00:56,960 tak, že byste mohli zapojit více zamyšleně, jako 20 00:00:56,960 --> 00:00:59,170 na rozdíl od více scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Díky, že řekl, co najdete na Webové stránky jsou tyto dokumenty jako tento. 22 00:01:02,510 --> 00:01:04,660 A oznámení, v levém horním rohu, tam je nejen obsah, 23 00:01:04,660 --> 00:01:06,920 ale také časové kódy, které okamžitě skočíte 24 00:01:06,920 --> 00:01:09,077 na příslušnou část ve video on-line. 25 00:01:09,077 --> 00:01:11,410 A co Chang tady udělal je, v podstatě, dokumentace 26 00:01:11,410 --> 00:01:13,340 co se stalo v tomto Zejména přednáška. 27 00:01:13,340 --> 00:01:16,370 A mnoho z přednášek Již nyní online s tímto URL. 28 00:01:16,370 --> 00:01:20,110 A budeme pokračovat, abyste mohl psát zbytek z těch, do konce tohoto týdne, 29 00:01:20,110 --> 00:01:22,380 takže se využít tohoto zdroje. 30 00:01:22,380 --> 00:01:25,740 >> Takže bez dalších okolků, jsme začali loupat zpět 31 00:01:25,740 --> 00:01:28,180 vrstva, která je string na nějakou dobu. 32 00:01:28,180 --> 00:01:30,670 A to, co jsme si řekli řetězec je vlastně minulý týden? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Takže char hvězda. 35 00:01:32,900 --> 00:01:34,900 A char hvězda, no, co se to vlastně znamená? 36 00:01:34,900 --> 00:01:37,150 No, tentokrát, pokud máme bylo volání funkce, 37 00:01:37,150 --> 00:01:40,450 jako getString a skladování tak zvané vratné 38 00:01:40,450 --> 00:01:42,910 Hodnota getString v proměnná-- se to jmenuje 39 00:01:42,910 --> 00:01:47,721 s Typ string-- jsme psali řádek kódu tam nahoře. 40 00:01:47,721 --> 00:01:49,970 A to je jen, když vidím, můj rukopis zde zvětšený 41 00:01:49,970 --> 00:01:51,930 to jsem si uvědomil, jak je to otřesné. 42 00:01:51,930 --> 00:01:54,180 >> Nicméně předpokládejme, že, na pravé straně 43 00:01:54,180 --> 00:01:57,070 je, nicméně, přiměřené zobrazení toho, co je 44 00:01:57,070 --> 00:01:58,880 se děje tohle všechno tentokrát s getString. 45 00:01:58,880 --> 00:02:00,380 getString, samozřejmě, dostane řetězec. 46 00:02:00,380 --> 00:02:01,691 Ale co to vlastně 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 voláním funkce s názvem malloc. 49 00:02:06,040 --> 00:02:07,390 Ale o tom více později. 50 00:02:07,390 --> 00:02:09,139 A pak se to vyplní že kus paměti 51 00:02:09,139 --> 00:02:11,764 s písmeny uživatel zadali, následuje, samozřejmě, 52 00:02:11,764 --> 00:02:14,800 znak null, nebo zpětné lomítko nula až na samém konci. 53 00:02:14,800 --> 00:02:18,280 >> Mezitím, na levé straně tohoto příběhu, celou tu dobu, 54 00:02:18,280 --> 00:02:20,850 jsme byli deklarování proměnné, jako s. 55 00:02:20,850 --> 00:02:24,770 A že proměnná je to, co nyní začne volat ukazatel. 56 00:02:24,770 --> 00:02:29,190 Není to krabice uvnitř, které dáme řetězec, Daven, samo o sobě, 57 00:02:29,190 --> 00:02:32,550 ale dáme v tomto náměstí pole na levé straně, co přesně? 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áků: Adresa kde je umístěn v paměti. 61 00:02:37,118 --> 00:02:38,118 >> David J. Malan: Přesně tak. 62 00:02:38,118 --> 00:02:40,690 Adresa, kde Daven se nachází v paměti. 63 00:02:40,690 --> 00:02:44,650 A není tam, kde se nachází všechny Daven samy o sobě, ale konkrétně adresa 64 00:02:44,650 --> 00:02:45,150 z čeho? 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áků: První znak. 68 00:02:47,460 --> 00:02:50,209 >> David J. Malan: První znak v Daven, která v tomto případě, 69 00:02:50,209 --> 00:02:53,820 Navrhl jsem byl svévolně a nerealisticky 1 OX1, 70 00:02:53,820 --> 00:02:55,910 což právě znamená, že hexadecimální číslo jedna. 71 00:02:55,910 --> 00:02:57,993 Ale to asi bude být mnohem větší počet 72 00:02:57,993 --> 00:03:01,260 že bychom mohli čerpat s 0x jako předpona, 73 00:03:01,260 --> 00:03:02,806 představuje hexadecimální znak. 74 00:03:02,806 --> 00:03:05,930 A protože nepotřebujeme vědět, kde Zbytek postav Daven 75 00:03:05,930 --> 00:03:09,860 jsou, protože to, co jednoduchý design rozhodnutí, která byla vyrobena před mnoha lety? 76 00:03:09,860 --> 00:03:10,548 Jo? 77 00:03:10,548 --> 00:03:11,651 >> Diváků: Zpětné lomítko 0. 78 00:03:11,651 --> 00:03:12,900 David J. Malan: Jo, přesně tak. 79 00:03:12,900 --> 00:03:18,100 Zpětné lomítko 0 umožňuje, i když v lineární čas, procházet řetězec, 80 00:03:18,100 --> 00:03:20,400 chůze od leva do prava, se pro smyčky, nebo na chvíli 81 00:03:20,400 --> 00:03:22,608 smyčky, nebo něco takového že, a určit, oh, tady 82 00:03:22,608 --> 00:03:24,751 je konec tohoto konkrétního řetězce. 83 00:03:24,751 --> 00:03:27,000 A tak se jen adresu, na začátek řetězce, 84 00:03:27,000 --> 00:03:30,290 můžeme přistupovat celistvost za to, protože celou tu dobu, 85 00:03:30,290 --> 00:03:32,030 řetězec byl jen znak hvězda. 86 00:03:32,030 --> 00:03:36,370 >> Takže je to určitě v pořádku i nadále používat CS50 knihovny, a to abstrakce, 87 00:03:36,370 --> 00:03:38,440 abych tak řekl, ale budeme začíná přesně vidět, 88 00:03:38,440 --> 00:03:41,230 co se děje pod celou tuto dobu. 89 00:03:41,230 --> 00:03:45,260 Takže si možná vzpomenou tento příklad, Také od minule, porovnat 0, 90 00:03:45,260 --> 00:03:47,300 která ani vlastně není porovnání. 91 00:03:47,300 --> 00:03:49,070 Ale začali jsme to vyřešit. 92 00:03:49,070 --> 00:03:52,020 >> Ale jak asi opakovací, Mohl bych zajímat někoho 93 00:03:52,020 --> 00:03:54,261 v růžové slon dnes, také by Chang? 94 00:03:54,261 --> 00:03:55,760 Jak se o vás ve frontě? [Neslyšitelné]. 95 00:03:55,760 --> 00:03:56,660 Pojď nahoru. 96 00:03:56,660 --> 00:03:58,740 >> A do té doby, jak jste přišli, pojďme 97 00:03:58,740 --> 00:04:01,670 v úvahu jen na okamžik, co Tento kód byl vlastně dělá. 98 00:04:01,670 --> 00:04:04,917 Je to deklarovat dvě proměnné se top, s a t, a volání getString. 99 00:04:04,917 --> 00:04:08,250 To není velmi uživatelsky příjemný program, protože neříká, co mám dělat. 100 00:04:08,250 --> 00:04:10,541 Ale pojďme jen předpokládat, že jsme se zaměřením na šťavnaté části. 101 00:04:10,541 --> 00:04:14,470 A pak budeme dělat, je-li s rovná rovná t, měl by říci printf, 102 00:04:14,470 --> 00:04:16,170 jste zadali totéž. 103 00:04:16,170 --> 00:04:16,670 Dobrý den. 104 00:04:16,670 --> 00:04:17,050 Jak se jmenujete? 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 poznávám. 107 00:04:19,529 --> 00:04:21,800 Takže vaši výzvu na ruku pro slona 108 00:04:21,800 --> 00:04:25,230 je nejprve nakreslit nám obraz toho, co je zastoupen v těch prvních dvou 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 být zastoupeny jak na obrazovce? 111 00:04:28,139 --> 00:04:30,680 A můžete jen kreslit s prst na této velké obrazovce. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Takže tam jsou dvě poloviny na každá strana této rovnice. 114 00:04:34,510 --> 00:04:37,760 Takže tam je to s na levé straně, a pak getString na pravé straně. 115 00:04:37,760 --> 00:04:40,540 A pak je tu t na levé straně, a pak getString na pravé straně. 116 00:04:40,540 --> 00:04:42,630 Tak jak můžeme začít kreslení obrázek, který 117 00:04:42,630 --> 00:04:46,340 představuje to, co se děje tady v paměti, řekli byste? 118 00:04:46,340 --> 00:04:49,150 A dovolte mi, abych vám vysvětlil to, co děláte, jak to je. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 No, v první, to by se ptát, můžete získat vstupní řetězec. 121 00:04:58,890 --> 00:05:00,439 A to by store-- oh, promiňte. 122 00:05:00,439 --> 00:05:01,230 David J. Malan: OK. 123 00:05:01,230 --> 00:05:01,730 Dobře. 124 00:05:01,730 --> 00:05:03,330 A to se říká, co? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Jen tak dál. 127 00:05:04,450 --> 00:05:05,575 Nechtěla jsem rušit. 128 00:05:05,575 --> 00:05:07,060 Janelle: Omlouvám se. 129 00:05:07,060 --> 00:05:14,237 Tak to by vstup do adresa of-- není jistý. 130 00:05:14,237 --> 00:05:17,320 Nemohu přesně vzpomenout na číslo, ale věřím, že se začíná s 0. 131 00:05:17,320 --> 00:05:18,420 >> David J. Malan: To je v pořádku, protože jsem čísla nahoru, 132 00:05:18,420 --> 00:05:19,650 takže není správná odpověď. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Počínaje 0 oblouku. 134 00:05:22,105 --> 00:05:24,000 >> David J. Malan: OK, tak prvek 0. 135 00:05:24,000 --> 00:05:24,765 Jistě. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: A pak, pokud byl jako jen dva-letter-- 137 00:05:28,295 --> 00:05:30,496 >> David J. Malan: OK, zpět k vám. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Takže prvek 0, a pak prvek 1 nebo 2 prvkem. 139 00:05:33,629 --> 00:05:36,670 David J. Malan: A který kus obrázek se vám právě teď kreslení? 140 00:05:36,670 --> 00:05:37,690 Výzva k getString? 141 00:05:37,690 --> 00:05:38,830 Nebo prohlášení s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Prohlášení o shodě S, věřím. 143 00:05:42,890 --> 00:05:45,980 Oh, getString, protože by to být vloženy do každého [? oblast. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. Malan: Dobrý. 145 00:05:46,510 --> 00:05:47,051 Přesně tak. 146 00:05:47,051 --> 00:05:49,300 I když se toto účinně vrací pole, odvolání, 147 00:05:49,300 --> 00:05:53,300 Až se vrátíme řetězec, můžeme index do tohoto řetězce s použitím 01 a 2. 148 00:05:53,300 --> 00:05:56,180 Technicky se jedná o pravděpodobně zastoupené jednotlivé adresy, 149 00:05:56,180 --> 00:05:57,100 ale to je v pořádku. 150 00:05:57,100 --> 00:06:00,170 >> Takže předpokládám, jestli můžu jen rychle předat tam, kde jsme skončili 151 00:06:00,170 --> 00:06:04,320 Naposledy, pokud jeden z řetězce byla g b e, 152 00:06:04,320 --> 00:06:10,337 zpětné lomítko 0, což představuje Gabe je vstup, jak můžeme představovat to teď? 153 00:06:10,337 --> 00:06:12,670 Pokud je to paměť, která je byla vrácena getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Bylo by to zastoupená obloukem? 156 00:06:17,610 --> 00:06:18,750 >> David J. Malan: obloukem? 157 00:06:18,750 --> 00:06:19,130 No, no. 158 00:06:19,130 --> 00:06:21,171 Řekněme, obrazově, dovolte mi, abych prostě jít dopředu 159 00:06:21,171 --> 00:06:25,710 a navrhují, že, pokud je to s, toto je vrácená hodnota getString. 160 00:06:25,710 --> 00:06:29,482 A vy jste vyvodit to jako 0, 1, 2, což je naprosto rozumné, protože jsme 161 00:06:29,482 --> 00:06:30,940 může index do řetězce, jako takové. 162 00:06:30,940 --> 00:06:33,340 Ale jen proto, aby byl v souladu s naposled, nech mě jít napřed 163 00:06:33,340 --> 00:06:37,310 a libovolně navrhnout, aby tento je adresa 1, je to adresa 2, 164 00:06:37,310 --> 00:06:39,597 Tato adresa je 3, a tak dále. 165 00:06:39,597 --> 00:06:41,430 A tak prostě být super jasné, co se děje 166 00:06:41,430 --> 00:06:44,580 jít s následkem, že První řádek kódu, by to řekl? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Adresa 1? 168 00:06:45,420 --> 00:06:46,420 >> David J. Malan: Přesně tak. 169 00:06:46,420 --> 00:06:47,190 Takže řešení 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 A mezitím, nechte mě jít napřed a duplikovat hodně z toho, co jste udělali 172 00:06:51,230 --> 00:06:52,740 a přidejte sem svůj vlastní tričko. 173 00:06:52,740 --> 00:06:56,340 Pokud bych měl psát v Gabe opět, podruhé, 174 00:06:56,340 --> 00:07:01,530 Po zobrazení výzvy s getString, kde Samozřejmě, je Gabe jít? 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: Stejně jako tady? 178 00:07:05,975 --> 00:07:06,850 David J. Malan: Jo. 179 00:07:06,850 --> 00:07:08,516 Janelle: Nebo je to také ve stejných boxech? 180 00:07:08,516 --> 00:07:11,940 David J. Malan: Dovolte mi navrhnout, jo, přesně, takže v těchto dalších zařízení. 181 00:07:11,940 --> 00:07:15,230 Ale to, co je teď Klíčem k úspěchu je, že i když jsem vyvodit to hodně blízko 182 00:07:15,230 --> 00:07:18,650 dohromady-- 0x1, toto je 0x2-- ve skutečnosti, 183 00:07:18,650 --> 00:07:25,750 teď by mohla být adresa 0x10, Například, a 0x11, 0x12 a, 184 00:07:25,750 --> 00:07:26,870 a tak dále. 185 00:07:26,870 --> 00:07:29,955 A tak, pokud je to ten případ, co se děje, že skončí tady 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: Přesně tak. 188 00:07:31,830 --> 00:07:33,180 Takže 0x10. 189 00:07:33,180 --> 00:07:34,570 A tak teď, poslední otázka. 190 00:07:34,570 --> 00:07:37,510 Jste zdaleka, musel pracovat Nejtěžší pro slona tak daleko. 191 00:07:37,510 --> 00:07:42,650 Do teď, když jsem vytáhnout kód znovu, když jsem si v souladu tři, 192 00:07:42,650 --> 00:07:47,630 pokud je rovná rovná t, co jsem vlastně porovnáním, že jsme tady vyvodit? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: dvě adresy? 194 00:07:49,271 --> 00:07:50,270 David J. Malan: Přesně tak. 195 00:07:50,270 --> 00:07:53,350 Takže říkám, je S equal na t? 196 00:07:53,350 --> 00:07:56,210 Jinými slovy, je roven 1 rovná 10? 197 00:07:56,210 --> 00:07:59,710 A samozřejmě, Zřejmá odpověď je nyní ne. 198 00:07:59,710 --> 00:08:02,920 A tak tento program je v konečném důsledku do tisku co byste řekli? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Bylo by to, jste zadali stejnou věc? 201 00:08:08,405 --> 00:08:11,446 >> David J. Malan: Takže pokud s je 1 a t je 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Zadali jste různé věci. 203 00:08:13,320 --> 00:08:13,570 >> David J. Malan: Přesně tak. 204 00:08:13,570 --> 00:08:14,480 Zadali jste různé věci. 205 00:08:14,480 --> 00:08:14,850 V pořádku. 206 00:08:14,850 --> 00:08:16,714 Takže potlesk, kdybychom mohli, zde. 207 00:08:16,714 --> 00:08:17,214 [APPLAUSE] 208 00:08:17,214 --> 00:08:17,708 Bylo to bolestivé. 209 00:08:17,708 --> 00:08:18,208 Já vím. 210 00:08:18,208 --> 00:08:19,684 Dobrá práce. 211 00:08:19,684 --> 00:08:24,690 Tak teď uvidíme, jestli nemůžeme odhalit, co oprava byla. 212 00:08:24,690 --> 00:08:28,040 A samozřejmě, když jsme pevně tohle-- což budu nyní představují v green-- 213 00:08:28,040 --> 00:08:29,690 jsme udělali pár vylepšení zde. 214 00:08:29,690 --> 00:08:32,409 Za prvé, stejně jako rozumu zkontrolovat, já jsem první kontrolu 215 00:08:32,409 --> 00:08:35,110 pokud je roven null, a t je rovno null. 216 00:08:35,110 --> 00:08:39,440 A jen aby bylo jasno, kdy by mohlo s nebo t mít hodnotu null v kódu, jako je tohle? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Když může s nebo t být null. 219 00:08:44,490 --> 00:08:44,990 Jo? 220 00:08:44,990 --> 00:08:45,990 >> Diváků: [neslyšitelné]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. Malan: Přesně tak. 223 00:08:50,510 --> 00:08:52,840 V případě, že řetězec, který uživatel zadali, je příliš dlouhý 224 00:08:52,840 --> 00:08:56,140 , aby se vešly do paměti, nebo nějaký divný roh případ jako to, 225 00:08:56,140 --> 00:08:59,010 getString, jak uvidíme, doslova dnes, v jeho dokumentaci, 226 00:08:59,010 --> 00:09:02,330 říká, že se vrátí null as speciální sentinel hodnota, 227 00:09:02,330 --> 00:09:05,417 nebo tak nějak zvláštní symbol to znamená, že se něco pokazilo. 228 00:09:05,417 --> 00:09:07,500 Takže chceme zkontrolovat , protože to dopadá 229 00:09:07,500 --> 00:09:09,720 že null je velmi nebezpečné hodnoty. 230 00:09:09,720 --> 00:09:14,250 >> Často, když se pokusíte udělat něco s null zahrnující function-- předáním 231 00:09:14,250 --> 00:09:17,470 jako vstup pro instance-- tuto funkci může se velmi zhroutí a s ním 232 00:09:17,470 --> 00:09:19,090 sundat celý program. 233 00:09:19,090 --> 00:09:22,570 Takže to třetí řádek je nyní jen zdravý rozum kontrola, kontrola chyb, chcete-li. 234 00:09:22,570 --> 00:09:25,450 To je dobrý zvyk teď abychom se do jakékoliv době, kdy jsme 235 00:09:25,450 --> 00:09:28,050 zkuste použít hodnotu, která mohl potenciálně být null. 236 00:09:28,050 --> 00:09:32,000 >> Nyní, ve čtvrtém řádku tady, "Pokud strcmp (s, t)," dobře, 237 00:09:32,000 --> 00:09:33,180 co je to s odkazem na? 238 00:09:33,180 --> 00:09:36,750 Tak jsme si řekli, je to velmi stručně pojmenovaný funkce pro porovnávání řetězců. 239 00:09:36,750 --> 00:09:40,370 A jeho cílem v životě je porovnat jeho první argument proti druhé, 240 00:09:40,370 --> 00:09:44,640 ale ne, pokud jde o jejich adresy, jako jsme to udělali neúmyslně moment 241 00:09:44,640 --> 00:09:48,270 před s červeným kódem, ale spíše srovnávat ty dva 242 00:09:48,270 --> 00:09:53,210 řetězce v lidsky intuitivní způsob porovnáním tohoto, proti tomu, 243 00:09:53,210 --> 00:09:56,690 proti tomu, proti tomu, a pak se zastaví, jestliže a když 244 00:09:56,690 --> 00:09:59,590 nebo oba prsty narazí na zpětné lomítko 0. 245 00:09:59,590 --> 00:10:04,530 Takže někdo před lety zaveden strcmp realizovat pro nás funkčnost 246 00:10:04,530 --> 00:10:08,890 že jsme doufali, bychom se dostali jen o porovnání dvou jednoduchých hodnot. 247 00:10:08,890 --> 00:10:14,929 >> Teď upřímně řečeno, pořád výkres všech těchto různých čísel. 248 00:10:14,929 --> 00:10:17,470 Ale realita je, že jsem byl takže ty se po celou dobu. 249 00:10:17,470 --> 00:10:19,580 A tak mi dovolte pokračovat a čmárat na tohle 250 00:10:19,580 --> 00:10:23,100 aby bod, který na konci dne a v pohybu vpřed, 251 00:10:23,100 --> 00:10:30,160 nejsme opravdu bude starat o co se týká věci jsou ve skutečnosti 252 00:10:30,160 --> 00:10:30,790 v paměti. 253 00:10:30,790 --> 00:10:34,320 Takže nebudu kreslit těchto druhy čísel tak už, 254 00:10:34,320 --> 00:10:38,970 Jsem jen Abstrakt pryč trochu víc přátelský jen s šipkami. 255 00:10:38,970 --> 00:10:42,060 >> Jinými slovy, je-li to je ukazatel, No, řekněme, nakreslit, a to doslova, 256 00:10:42,060 --> 00:10:45,430 jako ukazatel, šipka směřující sám od sebe k něčemu jinému, 257 00:10:45,430 --> 00:10:48,280 a nestarat se příliš o více markant z těchto adres 258 00:10:48,280 --> 00:10:49,910 který opět udělal jsem si tak jako tak. 259 00:10:49,910 --> 00:10:52,680 Ale uvidíme tyto adresy, Někdy, při ladění kódu. 260 00:10:52,680 --> 00:10:56,450 >> Nyní mezitím, tento program tady řeší, samozřejmě, 261 00:10:56,450 --> 00:10:58,720 tento problém tím, že porovná tyto dva řetězce. 262 00:10:58,720 --> 00:11:00,260 Ale my jsme se dostali do dalšího problému. 263 00:11:00,260 --> 00:11:03,180 To bylo z kopie naprogramovat minule, 264 00:11:03,180 --> 00:11:06,880 přičemž jsem se snažil vydělat jen první znak v řetězci. 265 00:11:06,880 --> 00:11:09,620 Ale co bylo symptom jsme viděli poslední době, kdy se 266 00:11:09,620 --> 00:11:14,150 uživatel zadal hodnotu, jako Gabe malými písmeny, pro s, 267 00:11:14,150 --> 00:11:19,310 pak jsme přiřadili s do t jako ve třetím řádku tam, 268 00:11:19,310 --> 00:11:22,900 a pak jsem se snažil vydělávat t držák 0? 269 00:11:22,900 --> 00:11:25,950 Jaký byl vliv měnící se t držák 0 zde? 270 00:11:25,950 --> 00:11:27,150 >> Diváků: Změnila ů. 271 00:11:27,150 --> 00:11:29,360 >> David J. Malan: Ano, Změnil jsem s, stejně. 272 00:11:29,360 --> 00:11:31,050 Vzhledem k tomu, co se opravdu děje? 273 00:11:31,050 --> 00:11:34,130 No, dovolte mi, abych zjistil, jestli můžu vyčistit do obrázku, a to takto. 274 00:11:34,130 --> 00:11:41,390 >> Je-li to je, opět, slovo g, a, b, e, zpětné lomítko, 0 a S 275 00:11:41,390 --> 00:11:44,084 budeme pokračovat v kreslení jako krabice tady, ale žádné další adresy. 276 00:11:44,084 --> 00:11:45,250 Pojďme přestat dělat věci. 277 00:11:45,250 --> 00:11:47,510 Řekněme, nakreslit obrázek zjednodušit svět. 278 00:11:47,510 --> 00:11:52,640 >> Když Prohlašuji t s řetězcem t, , který vytváří ten kus paměti. 279 00:11:52,640 --> 00:11:55,850 Náměstí se stane, že 32 bitů ve většině počítačů. 280 00:11:55,850 --> 00:11:59,530 Ve skutečnosti, pokud jste někdy slyšeli o počítač s 32-bitovou architekturu, 281 00:11:59,530 --> 00:12:03,000 opravdu si představit, mluvit, že právě znamená, že používá 32-bitové adresy. 282 00:12:03,000 --> 00:12:05,370 A jako technický stranou, pokud jste někdy nad tím, 283 00:12:05,370 --> 00:12:09,630 proč starší počítače, pokud jste skutečně snažil polévka je s množstvím paměti RAM, 284 00:12:09,630 --> 00:12:12,360 může mít pouze maximálně čtyři gigabajty paměti RAM, 285 00:12:12,360 --> 00:12:14,860 dobře, že je to proto, že doslova, váš starý počítač mohl jen 286 00:12:14,860 --> 00:12:17,250 se počítají jako vysoké jako 4 miliardy, 4 miliardy bajtů, 287 00:12:17,250 --> 00:12:20,590 Protože to bylo za použití 32-bit čísla adresy. 288 00:12:20,590 --> 00:12:23,260 >> Ale v každém případě, v tomto příklad, příběh je mnohem jednodušší. 289 00:12:23,260 --> 00:12:27,250 t je jen další ukazatel, nebo Opravdu char hvězda, aka řetězec. 290 00:12:27,250 --> 00:12:30,860 A jak to chci aktualizovat tento obrázek Nyní se, že druhý řádek kódu, 291 00:12:30,860 --> 00:12:31,950 po tečka, tečka, tečka? 292 00:12:31,950 --> 00:12:35,845 Když jsem si string t se rovná y středník, Jak se změní tento obrázek? 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áků: [neslyšitelné]. 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 Přesně tak. 299 00:12:42,600 --> 00:12:45,620 Jen jsem dal šipku od t box na stejnou adresu, 300 00:12:45,620 --> 00:12:47,570 stejné první písmeno dal. 301 00:12:47,570 --> 00:12:50,850 Nebo technicky, pokud toto chlap byl ještě na 0x1, 302 00:12:50,850 --> 00:12:53,052 je to, jako bych měl 0x1 tady a 0x1 zde. 303 00:12:53,052 --> 00:12:54,760 Ale opět, koho to zajímá o adresách? 304 00:12:54,760 --> 00:12:56,345 Je to jen myšlenka, že teď není podstatné. 305 00:12:56,345 --> 00:12:57,720 Tak tohle je to, co se tady děje. 306 00:12:57,720 --> 00:13:02,690 Tak samozřejmě, pokud nechcete t konzole 0, což je pole notace, 307 00:13:02,690 --> 00:13:05,650 z course-- a upřímně řečeno, vypadá to jako by pole tady, 308 00:13:05,650 --> 00:13:07,340 ale teď je to divná věc. 309 00:13:07,340 --> 00:13:11,160 Vězte, že programovací jazyk, C, nabízí tuto funkci, 310 00:13:11,160 --> 00:13:14,650 přičemž, i když t je ukazatel, nebo s je ukazatel, 311 00:13:14,650 --> 00:13:18,050 můžete i nadále používat, že zná, komfortní hranatá závorka 312 00:13:18,050 --> 00:13:22,520 notace jít na první prvek, nebo druhý prvek, nebo jakýkoli prvek 313 00:13:22,520 --> 00:13:26,130 že ukazatel ukazuje na, protože podle všeho to 314 00:13:26,130 --> 00:13:29,410 je, jako v tomto případě, ukázal na nějaké pole. 315 00:13:29,410 --> 00:13:30,340 >> Tak jak tento problém vyřešit? 316 00:13:30,340 --> 00:13:33,660 Upřímně řečeno, to je místo, kde se dostal na první pohled trochu ohromující. 317 00:13:33,660 --> 00:13:35,340 Ale tady je nová a vylepšená verze. 318 00:13:35,340 --> 00:13:37,460 >> Takže nejprve, já jdu zbavit knihovně CS50, 319 00:13:37,460 --> 00:13:41,170 jen odhalit, že to je opravdu char hvězda, jen synonymem. 320 00:13:41,170 --> 00:13:43,540 A T je také znak hvězda. 321 00:13:43,540 --> 00:13:48,290 Ale to, co se děje na pravá strana od této linie 322 00:13:48,290 --> 00:13:49,970 kde t je přiřazena hodnota? 323 00:13:49,970 --> 00:13:50,790 >> Co je malloc? 324 00:13:50,790 --> 00:13:51,630 Co je to strlen? 325 00:13:51,630 --> 00:13:52,547 Co je sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Proč to sakra dělá toto linka vypadat tak složité? 327 00:13:54,380 --> 00:13:55,713 Co to dělá na vysoké úrovni? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Co je to ukládání do t? 330 00:13:57,440 --> 00:13:58,646 Jo? 331 00:13:58,646 --> 00:14:01,104 Diváků: Je to rozdělení určité množství paměti. 332 00:14:01,104 --> 00:14:03,032 Je to uložit, myslím, Písmena [neslyšitelné]. 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 rozdělení určité Množství paměti 336 00:14:06,650 --> 00:14:08,940 ukládat, pravděpodobně, budoucí dopisy. 337 00:14:08,940 --> 00:14:11,310 A zejména, malloc Proto se vrací to, co? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Diváků: Vrácení [neslyšitelné]? 340 00:14:14,851 --> 00:14:15,850 David J. Malan: Přesně tak. 341 00:14:15,850 --> 00:14:18,850 Vracíte adresu této paměti, což je ozdobný způsob, jak říkat, 342 00:14:18,850 --> 00:14:21,640 vrátí adresu První byte této paměti. 343 00:14:21,640 --> 00:14:25,460 Je povinností si budu pamatovat, kolik paměti jsem vlastně 344 00:14:25,460 --> 00:14:27,140 přiděleno, nebo požádal o malloc. 345 00:14:27,140 --> 00:14:28,384 >> Nyní, jak moc je to? 346 00:14:28,384 --> 00:14:30,550 No, i když tam je hodně závorek tady, 347 00:14:30,550 --> 00:14:32,970 malloc trvá jen jeden argument. 348 00:14:32,970 --> 00:14:37,250 A já s uvedením strlen S, tak aby mě tolik bytů, kolik je v s, 349 00:14:37,250 --> 00:14:37,800 ale přidat. 350 00:14:37,800 --> 00:14:38,300 Proč? 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áků: zpětné lomítko 0. 354 00:14:40,840 --> 00:14:41,840 David J. Malan: Přesně tak. 355 00:14:41,840 --> 00:14:43,423 Musíme udělat malý úklid. 356 00:14:43,423 --> 00:14:45,970 Tak proto, že tam je zpětné lomítko 0, měli bychom si uvědomit, že. 357 00:14:45,970 --> 00:14:47,310 V opačném případě budeme vytvořit řetězec, který 358 00:14:47,310 --> 00:14:49,170 nemá zvláštní, že terminátor. 359 00:14:49,170 --> 00:14:52,640 >> Mezitím, jen být super anál, mám sizeof (char), 360 00:14:52,640 --> 00:14:55,730 jen v případě, že někdo běží My kód není na CS50 spotřebiče 361 00:14:55,730 --> 00:14:58,220 ale možná jiný počítač celkem, kde znaků 362 00:14:58,220 --> 00:15:01,470 je jeden bajt, konvencí, ale dva bajtů, nebo něco většího, než je. 363 00:15:01,470 --> 00:15:04,490 Je to prostě být super, Super averzi k chybám. 364 00:15:04,490 --> 00:15:06,940 I když ve skutečnosti je to s největší pravděpodobností bude 1. 365 00:15:06,940 --> 00:15:11,490 >> Teď, mezitím jsem se do toho pusťte a kopírování string, t držák i se rovná t držák s. 366 00:15:11,490 --> 00:15:14,962 A já se odloží na minulý týden zdrojový kód, aby viděli, co se děje. 367 00:15:14,962 --> 00:15:17,670 Ale klíč stánek s jídlem, a Důvod, proč jsem dal kód nyní v zelené, 368 00:15:17,670 --> 00:15:22,520 Je tomu tak proto, že poslední řádek, t držák 0 rovná toupper, 369 00:15:22,520 --> 00:15:25,230 má za následek Vydělávat který řetězec? 370 00:15:25,230 --> 00:15:26,960 T a / nebo S? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Ten poslední řádek kódu. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Jen t, protože to, co je se stalo tentokrát, 375 00:15:35,560 --> 00:15:41,500 když jsem trochu zpět, že poslední krok, co se stalo, je, když jsem volat malloc, 376 00:15:41,500 --> 00:15:45,380 Já v podstatě se kus paměti který má stejnou velikost jako originál, 377 00:15:45,380 --> 00:15:47,020 protože to je aritmetický jsem udělal. 378 00:15:47,020 --> 00:15:50,920 Jsem ukládání do t na adresu z tohoto bloku paměti. 379 00:15:50,920 --> 00:15:53,370 I když to vypadá hezky a pěkný, pěkný a čistý, 380 00:15:53,370 --> 00:15:56,882 Realita je, že je to, co budeme udržet volá, hodnoty odpadky tady. 381 00:15:56,882 --> 00:15:59,340 To je kus paměti by mohl velmi a byly použity dříve, 382 00:15:59,340 --> 00:16:00,940 několik sekund, před pár minutami. 383 00:16:00,940 --> 00:16:04,410 Takže by mohlo být naprosto čísla nebo písmena, prostě náhodou. 384 00:16:04,410 --> 00:16:08,580 Ale to není platný, dokud jsem sám naplnit tento kus paměti 385 00:16:08,580 --> 00:16:12,510 se skutečnými znaky, jako já to, že pro smyčce. 386 00:16:12,510 --> 00:16:13,180 V pořádku? 387 00:16:13,180 --> 00:16:16,180 >> Takže teď, vyvrcholení Tyto tři příklady 388 00:16:16,180 --> 00:16:20,730 , které byly zdánlivě rozděleny minule, tento Swap příklad, tato funkce 389 00:16:20,730 --> 00:16:23,670 pracoval v tom smyslu, že vyměnil a a b. 390 00:16:23,670 --> 00:16:25,620 Ale nefungovalo to, v jakém jiném smyslu? 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áků: [neslyšitelné]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. Malan: Přesně tak. 396 00:16:36,700 --> 00:16:39,530 Pokud bych měl tuto funkci volat z another-- například, 397 00:16:39,530 --> 00:16:42,870 z funkce, jako je hlavní, kde Mám proměnné, X a Y, jak jsem 398 00:16:42,870 --> 00:16:46,160 udělal minulý týden, stejný kód, a projdu X a Y 399 00:16:46,160 --> 00:16:49,860 Přesunout, a pak volat Swap-- to, Samozřejmě, je správná verze 400 00:16:49,860 --> 00:16:52,220 je to, co se chystáme see-- to nefungovalo. 401 00:16:52,220 --> 00:16:53,770 Takže to, co je oprava? 402 00:16:53,770 --> 00:16:56,850 >> No, tak jen proto, aby se jasné, nech mě jít napřed 403 00:16:56,850 --> 00:17:05,450 a-- dej mi jedna sekunda sem, a viz jestli můžu vám ukázat ten poslední, který 404 00:17:05,450 --> 00:17:12,464 bude v-- uvidíme, jestli se mi podaří najít to skutečné fast-- OK [neslyšitelné]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, tady to je. 407 00:17:19,240 --> 00:17:21,000 Takže ignorovat příkazy jsem jen psát. 408 00:17:21,000 --> 00:17:23,780 Chci, aby to získat na last minute příklad 409 00:17:23,780 --> 00:17:27,960 z minulého období, které je nyní nazýván žádný Swap. 410 00:17:27,960 --> 00:17:30,200 >> Takže žádné Swap je místo, kde jsme skončili minule, 411 00:17:30,200 --> 00:17:32,930 kdy jsem inicializován x a y na 1 až 2. 412 00:17:32,930 --> 00:17:35,840 Pak říkám Swap, procházející v bodech 1 a 2. 413 00:17:35,840 --> 00:17:37,930 A pak se tato funkce pracoval v nějakém smyslu, 414 00:17:37,930 --> 00:17:40,750 ale neměl trvalé vliv na x a y. 415 00:17:40,750 --> 00:17:45,430 Takže otázka po ruce je, jak nyní se vlastně tento problém vyřešit? 416 00:17:45,430 --> 00:17:47,820 Jaké je řešení na dosah ruky? 417 00:17:47,820 --> 00:17:53,150 >> No, v swap.c, který je nový dnes, Všimněte si, pár rozdílů. 418 00:17:53,150 --> 00:17:54,700 X a Y jsou stejné. 419 00:17:54,700 --> 00:17:57,250 Ale to, co je jasně jinak o lince 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Co je nového tam, pokud si vzpomenete, jak to vypadalo před druhým? 422 00:18:01,715 --> 00:18:02,565 >> Diváků: [neslyšitelné]. 423 00:18:02,565 --> 00:18:03,440 >> David J. Malan: Jo. 424 00:18:03,440 --> 00:18:06,680 Takže ampersandy jsou nový kus syntaxe a to nejen v tomto programu, 425 00:18:06,680 --> 00:18:08,560 ale také obecněji v CS50. 426 00:18:08,560 --> 00:18:10,680 K dnešnímu dni, nemyslím si, že Viděli jsme nějaké příklady 427 00:18:10,680 --> 00:18:14,070 nebo opravdu mluvil o nich v každém detail, jiné než, možná, preventivně 428 00:18:14,070 --> 00:18:16,467 v části, ampersand takhle. 429 00:18:16,467 --> 00:18:19,300 No, to dopadá ampersand je jedním z posledních kusů novou syntaxí 430 00:18:19,300 --> 00:18:20,174 budeme se učit. 431 00:18:20,174 --> 00:18:23,500 Vše, co to znamená, že je Adresa nějaké proměnné. 432 00:18:23,500 --> 00:18:25,070 Na jakou adresu se x žít? 433 00:18:25,070 --> 00:18:26,510 Ale to, co se adresa y žít? 434 00:18:26,510 --> 00:18:28,700 Vzhledem k tomu, v případě, že Zásadním problémem, než 435 00:18:28,700 --> 00:18:32,970 bylo to, že x a y byly předány v kopii, na to, co opravdu chtějí dělat 436 00:18:32,970 --> 00:18:38,780 je poskytnout Swap se jako poklad mapa, která vede k kde X a Y vlastně 437 00:18:38,780 --> 00:18:41,910 jsou v paměti RAM, takže Swap může následovat tu mapu 438 00:18:41,910 --> 00:18:47,760 a jít tam, kam x nebo y označuje místo a změnit skuteč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 potřebuje taky trochu změnit. 441 00:18:50,710 --> 00:18:53,760 A na první pohled by to mohlo Vypadáš trochu podobný char hvězdy. 442 00:18:53,760 --> 00:18:54,850 A opravdu je to tak. 443 00:18:54,850 --> 00:18:59,635 Takže je ukazatel na jaký typ dat, na základě tohoto zvýrazněné části? 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ž není int, je to adresa int. 447 00:19:04,880 --> 00:19:07,910 A podobně, b je nyní děje být adresa int. 448 00:19:07,910 --> 00:19:12,470 Takže když jsem teď voláme Swap z hlavní, Nebudu dávat Swap 1 a 2. 449 00:19:12,470 --> 00:19:15,540 Chystám se dát to jako Ox-něco a Ox-něco, 450 00:19:15,540 --> 00:19:19,820 dvě adresy, které povedou Swap jejich skutečné umístění 451 00:19:19,820 --> 00:19:21,310 v paměti svého počítače. 452 00:19:21,310 --> 00:19:25,580 >> Takže teď, můj zbývající realizace musí změnit tad. 453 00:19:25,580 --> 00:19:28,650 Co je to teď samozřejmě jiná v těchto třech řádků kódu? 454 00:19:28,650 --> 00:19:31,350 Je tu ty zatracené všechny hvězdy na místě, vše v pořádku? 455 00:19:31,350 --> 00:19:33,014 Tak co se to tu děje? 456 00:19:33,014 --> 00:19:33,514 Jo? 457 00:19:33,514 --> 00:19:35,055 >> Diváků: Je to samozřejmě [neslyšitelné]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. Malan: Přesně tak. 460 00:19:37,990 --> 00:19:41,560 Takže v tomto context--, a to nebylo rozhodnutí o nejlepší design, pravda, 461 00:19:41,560 --> 00:19:42,530 před lety. 462 00:19:42,530 --> 00:19:45,110 V této souvislosti, kdy stačí mít hvězdu, 463 00:19:45,110 --> 00:19:48,240 a nemáte datový typ, jako int, ihned doleva, 464 00:19:48,240 --> 00:19:53,146 místo toho máte rovnítko, jasně, v této souvislosti, když říkáte, hvězda, 465 00:19:53,146 --> 00:19:56,980 to znamená, že jít do adresa, která je v. 466 00:19:56,980 --> 00:19:58,870 Sledujte mapu pokladu, abych tak řekl. 467 00:19:58,870 --> 00:20:01,720 >> A mezitím, v souladu 37, znamená to, že to samé. 468 00:20:01,720 --> 00:20:05,460 Přejděte na adresu A, a dal to, co tam je? 469 00:20:05,460 --> 00:20:09,520 Ať už je místo, které b určuje. 470 00:20:09,520 --> 00:20:10,980 Jinými slovy, přejděte na B. 471 00:20:10,980 --> 00:20:12,130 Získat tuto hodnotu. 472 00:20:12,130 --> 00:20:15,620 Jdi na a na rovné podepsat, operátor přiřazení, 473 00:20:15,620 --> 00:20:17,010 tam dal tuto hodnotu. 474 00:20:17,010 --> 00:20:19,272 >> Podobně, int temp je jen int. 475 00:20:19,272 --> 00:20:20,730 Nic se musí změnit na tepl. 476 00:20:20,730 --> 00:20:24,810 Je to jen náhradní sklo z Annenberg pro trochu mléka nebo pomerančového džusu. 477 00:20:24,810 --> 00:20:27,630 Ale já si třeba říkat, přejděte na b. 478 00:20:27,630 --> 00:20:31,449 Přejděte do tohoto místa určení a dal hodnotu v teplotě tam. 479 00:20:31,449 --> 00:20:32,490 Takže to, co se děje potom? 480 00:20:32,490 --> 00:20:36,540 Když jsem se vlastně říkat Swap tentokrát, je-li tento první zásobník zde představuje Main, 481 00:20:36,540 --> 00:20:42,270 Tento druhý zásobník představuje Swap, kdy Projdu Ampersand x a y ampersand 482 00:20:42,270 --> 00:20:47,150 od hlavního Přesunout, jen aby bylo jasno, Co je to za stack frame pří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áků: [neslyšitelné]. 486 00:20:50,180 --> 00:20:51,180 David J. Malan: Přesně 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 co si vzpomenete z nich jako poštovní 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 přesunout dvě budovy které jsou na těchto místech. 491 00:21:01,230 --> 00:21:04,680 >> Je to trochu směšné myšlenky, ale to je vše, máme na mysli adresu. 492 00:21:04,680 --> 00:21:07,000 Kde na světě může najít ty dva ints? 493 00:21:07,000 --> 00:21:09,470 Kde na světě můžeš najít ty dvě budovy? 494 00:21:09,470 --> 00:21:15,170 Takže když konečně po všech těch letech, kdy jsem jít do dnešní zdrojového kódu a sestavit 495 00:21:15,170 --> 00:21:22,110 Swap a běh ./swap konečně pro Poprvé můžeme skutečně vidět, že 496 00:21:22,110 --> 00:21:25,330 moje hodnoty jsou opravdu byla úspěšně zaměněny. 497 00:21:25,330 --> 00:21:30,860 A teď, můžeme dokonce vzít Na toto, řekněme, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Tak nech mě jít do stejného souboru. 499 00:21:32,740 --> 00:21:35,010 Nech mě jít napřed a spustit gdb z ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 A nyní, v Swap, já jdu dopředu a nastavit bod zlomu v Mohanem. 502 00:21:40,547 --> 00:21:42,630 A teď jdu dopředu a spusťte program. 503 00:21:42,630 --> 00:21:45,810 A nyní vidíme, můj kód Zastavil se u této linie. 504 00:21:45,810 --> 00:21:48,330 >> Pokud bych do toho pusťte a tisk x, co bych měl vidět tady? 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 Cože? 509 00:21:51,530 --> 00:21:52,295 >> Diváků: [neslyšitelné]. 510 00:21:52,295 --> 00:21:53,910 >> David J. Malan: Tak náhodná čísla, možná. 511 00:21:53,910 --> 00:21:56,010 Možná jsem štěstí, a to je pěkný a jednoduchý, jako je 0. 512 00:21:56,010 --> 00:21:57,230 Ale možná, že je to nějaké náhodné číslo. 513 00:21:57,230 --> 00:21:58,090 V tomto případě jsem měl štěstí. 514 00:21:58,090 --> 00:21:59,030 Prostě se to stane, že je 0. 515 00:21:59,030 --> 00:22:00,780 Ale je to opravdu štěstí, protože ne, dokud jsem 516 00:22:00,780 --> 00:22:06,280 zadejte následující a pak vytisknout x má, že řádek kódu, linka 19, byl popraven. 517 00:22:06,280 --> 00:22:10,942 >> Mezitím, další zase, když píšete, a dnes vytisknout y, budu vidět 2. 518 00:22:10,942 --> 00:22:13,900 Teď, když píšu dál, bude to trochu matoucí, protože teď, 519 00:22:13,900 --> 00:22:17,250 printf bude zobrazovat na obrazovky, jak to dopadlo. x je 1. 520 00:22:17,250 --> 00:22:18,606 >> Pojďme to udělat znovu. 521 00:22:18,606 --> 00:22:20,480 A teď, tady je místo, kde věci zajímavé. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Než jsem se zavolat Swap, nebo dokonce krok do toho, pojďme se trochu podívat. 524 00:22:26,580 --> 00:22:28,980 x je, opět, 1. 525 00:22:28,980 --> 00:22:33,240 Y je, samozřejmě, rychlé rozum zkontrolujte, 2, takže není těžké tam. 526 00:22:33,240 --> 00:22:35,740 Ale co je ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Odpověď, je to trochu funky vypadající. 529 00:22:39,350 --> 00:22:43,500 Ale int hvězda v závorce je jen GDP způsob, jak říci toto je adresa. 530 00:22:43,500 --> 00:22:48,290 Není to int, je to ukazatel na int, nebo jinak známý jako adresu. 531 00:22:48,290 --> 00:22:49,742 >> Co je to šílená věc? 532 00:22:49,742 --> 00:22:51,825 Nikdy jsme neviděli něco docela rád, že před. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Tak tohle je adresa mého počítače paměť, kde x se stane žít. 535 00:22:58,120 --> 00:22:59,040 Je to Ox-něco. 536 00:22:59,040 --> 00:23:01,290 A to je, upřímně řečeno, proč Já jsem začal kreslit šipky, 537 00:23:01,290 --> 00:23:03,340 místo čísel, protože kdo opravdu zajímá 538 00:23:03,340 --> 00:23:06,890 že int je zejména adresa, která je tak velký. 539 00:23:06,890 --> 00:23:12,160 Ale bffff0c4, to všechno jsou opravdu hexadecimálních číslic, 540 00:23:12,160 --> 00:23:13,720 které jsou 0 až f. 541 00:23:13,720 --> 00:23:16,590 >> Takže my nebudeme zabývat příliš dlouho na to, co ty věci jsou. 542 00:23:16,590 --> 00:23:19,400 Ale když jsem se vytisknout y, Samozřejmě, vidím dva. 543 00:23:19,400 --> 00:23:22,440 Ale ampersand y, vidím tuto adresu. 544 00:23:22,440 --> 00:23:26,527 A upozornění pro zvědavý, jak daleko od sebe, jsou x a y? 545 00:23:26,527 --> 00:23:27,985 Můžete ignorovat většinu adresu. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Čtyři byty. 548 00:23:29,920 --> 00:23:33,510 A to je v souladu s našimi dříve, tvrdí, že, jak velký je int? 549 00:23:33,510 --> 00:23:34,130 Čtyři byty. 550 00:23:34,130 --> 00:23:37,420 Takže to vypadá, že vše, co je seřazovat dobře, jak by se mohlo doufat v paměti. 551 00:23:37,420 --> 00:23:40,010 >> Takže teď, řekněme, rychlý posun vpřed na konci tohoto příběhu. 552 00:23:40,010 --> 00:23:43,290 Pojďme dál a typ kroku, ponořit se do funkce Swap. 553 00:23:43,290 --> 00:23:46,880 A teď nevšiml, když jsem typ, je to shodná s adresou x. 554 00:23:46,880 --> 00:23:52,130 Kdybych typ B, je to stejné na adresu y. 555 00:23:52,130 --> 00:23:57,020 Takže to, co bych měl vidět, když říkají, přejděte na adresu a? 556 00:23:57,020 --> 00:23:58,120 Takže vytisknout hvězdy. 557 00:23:58,120 --> 00:24:00,130 Takže hvězdička znamená, tam, v tomto kontextu. 558 00:24:00,130 --> 00:24:02,730 Ampersand znamená, že to, co je adresa. 559 00:24:02,730 --> 00:24:05,000 Takže hrát prostředky 1. 560 00:24:05,000 --> 00:24:09,590 A tisk hvězda b mi dává 2. 561 00:24:09,590 --> 00:24:15,750 >> A dovolte mi, abych převzít, pro tuto chvíli, že alespoň kód, který 562 00:24:15,750 --> 00:24:18,950 pokračuje se nyní může spustit odůvodněné prostřednictvím tímto způsobem. 563 00:24:18,950 --> 00:24:21,150 Ale budeme znovu tuto myšlenku zanedlouho. 564 00:24:21,150 --> 00:24:23,850 Takže tato verze Swap Nyní je správný a umožňuje 565 00:24:23,850 --> 00:24:26,650 nám vyměnit tento konkrétní typ dat. 566 00:24:26,650 --> 00:24:29,120 >> Takže nějaké otázky a pak na swap? 567 00:24:29,120 --> 00:24:29,890 Na hvězdy? 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 nastavit 4, tak nějak, 570 00:24:33,270 --> 00:24:37,310 ale problém nastavit 5, určitě, jak tyto věci jsou užitečné a získat mnohem více 571 00:24:37,310 --> 00:24:39,584 pohodlné s nimi, jako výsledek. 572 00:24:39,584 --> 00:24:40,430 Vůbec něco? 573 00:24:40,430 --> 00:24:40,930 V pořádku. 574 00:24:40,930 --> 00:24:44,350 Tak malloc je, opět, tato funkce že právě přiděluje paměť, paměť 575 00:24:44,350 --> 00:24:45,330 alokace. 576 00:24:45,330 --> 00:24:47,024 A proč je to užitečné? 577 00:24:47,024 --> 00:24:48,940 No, tentokrát, jste používali malloc. 578 00:24:48,940 --> 00:24:52,230 Pokud si myslíte, hned jak getString práce, pravděpodobně, je to 579 00:24:52,230 --> 00:24:56,140 bylo ptát se někoho na kus paměti, kdykoliv uživatel zadá řetězec 580 00:24:56,140 --> 00:24:59,040 in, protože jsme rozhodně Nevěděl, jak zaměstnanci CS50, 581 00:24:59,040 --> 00:25:02,710 jak velké ty řetězce, které lidé budou typu může být. 582 00:25:02,710 --> 00:25:07,910 >> Tak pojďme, poprvé, začněte Sloupněte Jak se CS50 knihovna práce, 583 00:25:07,910 --> 00:25:10,990 prostřednictvím několika příkladů která nás povede tam. 584 00:25:10,990 --> 00:25:15,300 Takže když jsem otevřít gedit a otevřít scanf 0, 585 00:25:15,300 --> 00:25:17,055 budeme vidět následující kód. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, k dispozici na internetových stránkách dnes, má poměrně málo řádků kódu 588 00:25:23,530 --> 00:25:25,351 tu, 14 až 20. 589 00:25:25,351 --> 00:25:26,600 A podívejme se, co to dělá. 590 00:25:26,600 --> 00:25:28,920 Prohlašuje, int, s názvem x. 591 00:25:28,920 --> 00:25:30,850 To říká, že něco jako, číslo, prosím. 592 00:25:30,850 --> 00:25:33,940 A teď říká, scanf% i, & x. 593 00:25:33,940 --> 00:25:35,620 Takže tam je spousta nových věcí tam. 594 00:25:35,620 --> 00:25:38,420 >> Ale scanf, můžete trochu myslet jako opak printf. 595 00:25:38,420 --> 00:25:40,090 printf, samozřejmě, vytiskne na obrazovku. 596 00:25:40,090 --> 00:25:44,410 scanf druh skenů od uživatele klávesnice něco, co on nebo ona napsal. 597 00:25:44,410 --> 00:25:46,550 >> % I je, stejně jako printf. 598 00:25:46,550 --> 00:25:49,410 To znamená, že očekáváme, že uživatel typu int. 599 00:25:49,410 --> 00:25:52,820 A teď, proč si myslíš, že jsem by mohlo být kolem scanf & X? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 V případě, že smyslem života scanf je dostat něco od uživatele, 602 00:25:57,770 --> 00:26:02,480 jaký je význam průchodem, a x, teď? 603 00:26:02,480 --> 00:26:02,980 Jo? 604 00:26:02,980 --> 00:26:03,896 >> Diváků: [neslyšitelné]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. Malan: Přesně tak. 607 00:26:06,540 --> 00:26:12,900 Ať jsem, člověk, zadejte, můj vstup se bude uložen na tomto místě. 608 00:26:12,900 --> 00:26:17,660 Nestačí, vzpomínám, jen předat x, protože jsme viděli už, 609 00:26:17,660 --> 00:26:21,630 kdykoli předat jen syrové proměnné, jako int, na nějakou jinou funkci, 610 00:26:21,630 --> 00:26:25,640 Jistě, může to změnit variabilní, ale ne trvale. 611 00:26:25,640 --> 00:26:27,360 To nemůže mít vliv na hlavní. 612 00:26:27,360 --> 00:26:29,420 Je možné změnit jen svou vlastní lokální kopii. 613 00:26:29,420 --> 00:26:32,560 Ale pokud místo, nemusíte dej mi aktuální int, 614 00:26:32,560 --> 00:26:36,640 ale můžete mi ukázat cestu k že int, teď, že scanf, 615 00:26:36,640 --> 00:26:41,050 Jistě, mohu z toho, že oslovit a dát tam číslo 616 00:26:41,050 --> 00:26:43,280 takže máte přístup k němu stejně. 617 00:26:43,280 --> 00:26:45,120 >> Takže když jsem spustit tento program, uvidíme. 618 00:26:45,120 --> 00:26:49,660 Ujistěte se scanf 0 dot slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 A když jsem teď zadejte číslo jako 50, díky za 50. 620 00:26:54,030 --> 00:26:58,150 Pokud teď zadejte číslo jako negativní 1, pro záporné 1. 621 00:26:58,150 --> 00:27:04,200 Nyní zadejte číslo jako 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Proč se můj program mě ignorovat? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 No, protože prostě, řekl jsem to očekávat pouze int. 625 00:27:09,880 --> 00:27:10,380 V pořádku. 626 00:27:10,380 --> 00:27:11,630 Takže to je jedna verze tohoto. 627 00:27:11,630 --> 00:27:16,600 Pojďme vzít věci do zářezu a navrhnout, že to není dobré. 628 00:27:16,600 --> 00:27:20,530 A zde se skrývá velmi jednoduchý příklad o tom, jak můžeme začít psát kód 629 00:27:20,530 --> 00:27:24,450 že ostatní lidé mohou využívat nebo ohrozit tím, že dělá špatné věci. 630 00:27:24,450 --> 00:27:28,336 Tak linie 16, tak podobné v duchu, aby dříve, 631 00:27:28,336 --> 00:27:29,960 ale nejsem prohlásil, že v pravý tentokrát. 632 00:27:29,960 --> 00:27:32,970 Já jsem, kterým bylo char hvězdu, aka řetězce. 633 00:27:32,970 --> 00:27:35,190 >> Ale co to vlastně znamená? 634 00:27:35,190 --> 00:27:38,790 Takže když nezadáte address-- a Já jsem ho volat libovolně, buffer, 635 00:27:38,790 --> 00:27:43,370 ale nemohl jsem zavolat, že to, aby simple-- a pak jsem si to, vysvětlete mi, 636 00:27:43,370 --> 00:27:48,630 kdybys mohl, na základě předchozí logika, co se scanf dělá v řádku 18, 637 00:27:48,630 --> 00:27:55,000 pokud průchod% s a vyrovnávací paměti, což je adresa? 638 00:27:55,000 --> 00:27:58,210 Co je scanf, pokud platí přesně stejná logika jako verze 0, 639 00:27:58,210 --> 00:28:00,640 Pokusím se udělat tady, když uživatel zadá něco? 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áků: [neslyšitelné]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. Malan: Přesně tak. 645 00:28:08,890 --> 00:28:11,577 Scanf, tím dříve logika, bude mít řetězec 646 00:28:11,577 --> 00:28:13,410 že lidské psané v-- je nyní řetězec, 647 00:28:13,410 --> 00:28:15,790 že to není číslo, pravděpodobně, pokud on nebo ona cooperates-- 648 00:28:15,790 --> 00:28:19,310 a to bude se snažit, aby to řetězec v paměti na libovolnou adresu 649 00:28:19,310 --> 00:28:20,340 vyrovnávací paměti určuje. 650 00:28:20,340 --> 00:28:23,870 A to je skvělé, protože vyrovnávací paměti je skutečně má být adresa. 651 00:28:23,870 --> 00:28:30,470 >> Ale tvrdím, že tento program je buggy v velmi závažným způsobem, protože to, co hodnota je 652 00:28:30,470 --> 00:28:31,330 vyrovnávací paměti ve výchozím nastavení? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Co jsem inicializován do? 655 00:28:34,790 --> 00:28:35,770 Co kus paměti? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Já ne, že jo? 658 00:28:38,620 --> 00:28:42,265 >> Takže i když jsem přidělena char hvězda, která se již nenazývá s, 659 00:28:42,265 --> 00:28:48,030 je to místo nazývá buffer-- tak Pojďme nakreslit název proměnné 660 00:28:48,030 --> 00:28:53,380 nyní jako buffer-- jestli nemám volal getString nebo malloc zde 661 00:28:53,380 --> 00:28:56,030 že v praxi znamená, že buffer je jen některé odpadky hodnota. 662 00:28:56,030 --> 00:28:57,030 >> Teď co to znamená? 663 00:28:57,030 --> 00:29:00,220 To znamená, že jsem řekl, scanf očekávat řetězec od uživatele. 664 00:29:00,220 --> 00:29:01,300 A víte co? 665 00:29:01,300 --> 00:29:03,883 Bez ohledu na to, co se ukazuje na-- a kreslím otazník, 666 00:29:03,883 --> 00:29:07,060 ale ve skutečnosti, to bude něco jako OX1, 2, 3, ne? 667 00:29:07,060 --> 00:29:10,730 Je to nějaký falešný hodnota, která právě se stane, že tam před rokem. 668 00:29:10,730 --> 00:29:13,440 Takže jinak řečeno, je to jako by pufr je jen 669 00:29:13,440 --> 00:29:16,180 ukazuje na něco, co v paměti. 670 00:29:16,180 --> 00:29:17,610 Nemám ponětí, co se děje. 671 00:29:17,610 --> 00:29:24,130 >> Takže když jsem zadat Gabe teď, bude to pokusit se dát g-a-b-E / 0 tam. 672 00:29:24,130 --> 00:29:25,530 Ale kdo ví, co to je? 673 00:29:25,530 --> 00:29:27,480 A v minulosti, jakákoliv Tentokrát jsme se snažili dotknout 674 00:29:27,480 --> 00:29:29,770 paměť, která nepatří nám, co se stalo? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Nebo téměř pokaždé. 677 00:29:32,870 --> 00:29:34,310 Chyba segmentace, ne? 678 00:29:34,310 --> 00:29:37,829 >> Tato šipka, nemám tušení, kde to je polohovací. je to jen náhodná hodnota. 679 00:29:37,829 --> 00:29:40,370 A samozřejmě, pokud se interpretovat náhodná hodnota jako adresa, 680 00:29:40,370 --> 00:29:42,610 se chystáte jít do nějaký náhodný cíl. 681 00:29:42,610 --> 00:29:46,810 Takže Gabe by skutečně crash můj program v tomto případě zde. 682 00:29:46,810 --> 00:29:50,600 >> Takže to, co můžeme udělat, je to skoro stejně špatné? 683 00:29:50,600 --> 00:29:52,660 Vezměme v úvahu toto třetí a Posledním příkladem z scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Tato verze je lepší, v jakém smyslu? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Pokud jste spokojeni s předchozí problém, to je lepší. 688 00:30:01,400 --> 00:30:02,250 Proč? 689 00:30:02,250 --> 00:30:03,250 >> Diváků: [neslyšitelné]. 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 případě linky 16 je lepší, v tom smyslu, 693 00:30:09,970 --> 00:30:12,030 že jsme explicitně vyčleňují paměti. 694 00:30:12,030 --> 00:30:14,190 Nejsme pomocí malloc, jsme použili týden 2 695 00:30:14,190 --> 00:30:16,060 přístup jen deklarovat pole. 696 00:30:16,060 --> 00:30:18,130 A my jsme řekl, že řetězec je jen pole znaků, 697 00:30:18,130 --> 00:30:19,690 tak to je naprosto legitimní. 698 00:30:19,690 --> 00:30:22,910 Ale to je, samozřejmě, jako zjistíte, pevnou velikost 16. 699 00:30:22,910 --> 00:30:25,440 >> Tak tento program je naprosto bezpečné, když jsem typ 700 00:30:25,440 --> 00:30:29,760 v jedné znakové řetězce, dvoumístný Řetězce, 15 znakové řetězce. 701 00:30:29,760 --> 00:30:34,970 Ale jakmile začnu psát 16, 17, 18, 1000 znakové řetězce, 702 00:30:34,970 --> 00:30:37,390 , kde je tento řetězec skončí? 703 00:30:37,390 --> 00:30:39,570 Bude to skončit částečně zde. 704 00:30:39,570 --> 00:30:42,820 Ale kdo ví, co ještě je za hranicemi 705 00:30:42,820 --> 00:30:44,270 tohoto konkrétního pole? 706 00:30:44,270 --> 00:30:48,015 >> Je to, jako když jsem prohlášen za 16 krabic zde. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Takže spíše než vytáhnout všechny 16, budeme jen předstírat, že jsem se vyvodit 16. 709 00:30:52,690 --> 00:30:56,540 Ale když pak se snažím číst řetězec To je mnohem déle, stejně jako 50 znaků, 710 00:30:56,540 --> 00:31:01,270 Chystám se začít dávat a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 A to je pravděpodobně jiné paměti segmentu 712 00:31:04,916 --> 00:31:06,790 že, opět, může způsobit můj program k havárii, 713 00:31:06,790 --> 00:31:10,600 protože jsem nežádal něco víc než jen 16 bajtů. 714 00:31:10,600 --> 00:31:12,260 >> Takže koho to zajímá? 715 00:31:12,260 --> 00:31:13,880 No, tady je knihovna CS50. 716 00:31:13,880 --> 00:31:17,220 A většina z toho je jen jako návod tak nahoře. 717 00:31:17,220 --> 00:31:21,670 Knihovna CS50, celou tu dobu, má tento řádek v souladu 52. 718 00:31:21,670 --> 00:31:23,680 Viděli jsme typedef, nebo uvidíte typedef 719 00:31:23,680 --> 00:31:27,930 v pset 4, která se právě vytváří synonymum čímž char hvězda může být více 720 00:31:27,930 --> 00:31:29,290 jednoduše odkazoval se na jako řetězec. 721 00:31:29,290 --> 00:31:31,540 Takže to je jeden z Několik koleček 722 00:31:31,540 --> 00:31:34,120 jsme použili tajně pod kapotou. 723 00:31:34,120 --> 00:31:36,490 >> Mezitím, tady je funkce, getchar. 724 00:31:36,490 --> 00:31:38,190 Nyní se zdá, není tělo na to. 725 00:31:38,190 --> 00:31:40,273 A ve skutečnosti, když jsem držet rolování, nemám vlastně 726 00:31:40,273 --> 00:31:42,080 zobrazit všechny implementace z těchto funkcí. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Pro kontrolu sanity, proč tomu tak je? 729 00:31:45,516 --> 00:31:46,795 >> Diváků: [neslyšitelné]. 730 00:31:46,795 --> 00:31:47,670 David J. Malan: Jo. 731 00:31:47,670 --> 00:31:48,950 Tak tohle je hlavičkový soubor. 732 00:31:48,950 --> 00:31:52,520 A hlavičkové soubory obsahují prototypy, plus nějaké další věci, zdá se, 733 00:31:52,520 --> 00:31:53,780 jako typedefs. 734 00:31:53,780 --> 00:31:56,910 Ale v CS50.c, které máme nikdy uveden přímo, 735 00:31:56,910 --> 00:32:02,100 ale byla v CS50 spotřebiče všech Tentokrát, hluboko uvnitř jeho složek, 736 00:32:02,100 --> 00:32:04,990 Všimněte si, že je celý banda funkcí zde. 737 00:32:04,990 --> 00:32:06,720 >> Ve skutečnosti, pojďme přejděte dolů. 738 00:32:06,720 --> 00:32:08,810 Pojďme ignorovat většinu z nich, pro tuto chvíli. 739 00:32:08,810 --> 00:32:12,670 Ale přejděte na vezmi_int a uvidíte, jak vezmi_int funguje. 740 00:32:12,670 --> 00:32:13,890 Takže tady je vezmi_int. 741 00:32:13,890 --> 00:32:17,727 A pokud budete někdy opravdu záleželo, jak dostat int funguje, zde je jeho dokumentace. 742 00:32:17,727 --> 00:32:19,560 A mezi věcmi se říká, že je to vám řekne, 743 00:32:19,560 --> 00:32:21,340 co rozsahy hodnot se může vrátit. 744 00:32:21,340 --> 00:32:24,400 Je to v podstatě negativní 2000000000 k pozitivnímu 2000000000, dávat nebo brát. 745 00:32:24,400 --> 00:32:26,420 >> A ukázalo se, to vše čas, i když jsme nikdy 746 00:32:26,420 --> 00:32:28,570 měl byste zkontrolovat na to, když se něco pokazí, 747 00:32:28,570 --> 00:32:30,680 Ukazuje se, že všechny Tentokrát vezmi_int má 748 00:32:30,680 --> 00:32:33,600 vracejí zvláštní konstantní, není null, 749 00:32:33,600 --> 00:32:36,760 ale spíše INT_MAX, který je Úmluva jen pár programátora. 750 00:32:36,760 --> 00:32:38,846 To znamená, že je zde speciální hodnota. 751 00:32:38,846 --> 00:32:41,470 Ujistěte se, za to, jen v případě, že se něco pokazí. 752 00:32:41,470 --> 00:32:43,261 Ale my jsme nikdy neobtěžoval se, že k dnešnímu dni, 753 00:32:43,261 --> 00:32:45,200 protože znovu, to je určen pro zjednodušení. 754 00:32:45,200 --> 00:32:46,950 >> Ale jak se dostat vezmi_int provádět? 755 00:32:46,950 --> 00:32:48,450 No, jeden trvá žádné argumenty. 756 00:32:48,450 --> 00:32:49,390 Víme, že. 757 00:32:49,390 --> 00:32:50,820 Vrací int. 758 00:32:50,820 --> 00:32:51,950 Víme, že. 759 00:32:51,950 --> 00:32:54,460 Tak jak to funguje pod kapotou? 760 00:32:54,460 --> 00:32:58,290 >> Takže je zřejmě nekonečný smyčka, alespoň jednoho vzhled. 761 00:32:58,290 --> 00:33:00,290 Všimněte si, že jsme pomocí getString. 762 00:33:00,290 --> 00:33:04,000 Tak to je zajímavé. vezmi_int žádá, aby naše vlastní funkce, getString. 763 00:33:04,000 --> 00:33:05,645 A teď, proč by to mohlo být? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Proč jsem defenzivní zde v řadě 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Co by se mohlo stát v souladu 164, jen aby bylo jasno? 768 00:33:15,639 --> 00:33:16,930 Je to stejná odpověď jako předtím. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Může být jen z paměti. 771 00:33:20,089 --> 00:33:23,130 Se něco pokazí s getString, musíme být schopni zvládnout. 772 00:33:23,130 --> 00:33:27,070 A důvod, proč jsem se nevrací null že technicky, null je ukazatel. 773 00:33:27,070 --> 00:33:29,120 vezmi_int má vrátit int. 774 00:33:29,120 --> 00:33:31,060 Tak jsem se svévolně rozhodl, v podstatě, 775 00:33:31,060 --> 00:33:34,600 že 2 miliardy, dávat nebo brát, bude být zvláštní hodnotu, která jsem nikdy nemůže 776 00:33:34,600 --> 00:33:35,970 skutečně dostat od uživatele. 777 00:33:35,970 --> 00:33:39,930 Je to jen jedna hodnota jdu ztrácet reprezentovat chybový kód. 778 00:33:39,930 --> 00:33:41,540 >> Takže teď, věci se trochu fantazie. 779 00:33:41,540 --> 00:33:44,670 A není to úplně stejné funkce jako dříve, ale je to velmi podobné. 780 00:33:44,670 --> 00:33:50,120 Tak zjistíte, Prohlašuji zde, v souladu 172, a to jak int n a char c. 781 00:33:50,120 --> 00:33:53,600 A pak jsem použít tento funky linku, sscanf, což se ukázalo 782 00:33:53,600 --> 00:33:55,990 nekontroluje řetězec z klávesnice. 783 00:33:55,990 --> 00:33:59,226 Stojí existující řetězec, který uživatel již zadali. 784 00:33:59,226 --> 00:34:02,100 Tak jsem už volal getString, který znamená, že mám řetězec v paměti. 785 00:34:02,100 --> 00:34:05,020 sscanf je to, co byste Volání funkce rozebrat. 786 00:34:05,020 --> 00:34:07,760 Vypadá to na provázku jsem zadali, znak po znaku, 787 00:34:07,760 --> 00:34:09,250 a dělá něco užitečného. 788 00:34:09,250 --> 00:34:10,969 , Že řetězec je uložen v souladu. 789 00:34:10,969 --> 00:34:13,560 A vím, že jen tím, že jde zálohovat tady a říkají, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Zavolal jsem jí 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 teď je to trochu jinak. 793 00:34:18,080 --> 00:34:22,480 Ale to v podstatě znamená, z důvodů budeme trochu mávat rukama na dnes, 794 00:34:22,480 --> 00:34:26,070 že jsme kontrolu na zjistit, zda uživatel zadal 795 00:34:26,070 --> 00:34:29,909 a int a možná jiný charakter. 796 00:34:29,909 --> 00:34:33,610 V případě, že uživatel zadal int, je to bude uložen v n, protože jsem 797 00:34:33,610 --> 00:34:36,739 Absolvování tohoto adresou, Nový trik jsme dnes viděli. 798 00:34:36,739 --> 00:34:41,570 V případě, že uživatel také napsal v jako 123x, že x 799 00:34:41,570 --> 00:34:45,060 se chystá skončit písmeno ve znaku c. 800 00:34:45,060 --> 00:34:48,739 >> Nyní se ukazuje, že sscanf mi říct, inteligentně, 801 00:34:48,739 --> 00:34:54,750 kolik proměnných byla sscanf úspěšně schopni vyplnit. 802 00:34:54,750 --> 00:34:58,770 Takže podle této logiky, v případě, že funkce Já provádění je vezmi_int, 803 00:34:58,770 --> 00:35:00,900 ale já jsem kontrolu, případně, pro uživatele 804 00:35:00,900 --> 00:35:04,190 aby zadali do int následuje něco jiného, 805 00:35:04,190 --> 00:35:08,580 Co chci sscanf je Návratová hodnota skutečně být? 806 00:35:08,580 --> 00:35:10,950 V případě, že cílem je získat jen int od uživatele? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Takže pokud sscanf přiznání 2, co to znamená? 809 00:35:19,300 --> 00:35:21,660 Uživatel zadal něco jako, a to doslova, 810 00:35:21,660 --> 00:35:24,770 123x, což je prostě nesmysl. 811 00:35:24,770 --> 00:35:27,490 Je to chybový stav, a Chci zkontrolovat, že. 812 00:35:27,490 --> 00:35:32,960 >> Takže pokud uživatel zadá to v tím, že tato logika, co dělá sscanf vrátit, 813 00:35:32,960 --> 00:35:33,740 byste řekli? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Takže to bude vracet 2, protože 123 se jít sem, 816 00:35:39,130 --> 00:35:41,580 a x je skončí tady. 817 00:35:41,580 --> 00:35:43,970 Ale já nechci x, aby se naplnil. 818 00:35:43,970 --> 00:35:48,580 Chci sscanf jen uspět v plnění první z jeho proměnných. 819 00:35:48,580 --> 00:35:52,490 A tak to je důvod, proč jsem chcete sscanf vrátit jeden. 820 00:35:52,490 --> 00:35:55,750 >> A pokud je to něco málo přes hlavu pro tuto chvíli, že je to úplně v pohodě. 821 00:35:55,750 --> 00:36:00,030 Uvědomte si však, že jeden z Hodnoty vezmi_int a getString 822 00:36:00,030 --> 00:36:03,630 je to, že děláme sakra Mnoho chyb kontroly, jako tomu tak 823 00:36:03,630 --> 00:36:07,130 že k dnešnímu dni, můžete do značné míry napište cokoliv klávesnici 824 00:36:07,130 --> 00:36:08,490 a my se ho chytit. 825 00:36:08,490 --> 00:36:10,592 A určitě, personál, určitě ne 826 00:36:10,592 --> 00:36:13,300 být zdrojem chyby ve vašem programu, protože jsme defenzivně 827 00:36:13,300 --> 00:36:16,270 kontrola pro všechny hloupé věci, které by uživatel mohl dělat, 828 00:36:16,270 --> 00:36:18,900 jako je psaní řetězec, kdy jste opravdu chtěli int. 829 00:36:18,900 --> 00:36:21,350 Takže teď-- přijdeme zpět na předtím long-- 830 00:36:21,350 --> 00:36:23,710 ale po celou tu dobu, getString a vezmi_int mají 831 00:36:23,710 --> 00:36:29,950 Byl pod kapotou pomocí této Základní myšlenkou adres paměti. 832 00:36:29,950 --> 00:36:32,580 >> Takže teď, pojďme dělat věci trochu více uživatelsky příjemný. 833 00:36:32,580 --> 00:36:38,740 Jak si možná vzpomínáte, od Binkym poslední time-- pokud bude moje myš cooperate-- tak 834 00:36:38,740 --> 00:36:42,560 jsme měli tento kód, který Upřímně řečeno, je docela nesmyslné. 835 00:36:42,560 --> 00:36:45,330 Tento kód dosahuje nic užitečné, ale to byl příklad 836 00:36:45,330 --> 00:36:48,330 že profesor Parlante použít, aby se představují 837 00:36:48,330 --> 00:36:51,840 co se děje v program, který zahrnuje paměť. 838 00:36:51,840 --> 00:36:54,850 >> Takže pojďme se převyprávět to Příběh mimořádně stručně. 839 00:36:54,850 --> 00:36:58,720 Tyto první dva řádky, v Anglicky, dělat to, co by na to? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Jen rozumně člověk, ale mírně technické termíny, se bodnout. 842 00:37:05,430 --> 00:37:06,346 Diváků: [neslyšitelné]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. Malan: OK, ty, kterým se stanoví adresy pro váš X a proměnné y. 845 00:37:11,080 --> 00:37:15,520 Ne zcela, protože x a y nejsou proměnné v tradičním slova smyslu. 846 00:37:15,520 --> 00:37:18,054 x a y jsou adresy nebo uloží adresu. 847 00:37:18,054 --> 00:37:19,220 Zkusme to ještě jednou. 848 00:37:19,220 --> 00:37:21,010 To není špatný začátek, ačkoli. 849 00:37:21,010 --> 00:37:21,510 Jo? 850 00:37:21,510 --> 00:37:22,426 >> Diváků: [neslyšitelné]. 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 čistší. 854 00:37:26,173 --> 00:37:28,630 Deklarace dva ukazatele, dvě celá čísla. 855 00:37:28,630 --> 00:37:30,150 A my jsme jim volat x a y. 856 00:37:30,150 --> 00:37:32,790 Nebo když jsme k tomu to jako obrázek, opět, 857 00:37:32,790 --> 00:37:36,410 připomenout, prostě, že všechny děláme s tím prvním řádku 858 00:37:36,410 --> 00:37:39,690 kreslí krabici jako je tento, s nějakou hodnotou odpadky v něm, 859 00:37:39,690 --> 00:37:41,920 a volat to x, a pak další box takhle, 860 00:37:41,920 --> 00:37:43,880 s některými odpadky hodnoty v tom, volat to y. 861 00:37:43,880 --> 00:37:45,810 Máme prohlásil dva ukazatele, které nakonec 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šechno. 864 00:37:49,170 --> 00:37:53,290 >> Takže když Binky to udělal, jíl stejně vypadal takto. 865 00:37:53,290 --> 00:37:55,350 A Nick jen tak zabalili šipky, 866 00:37:55,350 --> 00:37:57,590 jako by to neukazuje nikde zejména proto, že jsou to jen 867 00:37:57,590 --> 00:37:58,250 hodnoty na odpadky. 868 00:37:58,250 --> 00:38:01,670 Oni nejsou explicitně inicializovat kdekoli zejména. 869 00:38:01,670 --> 00:38:03,980 >> Nyní další řada kód, odvolání, byla tato. 870 00:38:03,980 --> 00:38:07,510 Takže rozumně uživatelsky příjemný, ale poněkud technickou angličtinu, 871 00:38:07,510 --> 00:38:09,790 co je to řádek kódu děláš? 872 00:38:09,790 --> 00:38:10,391 Jo? 873 00:38:10,391 --> 00:38:11,333 >> Diváků: [neslyšitelné]. 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 přidělování kus paměti, že je to velikost int. 877 00:38:17,016 --> 00:38:18,140 A to je polovina odpovědí. 878 00:38:18,140 --> 00:38:20,056 Odpověděli jste právo polovina výrazu. 879 00:38:20,056 --> 00:38:22,473 To, co se děje na levá strana rovnítko? 880 00:38:22,473 --> 00:38:22,972 Jo? 881 00:38:22,972 --> 00:38:24,814 Diváků: a přiřadí že k proměnné x? 882 00:38:24,814 --> 00:38:27,690 >> David J. Malan: a přiřadí že k proměnné x. 883 00:38:27,690 --> 00:38:31,650 Takže rekapitulace, pravá strana přiděluje dostatek paměti pro uložení int. 884 00:38:31,650 --> 00:38:34,150 Ale malloc specificky vrátí adresu 885 00:38:34,150 --> 00:38:37,270 tohoto kusu paměti, kterou jste právě navrhla je uložena v x. 886 00:38:37,270 --> 00:38:42,560 >> Takže to, co Nick minule Binkym je táhl, že ukazatel se, hlína, 887 00:38:42,560 --> 00:38:46,820 ukázat se na bílou kus paměti která je rovna velikosti int. 888 00:38:46,820 --> 00:38:49,360 A skutečně, to znamená, představují čtyři bajty. 889 00:38:49,360 --> 00:38:55,310 >> Teď, další řádek kódu to udělal, hvězda x dostane 42. 890 00:38:55,310 --> 00:38:58,530 Takže 42 je jednoduché na pravá strana, smysl života. 891 00:38:58,530 --> 00:39:00,500 Levá strana, hvězda x znamená co? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 To také může mít gone-- to je v pořádku. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> DIVÁKŮ: V podstatě, jít na [neslyšitelné] 896 00:39:06,875 --> 00:39:07,750 David J. Malan: Dobrý. 897 00:39:07,750 --> 00:39:08,760 Diváků: [neslyšitelné]. 898 00:39:08,760 --> 00:39:09,760 David J. Malan: Přesně tak. 899 00:39:09,760 --> 00:39:11,979 Levá strana znamená jít 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 jako 33 Oxford Street nebo OX1. 902 00:39:15,520 --> 00:39:18,690 A hvězda x znamená jít na to oslovit a dát to, co tam je? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Takže opravdu, to je přesně to, co Nick udělal. 905 00:39:21,290 --> 00:39:23,740 Začal s vedlejší, v podstatě, mentálně 906 00:39:23,740 --> 00:39:26,270 ukázal prstem na x, ve směru šipky 907 00:39:26,270 --> 00:39:30,670 na bílém poli na pravé straně boční, a uvedení čísla 42 tam. 908 00:39:30,670 --> 00:39:34,120 Ale pak se to začalo trochu nebezpečné, ne? 909 00:39:34,120 --> 00:39:35,860 Binky je přijít o hlavu. 910 00:39:35,860 --> 00:39:39,465 >> Hvězda y se rovná 13, smůlu, znamená co? 911 00:39:39,465 --> 00:39:43,620 Takže hvězdy Y znamená jít na adresu v y. 912 00:39:43,620 --> 00:39:45,630 Ale co je adresa y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Dobře, je to hodnota odpadky, ne? 915 00:39:49,440 --> 00:39:50,800 Nakreslil jsem to jako otazník. 916 00:39:50,800 --> 00:39:54,850 Nick vytáhl ho jako stočený šipku nahoru. 917 00:39:54,850 --> 00:39:59,600 A jakmile se pokusíte do hvězdy Y, říká se tam, 918 00:39:59,600 --> 00:40:03,872 ale není legitimní adresa, je to nějaký falešný umístění, 919 00:40:03,872 --> 00:40:05,080 Program se bude pád. 920 00:40:05,080 --> 00:40:08,580 A Binky hlava se děje odletět tady, jak to dopadlo. 921 00:40:08,580 --> 00:40:12,130 >> Takže nakonec, tento program byl jen naplno chyba. 922 00:40:12,130 --> 00:40:13,540 Bylo buggy programu. 923 00:40:13,540 --> 00:40:14,760 A je potřeba opravit. 924 00:40:14,760 --> 00:40:18,260 A jediný způsob, opravdu, to opravit by, například, tento řádek, 925 00:40:18,260 --> 00:40:21,010 které jsme neměli ani dostat, protože program spadl příliš brzy. 926 00:40:21,010 --> 00:40:26,170 Ale pokud bychom měli napravit, co vliv má dělat y rovné x má? 927 00:40:26,170 --> 00:40:30,010 No, je to v podstatě poukazuje na y bez ohledu na hodnotu x ukazuje na. 928 00:40:30,010 --> 00:40:32,430 >> Takže Nick příběhu, nebo Binky příběh, a to jak 929 00:40:32,430 --> 00:40:34,640 x a y se ukázal na bílý kus paměti, 930 00:40:34,640 --> 00:40:38,300 tak, že nakonec, když ti se hvězda y znovu se rovná 13, 931 00:40:38,300 --> 00:40:43,080 můžete skončit uvedení 13 v vhodné umístění. 932 00:40:43,080 --> 00:40:47,640 Takže všechny tyto linky jsou dokonale legitimní, s výjimkou pro tento jeden, 933 00:40:47,640 --> 00:40:51,730 když se to stalo před vámi vlastně přidělen ý nějakou hodnotu. 934 00:40:51,730 --> 00:40:54,290 >> Teď naštěstí nemusíte musí zdůvodnit přes všechny 935 00:40:54,290 --> 00:40:56,560 z těchto druhů otázek, na vlastní pěst. 936 00:40:56,560 --> 00:40:59,310 Nech mě jít napřed a otevřít up okně terminálu zde 937 00:40:59,310 --> 00:41:03,050 a otevřít, jen na okamžik, super krátký program, který 938 00:41:03,050 --> 00:41:04,360 Také je trochu zbytečné. 939 00:41:04,360 --> 00:41:05,152 Je to ošklivé. 940 00:41:05,152 --> 00:41:06,610 To není dosáhnout něčeho užitečného. 941 00:41:06,610 --> 00:41:10,180 Ale to ukazují problémy paměti, takže se pojďme podívat. 942 00:41:10,180 --> 00:41:11,830 >> Hlavní, super jednoduché. 943 00:41:11,830 --> 00:41:14,830 Je to zřejmě volá funkci, f, a pak se vrátí 0. 944 00:41:14,830 --> 00:41:16,310 Je to docela těžké, aby nepořádek to. 945 00:41:16,310 --> 00:41:18,540 Takže hlavní je docela dobrý, tak daleko. 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ávě nedal moc úsilí na to pojmenování 948 00:41:22,120 --> 00:41:23,990 zde, aby zaměření na kód. 949 00:41:23,990 --> 00:41:25,740 f má dva řádky. 950 00:41:25,740 --> 00:41:27,610 A pojďme se podívat, co se teď děje. 951 00:41:27,610 --> 00:41:29,840 Tak na jedné straně tady-- a dovolte mi, abych 952 00:41:29,840 --> 00:41:32,680 to v souladu s předchozí example-- na jedné straně, 953 00:41:32,680 --> 00:41:35,830 levá strana je to, co v angličtině? 954 00:41:35,830 --> 00:41:36,493 To je-- 955 00:41:36,493 --> 00:41:37,701 Diváků: Vytvoření ukazatele. 956 00:41:37,701 --> 00:41:40,830 David J. Malan: Vytvoření ukazatele int a volat to x. 957 00:41:40,830 --> 00:41:43,789 Takže to vytváří jednu z těch krabic Pořád kreslení na dotykové obrazovce. 958 00:41:43,789 --> 00:41:45,913 A teď, na pravé straně boční, malloc, samozřejmě, 959 00:41:45,913 --> 00:41:47,420 přiděluje kus paměti. 960 00:41:47,420 --> 00:41:49,989 A jen aby bylo jasno, jak kolik paměti je to zřejmě 961 00:41:49,989 --> 00:41:52,030 přidělování, pokud jste právě druh si to spočítejte tady? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Tak to je 40 bajtů. 964 00:41:54,040 --> 00:41:57,400 A vím, že jen proto, že vím, int, na CS50 spotřebiče, alespoň 965 00:41:57,400 --> 00:41:58,060 je čtyři 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 ukládání je x, adresa první z 40 ints že 968 00:42:04,924 --> 00:42:07,340 byly přiděleny místo zpět, k sobě, k sobě, k sobě. 969 00:42:07,340 --> 00:42:08,470 >> A to je to, co je klíčem k malloc. 970 00:42:08,470 --> 00:42:11,261 Neznamená to však trvat trochu paměti tady, trochu tady, trochu tady. 971 00:42:11,261 --> 00:42:14,220 To vám dává jeden blok paměti, souvisle, 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 co teď, x držák 10 = 0? 974 00:42:18,500 --> 00:42:19,470 Libovolný řádek kódu. 975 00:42:19,470 --> 00:42:21,100 To není dosáhnout něčeho užitečného. 976 00:42:21,100 --> 00:42:26,128 Ale je zajímavé, protože x držák 10--? 977 00:42:26,128 --> 00:42:26,628 Jo? 978 00:42:26,628 --> 00:42:27,912 >> Diváků: [neslyšitelné]? 979 00:42:27,912 --> 00:42:30,500 >> David J. Malan: x držák 10 nemusí být null. 980 00:42:30,500 --> 00:42:35,070 Detail null přichází pouze do hry s řetězci, na konci řetězce. 981 00:42:35,070 --> 00:42:36,700 Ale dobrá myšlenka. 982 00:42:36,700 --> 00:42:39,615 >> Jak velká je to pole, a to i když jsem přiděleno 40 bytů? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Je to 0 až devět, jo? 985 00:42:43,690 --> 00:42:45,120 Je to 10 ints celkem. 986 00:42:45,120 --> 00:42:48,790 40 bajtů, ale 10 ints, indexovány 0 až 0. 987 00:42:48,790 --> 00:42:50,930 >> Takže to, co je to, že x držák 10? 988 00:42:50,930 --> 00:42:53,090 Je to vlastně část neznámý odpadky hodnota. 989 00:42:53,090 --> 00:42:54,780 Je to paměť, která nepatří ke mně. 990 00:42:54,780 --> 00:42:59,650 Neměl bych být dotýkat, že byte číslo 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Jdu trochu příliš daleko. 992 00:43:01,420 --> 00:43:04,490 >> A skutečně, když jsem spustit tento programu, může velmi dobře dojít k chybě. 993 00:43:04,490 --> 00:43:05,790 Ale někdy, budeme mít štěstí. 994 00:43:05,790 --> 00:43:07,706 A tak jen prokázat tohle-- a upřímně řečeno, 995 00:43:07,706 --> 00:43:11,000 nikdy nevíte, před vámi se to-- pojďme běžet to. 996 00:43:11,000 --> 00:43:12,480 Nebylo vlastně havárii. 997 00:43:12,480 --> 00:43:15,032 >> Ale když jsem se to změnit, pro instance, být jako 1000, 998 00:43:15,032 --> 00:43:16,740 aby se to opravdu úmyslné, podívejme se 999 00:43:16,740 --> 00:43:18,710 pokud se nám podaří to, aby pád tentokrát. 1000 00:43:18,710 --> 00:43:20,070 OK, to se nespadne. 1001 00:43:20,070 --> 00:43:22,600 Jak se o 100.000? 1002 00:43:22,600 --> 00:43:25,000 Pojďme předělat a nyní spusťte jej. 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 pořádku. 1006 00:43:26,460 --> 00:43:29,090 Takže se zdá, opět se jedná segmenty paměti, abych tak řekl, 1007 00:43:29,090 --> 00:43:32,660 jsou poměrně velké, takže můžeme se znovu a znovu štěstí. 1008 00:43:32,660 --> 00:43:36,510 Ale nakonec, jakmile se dostanete k smíchu a opravdu jít daleko na obrazovce, 1009 00:43:36,510 --> 00:43:39,120 se dotknete paměti, že ve skutečnosti, opravdu nepatří k vám. 1010 00:43:39,120 --> 00:43:40,870 >> Ale upřímně řečeno, tito druhy chyb se děje 1011 00:43:40,870 --> 00:43:43,020 bude těžší a těžší zjistit, na vlastní pěst. 1012 00:43:43,020 --> 00:43:47,880 Ale naštěstí, jako programátoři, máme nástroje, které nám umožňují dělat to pro nás. 1013 00:43:47,880 --> 00:43:50,140 Tak tohle je snad jedna z nejošklivějších programů, 1014 00:43:50,140 --> 00:43:52,060 dokonce ošklivější, než výstup gdb je. 1015 00:43:52,060 --> 00:43:55,670 Ale vždy má linku nebo dva, které jsou super užitečné. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind je program, který pomáhá nebude ladit program, sám o sobě, 1017 00:44:00,310 --> 00:44:03,500 ale najít paměti související problémy, konkrétně. 1018 00:44:03,500 --> 00:44:07,590 To bude automaticky spustit kód si a podívejte se alespoň na dvě věci. 1019 00:44:07,590 --> 00:44:10,680 Za prvé, jsi něco náhodné, jako dotykové paměti 1020 00:44:10,680 --> 00:44:11,980 že nepatřil k vám? 1021 00:44:11,980 --> 00:44:13,590 To vám pomůže najít ty případy. 1022 00:44:13,590 --> 00:44:15,710 >> A za druhé, bude to pomůže najdete něco, co nazývá 1023 00:44:15,710 --> 00:44:19,270 úniky paměti, které máme zcela ignoroval, naivně, 1024 00:44:19,270 --> 00:44:21,380 po určitou dobu a blaženě. 1025 00:44:21,380 --> 00:44:23,140 Ale ukazuje se, vše Tentokrát, kdykoli 1026 00:44:23,140 --> 00:44:26,620 jste volali getString v tak mnoho z našich programů, 1027 00:44:26,620 --> 00:44:28,930 Ptáš se provozní systém pro paměť, 1028 00:44:28,930 --> 00:44:32,070 ale máte nějakou vzpomínku se někdy, že mu 1029 00:44:32,070 --> 00:44:36,169 zpět, dělá UNALLOC, nebo zdarma, stejně jako se tomu říká. 1030 00:44:36,169 --> 00:44:37,960 Ne, protože jsme nikdy zeptal se vás k tomu. 1031 00:44:37,960 --> 00:44:41,250 >> Ale to všechno čas, programy jsi psal v C 1032 00:44:41,250 --> 00:44:43,800 byly unikající paměti, žádá provozní 1033 00:44:43,800 --> 00:44:46,190 systém pro více a více paměť pro smyčce a kdoví co ještě, 1034 00:44:46,190 --> 00:44:47,870 ale nikdy podal ji zpátky. 1035 00:44:47,870 --> 00:44:50,080 A teď je to trochu o zjednodušující, 1036 00:44:50,080 --> 00:44:53,550 ale pokud jste někdy spustit váš Mac nebo váš počítač delší dobu, otevření 1037 00:44:53,550 --> 00:44:55,790 spousta programů, Možná zavírání programů, 1038 00:44:55,790 --> 00:44:57,795 a přestože vaše počítač Nehavarováno, 1039 00:44:57,795 --> 00:45:01,690 je to stále tak mnohem pomalejší, jako by je to opravdu 1040 00:45:01,690 --> 00:45:04,290 používat velké množství paměti nebo prostředky, i když, 1041 00:45:04,290 --> 00:45:06,070 pokud nejste ještě nedotýkejte klávesnice, 1042 00:45:06,070 --> 00:45:10,430 , které by mohly bylo-- ale ne always-- mohl být to, že programy, které používáte 1043 00:45:10,430 --> 00:45:11,920 mají sami nevracení paměti. 1044 00:45:11,920 --> 00:45:15,645 A udržet žádá OS více a více paměti, ale zapomínají na to, 1045 00:45:15,645 --> 00:45:18,470 není ve skutečnosti ji používat, ale tedy s pamětí pryč 1046 00:45:18,470 --> 00:45:20,500 z jiných programů, které by mohly chtít. 1047 00:45:20,500 --> 00:45:23,940 Tak to je obyčejné vysvětlení. 1048 00:45:23,940 --> 00:45:25,940 Tady je místo, kde je Valgrind Výstup je zcela 1049 00:45:25,940 --> 00:45:29,290 ukrutný k těm méně a pohodlnější podobně. 1050 00:45:29,290 --> 00:45:32,690 Ale zajímavé věci je právě tady. 1051 00:45:32,690 --> 00:45:37,060 To mi říká, neplatný zápis o velikost čtyři se děje v tomto programu, 1052 00:45:37,060 --> 00:45:40,640 zejména, na řádku 21 memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Když půjdu na linku 21, hm, tam opravdu je neplatný zápis o velikosti čtyři. 1054 00:45:45,450 --> 00:45:46,250 Proč velikost čtyři? 1055 00:45:46,250 --> 00:45:49,500 No, to number-- a by mohlo být anything-- je int. 1056 00:45:49,500 --> 00:45:50,450 Takže je to čtyři bajty. 1057 00:45:50,450 --> 00:45:52,550 Takže dávám čtyři bajty kde nepatří. 1058 00:45:52,550 --> 00:45:55,080 To je to, co Valgrind Je mi vlastně říká. 1059 00:45:55,080 --> 00:45:57,600 Kromě toho bude také řekni mi, jak uvidíme, 1060 00:45:57,600 --> 00:46:01,490 jak spustit to v budoucnu pset, zda a když jste unikly paměť, což ostatně 1061 00:46:01,490 --> 00:46:05,300 Mám, protože jsem volal malloc, ale já jsem ve skutečnosti 1062 00:46:05,300 --> 00:46:08,010 volal, v tomto případě zdarma, které budeme nakonec vidět 1063 00:46:08,010 --> 00:46:09,830 je opakem malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Takže teď, myslím, že konečný příklad. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Tak tohle je trochu víc tajemný, ale je to snad 1068 00:46:16,690 --> 00:46:19,180 Největší důvod být opatrný s pamětí, 1069 00:46:19,180 --> 00:46:24,490 a důvod, proč se mnoho programů a / nebo na webové servery, dokonce k tomuto dni, 1070 00:46:24,490 --> 00:46:28,200 jsou převzaty od zlých někde na internetu, kteří jsou nějakým způsobem 1071 00:46:28,200 --> 00:46:33,390 odesílání falešné pakety na server se snaží ohrozit své účty, 1072 00:46:33,390 --> 00:46:36,420 nebo se vaše data, nebo jen obecně se přes stroj. 1073 00:46:36,420 --> 00:46:38,910 Přetečení vyrovnávací paměti, jak je název napovídá, prostředek 1074 00:46:38,910 --> 00:46:40,740 přetékání ne int, ale vyrovnávací paměti. 1075 00:46:40,740 --> 00:46:43,490 A vyrovnávací paměť je jen ozdobný způsob, jak říkat, že je to banda paměti. 1076 00:46:43,490 --> 00:46:46,710 >> A skutečně, jsem zavolal řetězec před vyrovnávací paměti, namísto s. 1077 00:46:46,710 --> 00:46:49,234 Vzhledem k tomu, jestli je to buffer, jako v tom smyslu, YouTube, 1078 00:46:49,234 --> 00:46:52,400 nebo kdykoliv se díváte videa, jste mohli vidět slovo vyrovnávací paměti, 1079 00:46:52,400 --> 00:46:53,040 tečka, tečka, tečka. 1080 00:46:53,040 --> 00:46:54,240 Je to neuvěřitelně otravné. 1081 00:46:54,240 --> 00:46:55,990 A to právě znamená, že že vaše video přehrávač 1082 00:46:55,990 --> 00:46:58,710 se snaží stáhnout spoustu bajtů, spousta bytů 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 se snaží ke stažení spoustu z nich 1085 00:47:02,920 --> 00:47:06,430 vyplnit vyrovnávací paměti, nádobu, aby se máte dostatek bytů, aby se po 1086 00:47:06,430 --> 00:47:09,174 ukázat video, bez pauzy neustále. 1087 00:47:09,174 --> 00:47:11,340 Ale jak se ukázalo, je to možné mají vyrovnávací paměť k tomuto velký. 1088 00:47:11,340 --> 00:47:15,710 Ale zkuste dát tolik dat v to, a velmi špatné věci se může stát. 1089 00:47:15,710 --> 00:47:22,780 Tak například, pojďme se podívat na Tato závěrečná teaser na příklad. 1090 00:47:22,780 --> 00:47:24,720 To je další program to, že na první pohled, 1091 00:47:24,720 --> 00:47:26,540 nedělá nic extra užitečného. 1092 00:47:26,540 --> 00:47:29,590 Je tu hlavní funkci který volá tuto funkci, f. 1093 00:47:29,590 --> 00:47:36,640 A že funkce f, tady má char pole, s názvem C, velikost 12. 1094 00:47:36,640 --> 00:47:39,340 A pak je pomocí tohoto nová funkce s názvem strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Ukazuje se, že se tento jednoduchý, jednoduchý řádek kódu, jen dva řádky, 1097 00:47:45,190 --> 00:47:49,130 jsme se celý svůj program, , a proto se celý můj počítač, 1098 00:47:49,130 --> 00:47:54,000 a můj uživatelský účet, a můj pevný pohon potenciálně zranitelný vůči každému 1099 00:47:54,000 --> 00:47:58,170 kdo ví, a je dost dobré pro spuštění Tento program s určitou příkazového řádku 1100 00:47:58,170 --> 00:47:58,900 argumentem. 1101 00:47:58,900 --> 00:48:03,400 Jinými slovy, je-li to špatný člověk klade uvnitř argvargv [1] zadáním 1102 00:48:03,400 --> 00:48:08,750 na klávesnici velmi speciálně vytvořeném řetězec, není abc, 123, ale v podstatě, 1103 00:48:08,750 --> 00:48:15,180 binární symboly, které představují spustitelný kód, program, který on nebo ona napsal, 1104 00:48:15,180 --> 00:48:19,190 s tímto jednoduchým programem, který je zástupce z tisíců programů 1105 00:48:19,190 --> 00:48:23,610 které jsou stejně zranitelné, Troufám si tvrdit, on nebo ona může nakonec odstranit všechny 1106 00:48:23,610 --> 00:48:26,680 soubory na mém pevném disku, se bliká výzvu, aby on nebo ona může 1107 00:48:26,680 --> 00:48:30,170 typ příkazů na vlastní pěst, e-mailem všechny soubory pro sebe. 1108 00:48:30,170 --> 00:48:34,660 Cokoliv, co se dá dělat, když nebo si může dělat s tímto kódem. 1109 00:48:34,660 --> 00:48:36,575 >> Nebudeme zcela vyřešit ještě. 1110 00:48:36,575 --> 00:48:38,700 A ve skutečnosti, že to bude zahrnují malý obrázek 1111 00:48:38,700 --> 00:48:41,470 jako je toto, které budeme brzy pochopit, tím lépe. 1112 00:48:41,470 --> 00:48:44,480 Ale pro dnešek, pojďme končí co je, doufejme, že o něco více 1113 00:48:44,480 --> 00:48:48,360 pochopitelné XKCD vtip, dokud jsme pokračovat příště. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 V pořádku. 1116 00:48:51,600 --> 00:48:53,446 Uvidíme se ve středu. 1117 00:48:53,446 --> 00:48:54,754 >> [Přehrávání hudby] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: A teď, hluboko myšlenky, podle Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Paměť je jako skákání do hromady zlaté listy na nedělní odpoledne. 1121 00:49:04,770 --> 00:49:09,000 Foukání větru, hodil svůj hair-- oh, Stýská se mi dny when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [SMÍCH] 1124 00:49:12,650 --> 00:49:13,750